AMX MOD X
Понедельник, 26.01.2026, 20:20:11



Приветствую Вас Гость | RSS
[ Главная ] [ give_item - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
give_item
PomanoBДата: Суббота, 13.09.2008, 13:57:11 | Сообщение # 1
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Нужно дать игроку SmokeGrenade когда он использовал старую
Я добавил give_item в плагин VEN'а " Descriptive 'Fire in the hole!' "
Code

/* AMX Mod X
*   Descriptive 'Fire in the hole!'
*
* (c) Copyright 2006 by VEN
*
* This file is provided as is (no warranties)
*
*     DESCRIPTION
*       Plugin provides additional colored text for "Fire in the hole!" radio chat message.
*       The color and the text is different for each grenade type and can be altered.
*       This will help teammates to get the throwed grenade type and act accordingly.
*       Search for "EDITABLE" mark in the plugin's source code to configure text and color.
*
*     CREDITS
*       Damaged Soul - colored chat text method
*       p3tsin - team color override method
*/

#include <amxmodx>

#include <fun>

#define PLUGIN_NAME "Descriptive 'Fire in the hole!'"
#define PLUGIN_VERSION "0.1"
#define PLUGIN_AUTHOR "VEN"

enum grenade {
    GRENADE_HE,
    GRENADE_FLASH,
    GRENADE_SMOKE
}

// EDITABLE: grenade description
new const g_grenade_description[_:grenade][] = {
    " [explosive]",
    " [flashbang]",
    " [smokegren]"
}

enum color {
    COLOR_NORMAL,
    COLOR_RED,
    COLOR_BLUE,
    COLOR_GRAY,
    COLOR_GREEN
}

// EDITABLE: grenade description text color
new const g_grenade_desccolor[_:grenade] = {
    COLOR_RED,
    COLOR_GRAY,
    COLOR_GREEN
}

new const g_grenade_weaponid[_:grenade] = {
    CSW_HEGRENADE,
    CSW_FLASHBANG,
    CSW_SMOKEGRENADE
}

#define COLORCODE_NORMAL 0x01
#define COLORCODE_TEAM 0x03
#define COLORCODE_LOCATION 0x04

new const g_color_code[_:color] = {
    COLORCODE_NORMAL,
    COLORCODE_TEAM,
    COLORCODE_TEAM,
    COLORCODE_TEAM,
    COLORCODE_LOCATION
}

new const g_color_teamname[_:color][] = {
    "",
    "TERRORIST",
    "CT",
    "SPECTATOR",
    ""
}

#define RADIOTEXT_MSGARG_NUMBER 5

enum radiotext_msgarg {
    RADIOTEXT_MSGARG_PRINTDEST = 1,
    RADIOTEXT_MSGARG_CALLERID,
    RADIOTEXT_MSGARG_TEXTTYPE,
    RADIOTEXT_MSGARG_CALLERNAME,
    RADIOTEXT_MSGARG_RADIOTYPE,
}

new const g_required_radiotype[] = "#Fire_in_the_hole"
new const g_radiotext_template[] = "%s (RADIO): Fire in the hole!"

new g_msgid_saytext
new g_msgid_teaminfo

public plugin_init() {
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

    register_message(get_user_msgid("TextMsg"), "message_text")

    g_msgid_saytext = get_user_msgid("SayText")
    g_msgid_teaminfo = get_user_msgid("TeamInfo")
}

public message_text(msgid, dest, id) {
    if (get_msg_args() != RADIOTEXT_MSGARG_NUMBER || get_msg_argtype(RADIOTEXT_MSGARG_RADIOTYPE) != ARG_STRING)
     return PLUGIN_CONTINUE

    static arg[32]
    get_msg_arg_string(RADIOTEXT_MSGARG_RADIOTYPE, arg, sizeof arg - 1)
    if (!equal(arg, g_required_radiotype))
     return PLUGIN_CONTINUE

    get_msg_arg_string(RADIOTEXT_MSGARG_CALLERID, arg, sizeof arg - 1)
    new caller = str_to_num(arg)
    if (!is_user_alive(caller))
     return PLUGIN_CONTINUE

    new clip, ammo, weapon
    weapon = get_user_weapon(caller, clip, ammo)
    for (new i; i < sizeof g_grenade_weaponid; ++i) {
     if (g_grenade_weaponid[i] == weapon) {
         
         
      if (i==2) {
       give_item(caller,"weapon_smokegrenade")
      }
         
            
      static text[192]
      new pos = 0
      text[pos++] = g_color_code[COLOR_NORMAL]

      get_msg_arg_string(RADIOTEXT_MSGARG_CALLERNAME, arg, sizeof arg - 1)
      pos += formatex(text[pos], sizeof text - pos - 1, g_radiotext_template, arg)
      copy(text[++pos], sizeof text - pos - 1, g_grenade_description[i])

      new desccolor = g_grenade_desccolor[i]
      if ((text[--pos] = g_color_code[desccolor]) == COLORCODE_TEAM) {
       static teamname[12]
       get_user_team(id, teamname, sizeof teamname - 1)

       if (!equal(teamname, g_color_teamname[desccolor])) {
        msg_teaminfo(id, g_color_teamname[desccolor])
        msg_saytext(id, text)
        msg_teaminfo(id, teamname)

        return PLUGIN_HANDLED
       }
      }

      msg_saytext(id, text)

      return PLUGIN_HANDLED
     }
    }

    return PLUGIN_CONTINUE
}

msg_teaminfo(id, teamname[]) {
    message_begin(MSG_ONE, g_msgid_teaminfo, _, id)
    write_byte(id)
    write_string(teamname)
    message_end()
}

msg_saytext(id, text[]) {
    message_begin(MSG_ONE, g_msgid_saytext, _, id)
    write_byte(id)
    write_string(text)
    message_end()
}

Я добавил

Code
#include <fun>

и
Code
if (i==2) {
    give_item(caller,"weapon_smokegrenade")
}

Но серв виснет в момент give_item
Причём не зависимо от даваемого оружия

Также пробовал брать код из amx_super и csdm
Результат тот же


http://romanov4400.mybrute.com

Сообщение отредактировал PomanoB - Суббота, 13.09.2008, 13:59:30
 
se7hДата: Суббота, 13.09.2008, 14:42:04 | Сообщение # 2
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
попробуй так:

Code
if (g_grenade_weaponid[i] == CSW_SMOKEGRENADE) {  
     give_item(caller,"weapon_smokegrenade")  
}




Сообщение отредактировал se7h - Суббота, 13.09.2008, 14:48:18
 
PomanoBДата: Суббота, 13.09.2008, 14:43:42 | Сообщение # 3
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
А какая разница-то
Code
new const g_grenade_weaponid[_:grenade] = {
  CSW_HEGRENADE,
  CSW_FLASHBANG,
  CSW_SMOKEGRENADE
}

для CSW_SMOKEGRENADE i=2


http://romanov4400.mybrute.com

Сообщение отредактировал PomanoB - Суббота, 13.09.2008, 14:53:42
 
DaTaДата: Суббота, 13.09.2008, 15:05:26 | Сообщение # 4
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
fakemeta_util.inc :: fm_give_item(index, const item[])
 
se7hДата: Суббота, 13.09.2008, 15:10:30 | Сообщение # 5
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
должно работать и give_item просто

 
PomanoBДата: Суббота, 13.09.2008, 16:11:23 | Сообщение # 6
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
fm_give_item не работает
Причём если пишу fm_give_item(caller,"weapon_smokegrenade") то вообще ничего не происходит, а если любое другое оружие то серв виснет.


http://romanov4400.mybrute.com
 
se7hДата: Суббота, 13.09.2008, 16:37:40 | Сообщение # 7
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
добавь такую функцию в плагин:

Code
public grenade_throw(id, gId, wId)
{
    if(is_user_alive(id) && wId == CSW_SMOKEGRENADE)
     give_item(id,"weapon_smokegrenade")
}

и не парься ;)




Сообщение отредактировал se7h - Суббота, 13.09.2008, 17:09:09
 
DaTaДата: Суббота, 13.09.2008, 16:55:29 | Сообщение # 8
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
попробуй дать гранату чуть позже, чем вызываются функции ее класса(и вообще какое-то действие над оружием игрока), где она по прежнему присутствует у игрока

например

Code
//...
    set_task(0.1, "give_sgren", caller)
//...

public give_sgren(id)
{
    if( !is_user_alive(id)  )
       return

    fm_give_item(id,"weapon_smokegrenade")
}

можно так же хукнуть pre/postthink для моментальной передачи игроку гранаты

 
se7hДата: Суббота, 13.09.2008, 17:16:08 | Сообщение # 9
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
Quote (DaTa)
можно так же хукнуть pre/postthink для моментальной передачи игроку гранаты

зачем делать проверки каждый фрейм?

задержка в 0.1 секунду необходима, вот работающий код:

Code
public grenade_throw(id, gId, wId)    
{    
    if(wId == CSW_SMOKEGRENADE)    
     set_task(0.1, "givesmoke", id)
}

public givesmoke(id)
{
    if(is_user_alive(id))
     give_item(id,"weapon_smokegrenade")
}




Сообщение отредактировал se7h - Суббота, 13.09.2008, 17:22:33
 
DaTaДата: Суббота, 13.09.2008, 17:24:52 | Сообщение # 10
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (se7h)
задержка в 0.1 секунду необходима, вот работающий код:

необходимость не в задержке, а в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий

твой код может вызвать ошибку, если игрок выйдет с сервера перед выполнением задачи givesmoke

 
se7hДата: Суббота, 13.09.2008, 17:27:32 | Сообщение # 11
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
Quote (DaTa)
необходимость не в задержке, а в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий

то есть ты бы хотел чтобы я написал следующее:
"необходимость в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий поэтому функция вот такая"? :D
не придирайся к словам

Quote (DaTa)
твой код может вызвать ошибку, если игрок выйдет с сервера перед выполнением задачи givesmoke

то есть в течении 0.1 секунды? B)


 
DaTaДата: Суббота, 13.09.2008, 17:39:18 | Сообщение # 12
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (se7h)
то есть в течении 0.1 секунды? B)

задача не выполнится четко через 0.1 сек, может быть даже через 0.2

0.1 секунда - это 10 кадров, так что вполне возможно, что в течении этого времени игрок выйдет с сервера и будет ошибка "Invalid player %d", id в модуле fun

 
PomanoBДата: Суббота, 13.09.2008, 17:40:11 | Сообщение # 13
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Всем большое спасибо, поставил
Code
public grenade_throw(id, gId, wId)      
{      
      if(wId == CSW_SMOKEGRENADE)      
       set_task(0.1, "givesmoke", id)   
}   

public givesmoke(id)   
{   
      if(is_user_alive(id))   
       give_item(id,"weapon_smokegrenade")   
}

всё работает

а если добавить

Code
public client_disconnect(id) {
  remove_task(id)
}

нормально будет ?


http://romanov4400.mybrute.com

Сообщение отредактировал PomanoB - Суббота, 13.09.2008, 17:41:12
 
se7hДата: Суббота, 13.09.2008, 17:42:33 | Сообщение # 14
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
Quote (DaTa)
задача не выполнится четко через 0.1 сек, может быть даже через 0.2

всё ОК, как видишь "Сообщение отредактировал se7h - Суббота, 2008-09-13, 5:22 Pm" ещё до твоего поста я исправил код, сделав проверку is_user_alive(id) непосредственно в задаче ;)


 
DaTaДата: Суббота, 13.09.2008, 17:44:59 | Сообщение # 15
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (PomanoB)
а если добавить
Code
public client_disconnect(id) {
remove_task(id)
}

нормально будет ?


излишне, так как в задаче уже осуществляется проверка, которая не вызовет ошибки

Добавлено (2008-09-13, 5:44 Pm)
---------------------------------------------

Quote (se7h)
всё ОК, как видишь "Сообщение отредактировал se7h - Суббота, 2008-09-13, 5:22 Pm" ещё до твоего поста я исправил код, сделав проверку is_user_alive(id) непосредственно в задаче ;)

не заметил, у меня инет гиперскоростной :)
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2026