Иммунитет на другую флаг amx

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >

#define PLUGIN         «[All mod] Grab»
#define VERSION        «2.1»
#define AUTHOR        «Ian Cammarata / Opo4uMapy»

// Options
#define ADMIN         ADMIN_LEVEL_F         //Флаг админа
#define ADMIN_IMMUN   ADMIN_LEVEL_H         //Флаг админа с иммунитетом
#define RESON_KICK    «Kick by plugin grab»     //Причина кика
#define GRAB_MENU    //Открывать меню граба или нет. Если нет сделайте так //#define GRAB_MENU (Стандартно открыто)

#define JB_PREFIX    «!y[ !gГраб !y]»

enum //Цвет граба
{
r = 0.0,     //Red
g = 0.0,     //Green
b = 255.0,    //Blue

a = 200.0    //Alpha
};
//
new const Menu[][] =
{
«»,
«MENU_1»,
«MENU_2»,
«MENU_3»,
«MENU_4»,
«MENU_5»,
«MENU_6»,
«MENU_7»
};

#define TSK_CHKE 50

#define SF_FADEOUT 0

new client_data[33][4]
#define GRABBED  0
#define GRABBER  1
#define GRAB_LEN 2
#define FLAGS    3

#define CDF_IN_PUSH   (1<<0)
#define CDF_IN_PULL   (1<<1)
#define CDF_NO_CHOKE  (1<<2)

//Cvar Pointers
new p_enabled, p_players_only
new p_throw_force, p_min_dist, p_speed, p_grab_force
new p_choke_time, p_choke_dmg, p_auto_choke
new p_glow
new speed_off[33]
//Pseudo Constants
new MAXPLAYERS
new SVC_SCREENSHAKE, SVC_SCREENFADE, WTF_DAMAGE
new name[32]
new name2[32]

public plugin_init( )
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event(«CurWeapon», «CurrentWeapon», «be», «1=1»)
RegisterHam(Ham_Spawn, «player», «SpawnPlayer»)

p_enabled = register_cvar( «gp_enabled», «1» )
p_players_only = register_cvar( «gp_players_only», «0» )

p_min_dist = register_cvar ( «gp_min_dist», «90» )
p_throw_force = register_cvar( «gp_throw_force», «1500» )
p_grab_force = register_cvar( «gp_grab_force», «8» )
p_speed = register_cvar( «gp_speed», «5» )

p_choke_time = register_cvar( «gp_choke_time», «1.5» )
p_choke_dmg = register_cvar( «gp_choke_dmg», «5» )
p_auto_choke = register_cvar( «gp_auto_choke», «1» )

p_glow = register_cvar( «gp_glow», «1» )

register_clcmd( «amx_grab», «force_grab», ADMIN, «Grab client & teleport to you.» )
register_clcmd( «+grab», «grab», ADMIN, «bind a key to +bub_grab» )
register_clcmd( «-grab», «unset_grabbed» )

register_clcmd( «+push», «push», ADMIN, «bind a key to +bub_push» )
register_clcmd( «-push», «push» )
register_clcmd( «+pull», «pull», ADMIN, «bind a key to +bub_pull» )
register_clcmd( «-pull», «pull» )
register_clcmd( «push», «push2» )
register_clcmd( «pull», «pull2» )

register_clcmd( «drop» ,»throw» )

register_event( «DeathMsg», «DeathMsg», «a» )

register_forward( FM_PlayerPreThink, «fm_player_prethink» )

register_dictionary( «grab_plus.txt» )

MAXPLAYERS = get_maxplayers()

SVC_SCREENFADE = get_user_msgid( «ScreenFade» )
SVC_SCREENSHAKE = get_user_msgid( «ScreenShake» )
WTF_DAMAGE = get_user_msgid( «Damage» )

register_dictionary(«grab_new.txt»);
}

public plugin_precache( )
precache_sound( «player/PL_PAIN2.WAV» )

public fm_player_prethink( id )
{
new target
get_user_name(target, name, 32)
get_user_name(id, name2, 32)
//Search for a target
if ( client_data[id][GRABBED] == -1 )
{
   new Float:orig[3], Float:ret[3]
   get_view_pos( id, orig )
   ret = vel_by_aim( id, 9999 )
   
   ret[0] += orig[0]
   ret[1] += orig[1]
   ret[2] += orig[2]
   
   target = traceline( orig, ret, id, ret )
   
   if( 0 < target <= MAXPLAYERS )
   {
      if( is_grabbed( target, id ) ) return FMRES_IGNORED
      
      get_user_name(target, name, 32)
      get_user_name(id, name2, 32)

      if(get_user_flags(id) & ADMIN_IMMUN)
      {
         ChatColor(id, «%s !g%s !teamИмеет иммунитет», JB_PREFIX, name)
         ChatColor(target, «%s !g%s !teamПытался взять вас !gГрабом», JB_PREFIX, name2)
      }
      else
      set_grabbed( id, target )
   }
   else if( !get_pcvar_num( p_players_only ) )
   {
      new movetype
      if( target && pev_valid( target ) )
      {
         movetype = pev( target, pev_movetype )
         if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
            return FMRES_IGNORED
         }
         else
         {
            target = 0
            new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
            while( !target && ent > 0 )
            {
               movetype = pev( ent, pev_movetype )
               if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
               && ent != id  )
               target = ent
               ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
            }
         }
      if( target )
         {
            if( is_grabbed( target, id ) )
               return FMRES_IGNORED
            
            get_user_name(target, name, 32)
            get_user_name(id, name2, 32)
            
            if(get_user_flags(id) & ADMIN_IMMUN)
            {
               ChatColor(id, «%s !g%s !teamИмеет иммунитет», JB_PREFIX, name)
               ChatColor(target, «%s !g%s !teamПытался взять вас !gГрабом», JB_PREFIX, name2)
            }
            else
            set_grabbed( id, target )
            
         }
      }
   }
   
target = client_data[id][GRABBED]
//If they’ve grabbed something
if( target > 0 )
   {
      if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
      {
         unset_grabbed( id )
         return FMRES_IGNORED
      }
      
      //Use key choke
      if( pev( id, pev_button ) & IN_USE )
         do_choke( id )
      
      //Push and pull
      new cdf = client_data[id][FLAGS]
      if ( cdf & CDF_IN_PULL )
         do_pull( id )
      else if ( cdf & CDF_IN_PUSH )
         do_push( id )
      
      if( target > MAXPLAYERS ) grab_think( id )
   }
   
//If they’re grabbed
target = client_data[id][GRABBER]
if( target > 0 ) grab_think( target )
   
return FMRES_IGNORED
}

public grab_think( id ) //id of the grabber
{
   new target = client_data[id][GRABBED]
   
   //Keep grabbed clients from sticking to ladders
   if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, «+jump;wait;-jump» )
   
   //Move targeted client
   new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
   
   get_view_pos( id, tmpvec )
   
   tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
   
   torig = get_target_origin_f( target )
   
   new force = get_pcvar_num( p_grab_force )
   
   tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) — torig[0] ) * force
   tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) — torig[1] ) * force
   tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) — torig[2] ) * force
   
   set_pev( target, pev_velocity, tvel )
}

stock Float:get_target_origin_f( id )
{
   new Float:orig[3]
   pev( id, pev_origin, orig )
   
   //If grabbed is not a player, move origin to center
   if( id > MAXPLAYERS )
   {
      new Float:mins[3], Float:maxs[3]
      pev( id, pev_mins, mins )
      pev( id, pev_maxs, maxs )
      
      if( !mins[2] ) orig[2] += maxs[2] / 2
   }
   
   return orig
}

public grab( id, level, cid )
{
   if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
   
   if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
   
   return PLUGIN_HANDLED
}

public SpawnPlayer(id)
   speed_off[id] = false

public CurrentWeapon(id)
{
   if(speed_off[id])
      set_pev(id, pev_maxspeed, 00000.0)
}

public grab_menu(id)
{
   new name[32]
   new target = client_data[id][GRABBED]
   if(target && is_user_alive(target))
   {
      get_user_name(target, name, charsmax(name))
   }
   new Item[512], Str[10], menu;
   
   formatex(Item, charsmax(Item), «%L», id, «MENU_NAME», name);
   menu = menu_create(Item, «menu_handler»)
   
   for(new i = 1; i <= charsmax(Menu); i++)
   {
      num_to_str(i, Str, charsmax(Str));
      
      formatex(Item, charsmax(Item), «%L», id, Menu[i]);
      menu_additem(menu, Item, Str, 0);
   }
   formatex(Item, charsmax(Item), «%L», id, «MENU_EXIT»);
   menu_setprop(menu, MPROP_EXITNAME, Item);
   
   menu_display(id, menu, 0);
   
   return PLUGIN_HANDLED;
}

public menu_handler(id, menu, item)
{
   if(item == MENU_EXIT)
   {
      menu_destroy(menu)
      return PLUGIN_HANDLED
   }
   
   new data[6], iName[64], access, callback
   menu_item_getinfo(menu, item, access, data, 5, iName, 63, callback)
   
   new key = str_to_num(data)
   new target = client_data[id][GRABBED]
   
   switch(key)
   {
      case 1:
      {
         if(target && is_user_alive(target))
         {
            server_cmd(«kick #%d ^»%s^»», get_user_userid(target), RESON_KICK)
         }
      }
      case 2:
      {
         if(target && is_user_alive(target))
         {
            user_kill(target)
         }
      }
      case 3:
      {
         if(target && is_user_alive(target))
         {
            fm_strip_user_weapons(target)
            fm_give_item(target, «weapon_knife»)
         }
      }
      case 4:
      {
         if(target && is_user_alive(target))
         {
            set_pev(target, pev_maxspeed, 00000.0)
            speed_off[target] = true
         }
      }
      case 5:
      {
         if(target && is_user_alive(target))
         {
            set_pev(target, pev_maxspeed, 240.0)
            speed_off[target] = false
         }
      }
      case 6:
      {
         if(target && is_user_alive(target))
         {
            set_pev(target, pev_health, 1.0)
         }
      }
      case 7:
      {
         if(target && is_user_alive(target))
         {
            set_pev(target, pev_punchangle, { 400.0, 999.0, 400.0 })
         }
      }
   }
   return PLUGIN_HANDLED
}

Читайте также:  Народные рецепты как помочь иммунитету ребенка

public throw( id )
{
   new target = client_data[id][GRABBED]
   if( target > 0 )
   {
      set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
      unset_grabbed( id )
      return PLUGIN_HANDLED
   }
   
   return PLUGIN_CONTINUE
}

public unset_grabbed( id )
{
   new target = client_data[id][GRABBED]
   if( target > 0 && pev_valid( target ) )
   {
      set_pev( target, pev_renderfx, kRenderFxNone )
      set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
      set_pev( target, pev_rendermode, kRenderNormal )
      set_pev( target, pev_renderamt, 16.0 )
      
      if( 0 < target <= MAXPLAYERS )
         client_data[target][GRABBER] = 0
   }
   show_menu(id, 0, «^n», 1)
   client_data[id][GRABBED] = 0
}

//Grabs onto someone
public set_grabbed( id, target )
{
   if( get_pcvar_num( p_glow ) )
   {
      set_pev( target, pev_renderfx, kRenderFxGlowShell )
      set_pev( target, pev_rendercolor, {r, g, b})
      set_pev( target, pev_rendermode, kRenderTransColor )
      set_pev( target, pev_renderamt, a )
   }
   
   if( 0 < target <= MAXPLAYERS )
      client_data[target][GRABBER] = id
   client_data[id][FLAGS] = 0
   client_data[id][GRABBED] = target
   new name[33], name2[33]
   get_user_name(id, name, 32)
   get_user_name(target, name2, 32)
   if(get_user_team(target)==1 || get_user_team(target)==2)
   {
      ChatColor(target, «%L», target, «CHAT_1», name) 
      ChatColor(id, «%L», id, «CHAT_2», name2)
      #if defined GRAB_MENU
      grab_menu(id)
      #endif
   }
   else
   {
      ChatColor(id, «%L», id, «CHAT_3») 
   }
   new Float:torig[3], Float:orig[3]
   pev( target, pev_origin, torig )
   pev( id, pev_origin, orig )
   client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
   if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
}

public push( id )
{
   client_data[id][FLAGS] ^= CDF_IN_PUSH
   return PLUGIN_HANDLED
}

public pull( id )
{
   client_data[id][FLAGS] ^= CDF_IN_PULL
   return PLUGIN_HANDLED
}

public push2( id )
{
   if( client_data[id][GRABBED] > 0 )
   {
      do_push( id )
      return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}

public pull2( id )
{
   if( client_data[id][GRABBED] > 0 )
   {
      do_pull( id )
      return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}

public do_push( id )
   if( client_data[id][GRAB_LEN] < 9999 )
   client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )

public do_pull( id )
{
   new mindist = get_pcvar_num( p_min_dist )
   new len = client_data[id][GRAB_LEN]
   
   if( len > mindist )
   {
      len -= get_pcvar_num( p_speed )
      if( len < mindist ) len = mindist
      client_data[id][GRAB_LEN] = len
   }
   else if( get_pcvar_num( p_auto_choke ) )
      do_choke( id )
}

public do_choke( id )
{
   new target = client_data[id][GRABBED]
   if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
   
   new dmg = get_pcvar_num( p_choke_dmg )
   new vec[3]
   FVecIVec( get_target_origin_f( target ), vec )
   
   message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
   write_short( 999999 ) //amount
   write_short( 9999 ) //duration
   write_short( 999 ) //frequency
   message_end( )
   
   message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
   write_short( 9999 ) //duration
   write_short( 100 ) //hold
   write_short( SF_FADE_MODULATE ) //flags
   write_byte( 200 ) //r
   write_byte( 0 ) //g
   write_byte( 0 ) //b
   write_byte( 200 ) //a
   message_end( )
   
   message_begin( MSG_ONE, WTF_DAMAGE, _, target )
   write_byte( 0 ) //damage armor
   write_byte( dmg ) //damage health
   write_long( DMG_CRUSH ) //damage type
   write_coord( vec[0] ) //origin[x]
   write_coord( vec[1] ) //origin[y]
   write_coord( vec[2] ) //origin[z]
   message_end( )
   
   message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
   write_byte( TE_BLOODSTREAM )
   write_coord( vec[0] ) //pos.x
   write_coord( vec[1] ) //pos.y
   write_coord( vec[2] + 15 ) //pos.z
   write_coord( random_num( 0, 255 ) ) //vec.x
   write_coord( random_num( 0, 255 ) ) //vec.y
   write_coord( random_num( 0, 255 ) ) //vec.z
   write_byte( 70 ) //col index
   write_byte( random_num( 50, 250 ) ) //speed
   message_end( )
   
   new health = pev( target, pev_health ) — dmg
   set_pev( target, pev_health, float( health ) )
   if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
   
   emit_sound( target, CHAN_BODY, «player/PL_PAIN2.WAV», VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
   
   client_data[id][FLAGS] ^= CDF_NO_CHOKE
   set_task( get_pcvar_float( p_choke_time ), «clear_no_choke», TSK_CHKE + id )
}

public clear_no_choke( tskid )
{
   new id = tskid — TSK_CHKE
   client_data[id][FLAGS] ^= CDF_NO_CHOKE
}

//Grabs the client and teleports them to the admin
public force_grab(id, level, cid)
{
   if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
   
   new arg[33]
   read_argv( 1, arg, 32 )
   
   new targetid = cmd_target( id, arg, 1 )
   
   if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
   if( !is_user_alive( targetid ) )
   {
      return PLUGIN_HANDLED
   }
   
   //Safe to tp target to aim spot?
   new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
   new bool:safe = false, i
   
   get_view_pos( id, orig )
   tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
   
   for( new j = 1; j < 11 && !safe; j++ )
   {
      torig[0] = orig[0] + tmpvec[i] * j
      torig[1] = orig[1] + tmpvec[i] * j
      torig[2] = orig[2] + tmpvec[i] * j
      
      traceline( tmpvec, torig, id, trace_ret )
      
      if( get_distance_f( trace_ret, torig ) ) break
      
      engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
      if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
         safe = true
   }
   
   //Still not safe? Then find another safe spot somewhere around the grabber
   pev( id, pev_origin, orig )
   new try[3]
   orig[2] += 2
   while( try[2] < 3 && !safe )
   {
      for( i = 0; i < 3; i++ )
         switch( try[i] )
      {
         case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
            case 1 : torig[i] = orig[i]
            case 2 : torig[i] = orig[i] — ( i == 2 ? 80 : 40 )
         }
      
      traceline( tmpvec, torig, id, trace_ret )
      
      engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
      if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
      && !get_distance_f( trace_ret, torig ) ) safe = true
      
      try[0]++
      if( try[0] == 3 )
      {
         try[0] = 0
         try[1]++
         if( try[1] == 3 )
         {
            try[1] = 0
            try[2]++
         }
      }
   }
   
   get_user_name(targetid, name, 32)
   get_user_name(id, name2, 32)
   if( safe )
   {
      set_pev( targetid, pev_origin, torig )
      set_grabbed( id, targetid )
   }
   
   return PLUGIN_HANDLED
}

public is_grabbed( target, grabber )
{
   for( new i = 1; i <= MAXPLAYERS; i++ )
      if( client_data[i][GRABBED] == target )
   {
      unset_grabbed( grabber )
      return true
   }
   return false
}

public DeathMsg( )
   kill_grab( read_data( 2 ) )

public client_disconnect( id )
{
   kill_grab( id )
   speed_off[id] = false
   return PLUGIN_CONTINUE
}

public kill_grab( id )
{
   //If given client has grabbed, or has a grabber, unset it
   if( client_data[id][GRABBED] )
      unset_grabbed( id )
   else if( client_data[id][GRABBER] )
      unset_grabbed( client_data[id][GRABBER] )
}

stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
{
   engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
   get_tr2( 0, TR_vecEndPos, vHitPos )
   return get_tr2( 0, TR_pHit )
}

stock get_view_pos( const id, Float:vViewPos[3] )
{
   new Float:vOfs[3]
   pev( id, pev_origin, vViewPos )
   pev( id, pev_view_ofs, vOfs )       
   
   vViewPos[0] += vOfs[0]
   vViewPos[1] += vOfs[1]
   vViewPos[2] += vOfs[2]
}

stock Float:vel_by_aim( id, speed = 1 )
{
   new Float:v1[3], Float:vBlah[3]
   pev( id, pev_v_angle, v1 )
   engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
   
   v1[0] *= speed
   v1[1] *= speed
   v1[2] *= speed
   
   return v1
}
stock fm_give_item(index, const item[])
{
   if (!equal(item, «weapon_», 7) && !equal(item, «ammo_», 5) && !equal(item, «item_», 5) && !equal(item, «tf_weapon_», 10))
      return 0
   
   new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
   if (!pev_valid(ent))
      return 0
   
   new Float:origin[3];
   pev(index, pev_origin, origin)
   set_pev(ent, pev_origin, origin)
   set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
   dllfunc(DLLFunc_Spawn, ent)
   
   new save = pev(ent, pev_solid)
   dllfunc(DLLFunc_Touch, ent, index)
   if (pev(ent, pev_solid) != save)
      return ent
   
   engfunc(EngFunc_RemoveEntity, ent)
   
   return -1
}

stock fm_strip_user_weapons(id)
{
   static ent
   ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, «player_weaponstrip»))
   if (!pev_valid(ent)) return;
   
   dllfunc(DLLFunc_Spawn, ent)
   dllfunc(DLLFunc_Use, ent, id)
   engfunc(EngFunc_RemoveEntity, ent)
}

stock ChatColor(const id, const input[], any:…)
{
   new count = 1, players[32];
   static msg[191];
   vformat(msg, 190, input, 3);
   
   replace_all(msg, 190, «!g», «^4»);
   replace_all(msg, 190, «!y», «^1»);
   replace_all(msg, 190, «!team», «^3»);
   
   if (id) players[0] = id; else get_players(players, count, «ch»);
   {
      for (new i = 0; i < count; i++)
      {
         if (is_user_connected(players[i]))
         {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid(«SayText»), _, players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
         }
      }
   }
}

Читайте также:  Смесь для повышения иммунитета грецкий орех мед

Источник

Иммунитет на другую флаг amx

shel писал(а): Yopta, za bazar otvechau, skazal v sosedneu teme tupo vukladuvayte odobru a teper zadnuu podrybul? Tak delo ne poydet, bablo na stol yoba

Иммунитет в плагине!

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела «Болтовня».
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Иммунитет в плагине!

Прошу Вас добавить в этот плагин имуну для админов!
Заранее спасибо!

#define MIN_AFK_TIME 30 // I use this incase stupid admins accidentally set mp_afktime to something silly.
#define WARNING_TIME 15 // Start warning the user this many seconds before they are about to be kicked.
#define CHECK_FREQ 5 // This is also the warning message frequency.

new g_oldangles[33][3]new g_afktime[33]new bool:g_spawned[33] =

public plugin_init() register_plugin(«AFK Kicker»,»1.0b»,»Cheesy Peteza»)
register_cvar(«afk_version», «1.0b», FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY)

register_cvar(«mp_afktime», «45») // Kick people AFK longer than this time
register_cvar(«mp_afkminplayers», «1») // Only kick AFKs when there is atleast this many players on the server
set_task(float(CHECK_FREQ),»checkPlayers»,_,_,_,»b»)
register_event(«ResetHUD», «playerSpawned», «be»)
>

public checkPlayers() for (new i = 1; i = minplayers) new maxafktime = get_cvar_num(«mp_afktime»)
if (maxafktime maxafktime) new name[32]
get_user_name(id, name, 31)
PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, «!g[VZ18]!y Игрок !t%s!y был кикнут. Причина: !gAFK», name, maxafktime)
log_amx(«%s was kicked for being AFK longer than %i seconds», name, maxafktime)
server_cmd(«kick #%d ^»Причина: AFK^»», get_user_userid(id), maxafktime)
>
>
>

public client_connect(id) g_afktime[ > return PLUGIN_HANDLED
>

public client_putinserver(id) g_afktime[ > return PLUGIN_HANDLED
>

public playerSpawned(id) g_spawned[ > new sid[1]
s > set_task(0.75, «delayedSpawn»,_, sid, 1) // Give the player time to drop to the floor when spawning
return PLUGIN_HANDLED
>

public delayedSpawn(sid[]) get_user_origin(sid[0], g_oldangles[sid[0]])
g_spawned[s > return PLUGIN_HANDLED
>[/spoiler]

источник

contra.net.ua

Сайт посвящен культовой игре – Counter-Strike 1.6

Сайт посвящен культовой игре – Counter-Strike 1.6

Наши сервера CS 1.6

Графики загрузки серверов

cs.contra.net.ua:27021

Флаги доступа – как для users.ini, так и для всех версий amxbans и им подобным скриптам управления сервером.

a – этот флаг дает иммунитет (против человека с флагом а не могут быть использованы серверные команды kick, ban, slay, slap, он не может быть выкинут за флуд, за высокий пинг и так далее).
b – резервация слота, обычно дают уважаемым игрокам сервера.
c – amx_kick – доступ к команде amx_kick. Дает возможность кикать игроков.
d – amx_ban and amx_unban commands – доступ к команде amx_ban и amx_unban. Соответственно админ имеет возможность как ставить так и снимать баны.
e – amx_slay and amx_slap commands – флаг дает доступ к командам amx_slay и amx_slap. Убить игрока или “подергать” игрока в воздухе.
f – amx_map command – админ имеет доступ к команде amx_map – смена карты на сервере.
g – amx_cvar command – доступ к команде amx_cvar, менять переменные и настройки сервера (не все переменные могут быть доступны). Очень не советую давай этот доступ каждому встречному. Только проверенным людям!
h – amx_cfg command – флаг дает доступ к команде серверных настроек amx_cfg. Давать только проверенным людям!
i – amx_chat and other chat commands – доступ к команде amx_csay, администраторскому чату и другим командам, имеющим отношение к чату.
j – amx_vote and other vote commands – дает админу доступ к командам голосования, и команде amx_vote.k – access to sv_password cvar – доступ к серверной переменной sv_password (работает через команду amx_cvar). Этот флаг так же ставим исключительно проверенным админам.
l – access to amx_rcon command and rcon_password cvar – доступ к переменной RCON пароля amx_rcon и rcon_password (через команду amx_cvar). Управление паролем RCON – этот флаг не давать никому вообще кроме владельца сервера!
m – произвольный уровень доступа A (если на вашем сервере стоят какие-то нестандартные плагины amx, которые требуют эти уровни доступа)
n – произвольный уровень доступа B
o – произвольный уровень доступа C
p – произвольный уровень доступа D
q – произвольный уровень доступа E
r – произвольный уровень доступа F
s – произвольный уровень доступа G
t – произвольный уровень доступа H
u – админ получает доступ к меню управления amxmodmenu
z – флаг обычного пользователя (который не является админом)

Флаги аккаунта – проверка на доступ с определенного IP адреса или с определенным логином. Например флаги de – означают что права прописаны на IP адрес и пароль не проверяется (идентификация только по IP).
a – флаг не пускает на сервер игрока с неправильно введенным паролем (setinfo _pw пароль)
b – регистрация клан тега
c – администратор зайдет на сервер исключительно со значениями authid/wonid
d – администратор заходит только с этого ip адресса
e – пароль не проверяется (необходимо только совпадение name/ip/wonid)

Сам файл users.ini находится в папке

Что нужно знать игроку/администратору?
Настройка переменной пароля для доступа прописывается просто. В консоли сервера либо у себя в файле autoexec.cfg пропишите строчку
setinfo _pw “тут ваш пароль”

Вместо _pw может быть любое значение amx_password_field из файла amxx.cfg

Формат администраторского аккаунта:

или по-русски это будет так:

Пример администраторских аккаунтов:
; тут мы видим как прописывается аккаунт если у человека есть STEAM
“STEAM_0:0:123456” “” “abcdefghijklmnopqrstu” “ce”
; а здесь – прописка на IP
“123.45.67.89” “” “abcdefghijklmnopqrstu” “de”
; а тут – на логин/пароль
“My Name” “my_password” “abcdefghijklmnopqrstu” “a”

источник

Иммунитет на другую флаг amx

Решил сегодня написать для вас очень важную памятку, которая пригодится любому администратору игрового сервера Counter-Strike 1.6. Я собрал все флаги доступа к админке и подробно пояснил каждый из них. Читайте эту информацию очень внимательно, ведь от грамотной настройки игрового сервера CS 1.6 и администраторских прав к нему зависит и работа сервера в целом.

Данный флаги доступа актуальны и для файла users.ini, и для всех систем администрирования и управления игровым сервером (таких как amxbans и им подобные). То есть, если вы поймете принцип назначения флагов доступа, вы сможете работать с какой угодно системой.

a — данный флаг доступа дает для игроков и администраторов иммунитет (против такого игрока нельзя использовать никакие серверные команды, такие как ban, kick, slap, slay и все остальные, такого игрока нельзя выкинуть, например, за высокий пинг или флуд).
b — флаг для резервации слота. Можно дать и админу, и уважаемому игроку.
c — флаг дает доступ к команде amx_kick, с помощью которой можно кикать игроков с сервера.
d — доступы к очень важным командам amx_ban и amx_unban. Дают возможность как банить игроков, так и снимать им баны.
e — а это доступ к серверным командам amx_slay и amx_slap. Команды не особо важные, первая — убьет игрока, вторая — пнет его, да так, что игрок будет подпрыгивать от каждого пинка этой командой.
f — флаг дает доступ к очень важной команде amx_map, с помощью которой можно поменять карту на сервере. Рекомендую давать букву f только опытным администраторам, чтобы новички не меняли карту каждые пять минут.
g — а это очень важный флаг — доступ к серверной команде amx_cvar, которая дает возможность вносить изменения в настройки вашего игрового сервера, его переменные. Эту букву советую выдавать исключительно вашему другу, с которым вы держите сервер или вообще не давать никому.
h — amx_cfg — команда, как и предыдущая, отвечает за настройки сервера. Ее так же не нужно никому давать, за исключением вашего компаньона.
i — флаг дает доступ к командам amx_chat и amx_csay, а так же остальным командам, относящимся к игровому чату и цветным текстовым надписям, которые видны игрокам.
j — эта буква даст администратору доступ к команде amx_vote (голосование) и ко всем другим командам голосования.
k — флаг дает доступ к переменной sv_password (которая работает через amx_cvar). Позволяет устанавливать и менять пароль доступа на игровой сервер. Никому не давайте этот флаг, только себе!
l — эта буква даст доступ к команде amx_rcon и соответственно к RCON, с помощью которого можно управлять всем сервером. А так же к команде rcon_password, с помощью которой можно управлять RCON паролем. Надеюсь, вы поняли, что давать это флаг можно только себе и самому лучшему и проверенному другу ????
m — свободный флаг для произвольного доступа A. Объясню что это значит. Есть некоторые плагины для amxx, которые требуют какой-то произвольный уровень доступа. Вот каждый из таких плагинов можно «посадить» на все это уровни. Как это и те флаги, что будут описаны ниже.
n — свободный флаг произвольного уровня доступа B.
o — свободный флаг произвольного уровня доступа C.
p — свободный флаг произвольного уровня доступа D.
q — свободный флаг произвольного уровня доступа E.
r — свободный флаг произвольного уровня доступа F.
s — свободный флаг произвольного уровня доступа G.
t — свободный флаг произвольного уровня доступа H.
u — флаг дает доступ к удобному администраторскому меню управления сервером amxmodmenu.
z — а этот флаг, который обычно ставят (или не ставят, по желанию) обычным игрокам, не админам.

Флаги аккаута — проверка на доступ с определенного IP адреса или с определенным логином. Например флаги de — означают что права прописаны на IP адрес и пароль не проверяется (идентификация только по IPу).
a — флаг не пускает на сервер игрока с неправильно введенным паролем (setinfo _pw пароль)
b — регистрация клан тега
c — администратор зайдет на сервер исключительно со значениями authid/wonid
d — администратор заходит только с этого ip адресса
e — пароль не проверяется (необходимо только совпадение name/ip/wonid)

Читайте также:  Тенториум детям для иммунитета

Настройка users.ini
Файл users.ini вашего игрового сервера находится в папке /ваш__крутой_сервер/addons/amxmodx/configs/users.ini
О том, как его настраивать, как прописывать доступ на IP, STEAM или логин/пароль, я расскажу дальше.

Полезная информация о том, что необходимо уметь делать игроку (если у него есть слот) и игровому администратору
Чтобы аккаунт игрока/админа получил свои права, если они прописаны на ник и пароль, нужно в консоли прописать строчку, которую вы увидите ниже. Ну или, чтобы не прописывать ее каждый раз, можно просто один раз добавить ее в файле autoexec.cfg вашего игрового клиента. Внимание, это строчку прописывать не нужно, если аккаунт прописан на IP или на STEAM ID.

Значение _pw можно изменить на совершенно любое, за него отвечает переменная amx_password_field, которую можно найти и настроить в файле amxx.cfg

Вот в таким формате прописывается аккаунт администратора:

или в переводе на русский строчка будет выглядеть так:

Давайте рассмотрим на конкретных примерах, как выглядят администраторские аккаунты:

источник

Иммунитет на другую флаг amx

Papo4ka

Пользователь

SKAJIbnEJIb

visibility

Papo4ka

Пользователь

// Адрес
amxbans_host «127.0.0.1»
// Логин
amxbans_user «»
// Пароль
amxbans_pass «»
// Имя базы данных
amxbans_db «»
// Префикс таблиц (обычно у всех «amx»)
amxbans_prefix «gm»
// Таймаут запросов в секундах
amxbans_timeout «10»

// Откуда загружать админов
// 0 — MySQL (база данных)
// 1 — Из файла users.ini
// 2 — Не загружать админов
amxbans_load_admins «0»

// Если у Вас в БД все пароли лежат закодированы в MD5, то поставьте 1
// Поменяйте квар на 0, если при входе на сервер у Вас пишет: Не правильный пароль!
amxbans_passowrd_md5 «1»

// Отключить все Бан функции (оставить только загрузку админов)
amxbans_disable_bans «0»

// Вести лог
// 0 — полностью отключить лог
// a — логировать заходы админов(удачные и нет)
// b — логировать баны админов
// c — логировать попытки захода забаненных игроков
// d — логировать разбаны
// e — логировать пометки
amxbans_logs «abcde»

// Ссылка на бан
// Переменная %bid%, это номер бана
// Примеры для разных систем бана:
// «site.ru/amxbans/ban_list.php?b > // «site.ru/csbans/bans/%bid%.html» — csbans
// «site.ru/banlist» — gamecms (у этой системы нет отдельной странички для конкретного бана, поэтому указываем просто ссылку на весь банлист)
amxbans_ban_link «site.ru/amxbans/ban_list.php?b >
// Ссылка на motd окно (показывает при бане)
// «auto» — автоматически загрузит из Веб панели (не забудьте в веб части, в настройках сервера указать ссылку)
// «custom» — покажет мотд окно из файла amxbans_rbs.ini
// «https://site,ru/amxbans/motd.php?s > amxbans_motd_link «custom»

// Причины банов
// По умолчанию причины грузятся из Веб части и настраиваются там
// Если Вы хотите загружать причины из этого конфига, раскомментируйте команды ниже
//
// 60:1 час 1440:1 день 10080:7 дней 43200:30 дней 525600:365 дней
//amxbans_reason_add «Читер» «43200»
//amxbans_reason_add «Неадекват» «1440»
//amxbans_reason_add «Оскорбления» «360»
//amxbans_reason_add «Кемпер» «60»

// Имя админа, если банил сервер
// Что бы использовать имя сервера, оставьте поле пустым
amxbans_server_nick «CS-Fantastic.ru»

// IP ORT сервера. Найдет автоматически если стоит пустое значение
// Вы можете сами указать IP и порт по примеру: «123.123.123.123:27015»
amxbans_server_address «»

// Чтобы дать бан подсети айпишника 123.123.123.123, нужно забанить 123.123.123.0
// Желательно это делать в веб панели. Выбрать ТИП БАНА по айпи и указать в конце айпишника ноль.
// Для бана и разбана подсети, требуется флаг L(ADMIN_RCON)
// Значения квара:
// 0 — выключить бан подсети
// 1 — не дает войти на сервер пользователям с забаненной подсети, кроме админов с любым флагом
// 2 — тоже что и «1», но еще дает возможность войти STEAM игрокам на сервер
amxbans_subnet «0»

// Число игроков, отображаемых в меню отключенных/последних игроков
// 0 — выключить это меню
amxbans_disconnect_players «16»

// Включить меню наблюдения за игроком?
// вызывается командой: amx_flaggingmenu
amxbans_flagged «0»

// Включение меню истории банов
amxbans_history «1»

// Флаг админа, который может разбанивать все баны, а не только свои (в меню amx_unbanmenu)
// 0 — все админы могут разбанивать все баны
amxbans_flag_unban «r»

// Пункт выбора количества показа забаненных игроков, в меню amx_unbanmenu
// 0 — показать всех
amxbans_unban_step «5 10 20 50 0»

// Флаг иммунитета
amxbans_flag_immunity «r»

// Флаг главного админа.
// Главного админа никто не может забанить(кроме самого сервера),
// а сам главный админ может забанить даже тех, у кого иммунитет (amxbans_flag_immunity)
// 0 — отключить
amxbans_flag_main «k»

// Флаг админа, для использования команды amx_addadmin
// 0 — отключить
amxbans_flag_addadmin «0»

// Тип бана
// По умолчанию бан идет по SteamID
// Если у игрока STEAM_ID_LAN, то бан идет по IP
// Админ с флагом amxbans_flag_bantype, может выбирать тип бана сам (в меню выбора причин бана)
amxbans_bantype_option «IP+SteamID»

// Тип бана, если банит сервер (через команду amx_ban)
// Значения: «SteamID» или «IP+SteamID»
amxbans_bantype_server «IP+SteamID»

// Флаг админа, который может выбирать тип бана (в меню выбора причин бана)
// 0 — выключить
amxbans_flag_bantype «c»

// Добавлять кики игрока в базу данных?
// То есть сколько раз игрок был кикнут с сервера(когда он был забанен и пытался войти)
// По умолчанию функция отключена, так как я считаю это лишним запросом в базу данных
amxbans_add_kick «0»

// Флаг админа, который может использовать собственную причину бана
// 0 — отключить собственные баны
amxbans_custom_flag «c»

// Время бана, используемое при собственной причине бана.
// Значение используется, если у админа статическое значение времени бана. Указывать в минутах
// 0 — навсегда
// -1 — показывать меню с выбором времени
amxbans_custom_statictime «1440»

// Расположение в меню пункта «Своя причина»
// 0 — в начале (первым пунктом)
// 1 — в конце
amxbans_custom_place «0»

// Причина бана по-умолчанию.
amxbans_default_ban_reason «unknown»

// Если игрок ранее был забанен N раз, то при заходе его на сервер будет отображаться инфа админам в чат
// 0 — отключить
// N — количество предыдущих банов
amxbans_show_prebanned «0»

// Наказание игрока перед баном
// 0 — отключить
// 1 — обездвижить
// 2 — убить молнией
amxbans_punish «2»

// Задержка перед киком
// ВАЖНО! В веб панеле есть пункт: «Задержка перед показом MOTD», так вот это не совсем так
// На самом деле это задержка перед киком, неизвестно почему во всех веб панелях так, но мы оставили так же
// Для задержки именно motd окна, смотрите квар ниже
// -1 — Брать из веб панели
amxbans_kick_delay «4»

// Задержка перед показом MOTD
// 0 — не показывать motd окно
amxbans_motd_delay «0»

// Добавлять пункты в меню amxmodmenu?
amxbans_add_menus «0»

// Если Вы добавляете админа без указанного срока бана (в веб часте есть пункт «Установленное время бана»)
// то система покажет меню выбора времени(на сколько банить игрока)
// Тут Вы можете настроить это время

// Кому из админов будет показываться меню с выбором времени бана
// -1 — информация будет браться из веб части («Установленное время бана»)
// 0 — никому не показывать такое меню
// flag — укажите флаг админа(например «l»), который будет иметь возможность выставить время
// d — всем показывать меню
amxbans_established_time «d»

// ВАЖНО: Сначала вводите значения от меньшего к большему. Количество значений — от 1 до 12.
// «0 m» — навсегда
// Допустимые значения:
// 1 — 59 может использоваться с флагом m (минуты)
// 1 — 23 может использоваться с флагом h (часы)
// 1 — 6 может использоваться с флагом d (дни)
// 1 — 999 может использоваться с флагом w (недели)
// Примеры:
// «5 m» — 5 минут
// «1 h» — 1 час
// «1 d» — 1 день
// «2 w» — 2 недели

// Время бана для обычных админов (с флагом «d»)
amxbans_setlowbantimes «10 m» «1 h» «1 d» «7 d»

// Какой флаг доступа должен иметь админ, чтобы получить доступ к банам с большой длительностью
amxbans_hightime_flag «c»
// Время бана для админов с amxbans_hightime_flag флагом.
amxbans_sethighbantimes «10 m» «1 h» «1 d» «7 d» «4 w» «0 m»

// Время наблюдения за игроком в меню
amxbans_setflagtimes «1 h» «4 h» «10 h» «1 d» «1 w» «4 w» «12 w» «0»

// Список консольных команд
// (здесь они написаны просто так, как памятка)

// say /ban [время бана в минутах] — быстрый бан игрока
// или /fb разницы нет
//
// amx_banmenu — открыть бан меню
// amx_banhistorymenu — открыть меню истории банов
// amx_bandisconnectedmenu — открыть меню вышедших игроков
// amx_flaggingmenu — открыть меню помеченных игроков
// amx_unbanmenu — открыть меню разбана игроков
// amx_bansubnetmenu — открыть меню бана подсетей
//
// amx_ban — забанить игрока или подсеть
// amx_banip и fb_ban — аналоги команды amx_ban
// amx_unban — разбан игрока (доступ только для админа с флагом l(ADMIN_RCON))
// amx_addadmin [password] [name|authid|ip] [nick] [show (yes|no)] [expired] [comment] — добавить админа
//
// amx_reloadreasons — Перезагрузка причин
// amx_reloadsubnet — Перезагрузка банов подсети
// amx_reloadadmins — Перезагрузка админов

источник

Источник