Добро пожаловать на форум, Гость, это ваша панель
  • Страница 1 из 1
  • 1
Форум Perfect Soft » Моды и AMX Скриптинг CS 1.6 » AMX Скриптинг CS 1.6 (вопрос | ответ) » Помогите сделать ограничение на покупку. (Помогите сделать ограничение на покупку.)
Помогите сделать ограничение на покупку.
Andrey
Дата: Среда, 17.07.2013, 13:38 | Сообщение # 1
офлайн

  • Сообщения: 64
  • Награды: 1
  • Замечания:
 
Помогите сделать ограничение на покупку гранаты "Conc"\
Что бы игрок мог купить эту гранату всего раз за раунд.

Код
/*
     [ZP]Extra Item: Concussion Grenade
    Copyright (C) 2009 by NiHiLaNTh

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
     
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
     
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     
    In addition, as a special exception, the author gives permission to
    link the code of this program with the Half-Life Game Engine ("HL
    Engine") and Modified Game Libraries ("MODs") developed by Valve,
    L.L.C ("Valve"). You must obey the GNU General Public License in all
    respects for all of the code used other than the HL Engine and MODs
    from Valve. If you modify this file, you may extend this exception
    to your version of the file, but you are not obligated to do so. If
    you do not wish to do so, delete this exception statement from your
    version.

    --- Introduction ---
    This plugin adds new weapon to zombie plague - concussion grenade.I took
    this idead from Team Fortress Classic.When grenade explodes it doesn't
    do any damage, but it starts to make hallucinations to players, such as
    screen shake, screen fade, recoil changes.
     
    --- CVARs ---
    zp_conc_nade_radius 500 -- Explosion radius
    zp_conc_nade_duration 7 -- Duration of hallucinations
     
    --- Credits ---
    NiHiLaNTh - Plugin
    dels - Grenade model
    MeRcyLeZZ - Some useful code parts
    xPaw / Xellath - Code optimization
     
    --- Changelog ---
    v1.0 - Initial release  
    v1.1 - Optimized code ( Thanks xPaw and Xellath )

*/

#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < fun >
#include < zombieplague >

// Plugin version
#define VERSION "1.1"

// Defines
#define MAXPLAYERS    32
#define FCVAR_FLAGS    ( FCVAR_SERVER | FCVAR_SPONLY | FCVAR_UNLOGGED )
#define OFFSET_PLAYER   41
#define OFFSET_ACTIVE   373
#define LINUX_DIFF   5
#define NADE_TYPE_CONC   pev_iuser2
//#define UNIT_SECOND   (1<<12)
#define FFADE_IN   0x0000
#define FFADE_OUT   0x0001
#define REPEAT      0.2 // Time when next screen fade/shake message is being sent
#define TASK_AFFECT   666
#define ID_AFFECT   ( taskid - TASK_AFFECT )

// Grenade cost
#define GRENADE_COST   15   

// Grenade model
new const grenade_model [ ] = "models/v_grenade_conc.mdl"

// Sounds
new const explosion_sound [ ] = "zombie_plague/concgren_blast1.wav"
new const purchase_sound [ ] = "items/gunpickup2.wav"

// Cached sprite indexes
new m_iTrail, m_iRing

// Item ID
new g_conc

// Player variable
new g_hasConc [ MAXPLAYERS + 1 ]

// Message ID's
new g_msgScreenFade, g_msgScreenShake

// CVAR pointers
new cvar_nade_radius, cvar_duration

// Precache
public plugin_precache ( )
{
    // Precache grenade models
    precache_model ( grenade_model )
     
    // Precache sounds
    precache_sound ( explosion_sound )
    precache_sound ( purchase_sound )
     
    // Precache sprites
    m_iRing = precache_model ( "sprites/shockwave.spr" )
    m_iTrail = precache_model ( "sprites/laserbeam.spr" )
}

// Plugin initialization
public plugin_init ( )
{
    // New plugin
    register_plugin ( " [ZP]Extra Item: Concussion Grenade", VERSION, "NiHiLaNTh" )
     
    // Add cvar to detect servers with this plugin
    register_cvar ( "zp_concgren_version", VERSION, FCVAR_FLAGS )
     
    // New extra item
    g_conc = zp_register_extra_item ( "Concussion Grenade", GRENADE_COST, ZP_TEAM_ZOMBIE )
     
    // Events
    register_event ( "HLTV", "Event_NewRound", "a", "1=0", "2=0" )
    register_event ( "DeathMsg", "Event_DeathMsg", "a" )
    register_event ( "CurWeapon", "Event_CurrentWeapon", "be", "1=1", "2=25" )
     
    // Forwards
    register_forward ( FM_SetModel, "fw_SetModel" )
    RegisterHam ( Ham_Think, "grenade", "fw_ThinkGrenade" )
    register_forward ( FM_CmdStart, "fw_CmdStart" )
     
    // CVARs
    cvar_nade_radius = register_cvar ( "zp_conc_nade_radius", "500" )
    cvar_duration = register_cvar ( "zp_conc_nade_duration", "7" )
     
    // Messages
    g_msgScreenShake = get_user_msgid ( "ScreenShake" )
    g_msgScreenFade = get_user_msgid ( "ScreenFade" )
}

// Someone decided to buy our an extra item
public zp_extra_item_selected ( Player, Item )
{
    // This is our grenade
    if ( Item == g_conc )
    {
       // Player already have it
       if ( g_hasConc [ Player ] )
       {
          // Notice him about that
          client_print ( Player, print_chat, " [ZP]You already have this item" )
          return ZP_PLUGIN_HANDLED
       }
       else
       {
          // Now we have grenade
          g_hasConc [ Player ] = true
           
          // Give him flashbang
          give_item ( Player, "weapon_flashbang" )
           
          // Play purchase sound
          client_cmd ( Player, "spk %s", purchase_sound )    
       }
    }
    return PLUGIN_CONTINUE
}
     
// Someone was infected    
public zp_user_infected_post ( Player, Infector )
{
    // We were affected by concussion grenade
    if ( task_exists ( Player+TASK_AFFECT ) )
       remove_task ( Player+TASK_AFFECT )
}    

// Someone were turned back to human
public zp_user_humanized_post ( Player, Survivor )
{
    // We dont' have nade anymore
    if ( g_hasConc [ Player ] )
       g_hasConc [ Player ] = false
}

// New round started
public Event_NewRound ( )
{
    // They loose conc.grenade
    arrayset ( g_hasConc, false, 33 )
        
    // And they aren't affected by conc.grenade
    remove_task ( TASK_AFFECT )    
}

// Someone died
public Event_DeathMsg ( )
{
    // Get victim
    new victim = read_data ( 2 )
     
    // He had conc.grenade
    if ( g_hasConc [ victim ] )
       g_hasConc [ victim ] = false
    else if ( task_exists ( victim+TASK_AFFECT ) ) // We were affected
       remove_task ( victim+TASK_AFFECT )
}

// Current weapon player is holding
public Event_CurrentWeapon ( Player )
{
    // Dead or not zombie
    if ( !is_user_alive ( Player ) || !zp_get_user_zombie ( Player ) )
       return PLUGIN_CONTINUE
     
    // Replace flashbang model with our
    set_pev ( Player, pev_viewmodel2, grenade_model )
     
    return PLUGIN_CONTINUE
}

// Set model
public fw_SetModel ( Entity, const Model [ ] )
{
    // Prevent invalid ent messages
    if ( !pev_valid ( Entity ) )
       return  
        
    // Grenade not thrown yet    
    if ( pev ( Entity, pev_dmgtime ) == 0.0 )
       return  
        
    // We are throwing concussion grenade    
    if ( g_hasConc [ pev ( Entity, pev_owner ) ] && equal ( Model [7 ], "w_fl", 4 ) )
    {
       //Draw trail
       message_begin ( MSG_BROADCAST, SVC_TEMPENTITY )
       write_byte ( TE_BEAMFOLLOW ) // Temp entity ID
       write_short ( Entity ) // Entity to follow
       write_short ( m_iTrail ) // Sprite index
       write_byte ( 10 ) // Life
       write_byte ( 10 ) // Line width
       write_byte ( 255 ) // Red amount
       write_byte ( 255 ) // Blue amount
       write_byte ( 0 ) // Blue amount
       write_byte ( 255 ) // Alpha
       message_end ( )
        
       // Set grenade entity
       set_pev ( Entity, pev_flTimeStepSound, NADE_TYPE_CONC )
    }
}

// Grenade is getting to explode
public fw_ThinkGrenade ( Entity )
{
    // Prevent invalid ent messages
    if ( !pev_valid ( Entity ) )
       return HAM_IGNORED
     
    // Get damage time
    static Float:dmg_time
    pev ( Entity, pev_dmgtime, dmg_time )
     
    // maybe it is time to go off
    if ( dmg_time > get_gametime ( ) )
       return HAM_IGNORED
        
    // Our grenade    
    if ( pev ( Entity, pev_flTimeStepSound ) == NADE_TYPE_CONC )
    {
       // Force to explode
       concussion_explode ( Entity )
       return HAM_SUPERCEDE
    }
    return HAM_IGNORED
}

// Command start
public fw_CmdStart ( Player, UC_Handle, Seed )
{
    // Dead, zombie or not affected
    if ( !is_user_alive ( Player ) || zp_get_user_zombie ( Player ) || !task_exists ( Player+TASK_AFFECT ) )
       return FMRES_IGNORED
     
    // Get buttons
    new buttons = get_uc ( UC_Handle, UC_Buttons )
     
    // We are firing
    if ( buttons & IN_ATTACK )
    {
       // We are holding an active weapon
       if ( get_pdata_cbase ( Player, OFFSET_ACTIVE, LINUX_DIFF ) )
       {
          // New recoil
          set_pev ( Player, pev_punchangle, Float:{3.0, 3.0, 4.0} )
       }
    }
    return FMRES_HANDLED
}
           

// Grenade explode
public concussion_explode ( Entity )
{
    // Invalid entity ?
    if ( !pev_valid ( Entity  ) )
       return
     
    // Get entities origin
    static Float:origin [ 3 ]
    pev ( Entity, pev_origin, origin )
     
    // Draw ring
    UTIL_DrawRing (origin )
     
    // Explosion sound
    emit_sound ( Entity, CHAN_WEAPON, explosion_sound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
     
    // Collisions
    static victim  
    victim = -1
     
    // Find radius
    static Float:radius
    radius = get_pcvar_float ( cvar_nade_radius )
     
    // Find all players in a radius
    while ( ( victim = engfunc ( EngFunc_FindEntityInSphere, victim, origin, radius ) ) != 0 )
    {
       // Dead or zombie
       if ( !is_user_alive ( victim ) || zp_get_user_zombie ( victim ) )
          continue
           
       // Victim isn't affected yet    
       if ( !task_exists ( victim+TASK_AFFECT ) )  
       {
          // Get duration
          new duration = get_pcvar_num ( cvar_duration )
           
          // Calculate affect times
          new affect_count = floatround ( duration / REPEAT )
           
          // Continiously affect them
          set_task ( REPEAT, "affect_victim", victim+TASK_AFFECT, _, _, "a", affect_count )
       }
    }
     
    // Remove entity from ground
    engfunc ( EngFunc_RemoveEntity, Entity )
     
    // We dont' have grenade anymore
    g_hasConc [ pev ( Entity, pev_owner ) ] = false
}

// We are going to affect you
public affect_victim ( taskid )
{
    // Dead
    if ( !is_user_alive ( ID_AFFECT ) )
       return
        
    // Make a screen fade
    message_begin ( MSG_ONE_UNRELIABLE, g_msgScreenFade, {0,0,0}, ID_AFFECT )
    write_short ( 1<<13 ) // Duration
    write_short ( 1<<14 ) // Hold Time
    write_short ( FFADE_IN ) // Fade type
    write_byte ( random_num ( 50, 200 ) ) // Red amount
    write_byte ( random_num ( 50, 200 ) ) // Green amount
    write_byte ( random_num ( 50, 200 ) ) // Blue amount
    write_byte ( random_num ( 50, 200 ) ) // Alpha
    message_end ( )
        
    // Make a screen shake
    message_begin ( MSG_ONE_UNRELIABLE, g_msgScreenShake, {0,0,0}, ID_AFFECT )
    write_short ( 0xFFFF ) // Amplitude
    write_short ( 1<<13 ) // Duration
    write_short ( 0xFFFF ) // Frequency
    message_end ( )
}

// Draw explosion ring ( from zombie_plague40.sma )
stock UTIL_DrawRing ( const Float:origin [ 3 ] )
{
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
    write_byte(TE_BEAMCYLINDER) // TE id
    engfunc(EngFunc_WriteCoord, origin[0]) // x
    engfunc(EngFunc_WriteCoord, origin[1]) // y
    engfunc(EngFunc_WriteCoord, origin[2]) // z
    engfunc(EngFunc_WriteCoord, origin[0]) // x axis
    engfunc(EngFunc_WriteCoord, origin[1]) // y axis
    engfunc(EngFunc_WriteCoord, origin[2]+555.0) // z axis
    write_short( m_iRing ) // sprite
    write_byte(0) // startframe
    write_byte(0) // framerate
    write_byte(4) // life
    write_byte(60) // width
    write_byte(0) // noise
    write_byte(200) // red
    write_byte(200) // green
    write_byte(200) // blue
    write_byte(200) // brightness
    write_byte(0) // speed
    message_end()
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/
 
493284988936
Дата: Понедельник, 22.07.2013, 20:27 | Сообщение # 2
офлайн

  • Сообщения: 73
  • Награды: 2
  • Замечания:
 
В самое начало
new block[33]

Свою заменяй на эту
public zp_extra_item_selected ( Player, Item )
{
if(block [Player]== 1)
{
return PLUGIN_HANDLED
}else{
// This is our grenade
if ( Item == g_conc )
{
// Player already have it
if ( g_hasConc [ Player ] )
{
// Notice him about that
client_print ( Player, print_chat, " [ZP]You already have this item" )
return ZP_PLUGIN_HANDLED
}
else
{
// Now we have grenade
g_hasConc [ Player ] = true

// Give him flashbang
give_item ( Player, "weapon_flashbang" )

// Play purchase sound
client_cmd ( Player, "spk %s", purchase_sound )
}
}
}
return PLUGIN_CONTINUE
}

Тоже заменяй
public Event_NewRound ( )  {     // They loose conc.grenade     arrayset ( g_hasConc, false, 33 )              // And they aren't affected by conc.grenade     remove_task ( TASK_AFFECT )
for(new id = 1;id <= get_maxplayers(); id++)
{
block [id]= 0
}
}


Сёрф сборка http://perfect-soft.su/forum/14-1998-1
Skype: swimup-pro


Сообщение отредактировал 493284988936 - Понедельник, 22.07.2013, 20:27
 
Форум Perfect Soft » Моды и AMX Скриптинг CS 1.6 » AMX Скриптинг CS 1.6 (вопрос | ответ) » Помогите сделать ограничение на покупку. (Помогите сделать ограничение на покупку.)
  • Страница 1 из 1
  • 1
Поиск: