|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
|
give_item
|
|
| PomanoB | Дата: Суббота, 13.09.2008, 13:57:11 | Сообщение # 1 |
 Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Нужно дать игроку 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 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
Статус: Не в сети
| попробуй так: 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
Статус: Не в сети
| А какая разница-то 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
Статус: Не в сети
| fakemeta_util.inc :: fm_give_item(index, const item[])
|
| |
|
|
| se7h | Дата: Суббота, 13.09.2008, 15:10:30 | Сообщение # 5 |
 Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| должно работать и give_item просто
|
| |
|
|
| PomanoB | Дата: Суббота, 13.09.2008, 16:11:23 | Сообщение # 6 |
 Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| fm_give_item не работает Причём если пишу fm_give_item(caller,"weapon_smokegrenade") то вообще ничего не происходит, а если любое другое оружие то серв виснет.
http://romanov4400.mybrute.com
|
| |
|
|
| se7h | Дата: Суббота, 13.09.2008, 16:37:40 | Сообщение # 7 |
 Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| добавь такую функцию в плагин: 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
Статус: Не в сети
| попробуй дать гранату чуть позже, чем вызываются функции ее класса(и вообще какое-то действие над оружием игрока), где она по прежнему присутствует у игрока например 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
Статус: Не в сети
| 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
Статус: Не в сети
| Quote (se7h) задержка в 0.1 секунду необходима, вот работающий код: необходимость не в задержке, а в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий твой код может вызвать ошибку, если игрок выйдет с сервера перед выполнением задачи givesmoke
|
| |
|
|
| se7h | Дата: Суббота, 13.09.2008, 17:27:32 | Сообщение # 11 |
 Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| Quote (DaTa) необходимость не в задержке, а в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий то есть ты бы хотел чтобы я написал следующее: "необходимость в том что бы дать игроку оружие после выполнения функций класса гранат да и вообще любых функций классов оружий поэтому функция вот такая"? не придирайся к словам Quote (DaTa) твой код может вызвать ошибку, если игрок выйдет с сервера перед выполнением задачи givesmoke то есть в течении 0.1 секунды? 
|
| |
|
|
| DaTa | Дата: Суббота, 13.09.2008, 17:39:18 | Сообщение # 12 |
|
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| 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
Статус: Не в сети
| Всем большое спасибо, поставил 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
Статус: Не в сети
| 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
Статус: Не в сети
| 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) непосредственно в задаче ;) не заметил, у меня инет гиперскоростной
|
| |
|
|
 | AMX Mod X Russian Community © 2006-2026  |  |
|
| |