[pawn]
- ID Константа Название Скорость Патроны Тип патронов
- 1 CSW_P228 weapon_p228 250 13/52 ammo_357sig
- 3 CSW_SCOUT weapon_scout 260 10/90 ammo_762nato
- 4 CSW_HEGRENADE weapon_hegrenade 250 1
- 5 CSW_XM1014 weapon_xm1014 240 7/32 ammo_buckshot
- 6 CSW_C4 weapon_c4 250 1
- 7 CSW_MAC10 weapon_mac10 250 30/100 ammo_45acp
- 8 CSW_AUG weapon_aug 240 30/90 ammo_556nato
- 9 CSW_SMOKEGRENADE weapon_smokegrenade 250 1
- 10 CSW_ELITE weapon_elite 250 30/120 ammo_9mm
- 11 CSW_FIVESEVEN weapon_fiveseven 250 20/100 ammo_57mm
- 12 CSW_UMP45 weapon_ump45 250 25/100 ammo_45acp
- 13 CSW_SG550 weapon_sg550 210 30/90 ammo_556nato
- 14 CSW_GALIL weapon_galil 240 35/90 ammo_556nato
- 15 CSW_FAMAS weapon_famas 240 25/90 ammo_556nato
- 16 CSW_USP weapon_usp 250 12/100 ammo_45acp
- 17 CSW_GLOCK18 weapon_glock18 250 20/120 ammo_9mm
- 18 CSW_AWP weapon_awp 210 10/30 ammo_338magnum
- 19 CSW_MP5NAVY weapon_mp5navy 250 30/120 ammo_9mm
- 20 CSW_M249 weapon_m249 220 100/200 ammo_556natobox
- 21 CSW_M3 weapon_m3 230 8/32 ammo_buckshot
- 22 CSW_M4A1 weapon_m4a1 230 30/90 ammo_556nato
- 23 CSW_TMP weapon_tmp 250 30/120 ammo_9mm
- 24 CSW_G3SG1 weapon_g3sg1 210 20/90 ammo_762nato
- 25 CSW_FLASHBANG weapon_flashbang 250 2
- 26 CSW_DEAGLE weapon_deagle 250 7/35 ammo_50ae
- 27 CSW_SG552 weapon_sg552 235 30/90 ammo_556nato
- 28 CSW_AK47 weapon_ak47 221 30/90 ammo_762nato
- 29 CSW_KNIFE weapon_knife 250 0
- 30 CSW_P90 weapon_p90 245 50/100 ammo_57mm
give_item
Для начала, одна из часто встречающихся функций. Эта функция дает оружие и патроны игроку. Для того, чтобы она была доступна, необходимо подключить библиотеку fun - #include <fun>. Простенький пример - при возрождении дается дигл с патронами. Можно давать любое оружие, просто в качестве 2 аргумента функции подставляете строки из 3 или 6 столбика таблицы.
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- #include <fun>
- public plugin_init()
- {
- RegisterHam(Ham_Spawn, "player", "Spawn", 1);
- }
- public Spawn(id)
- {
- if (is_user_alive(id))
- {
- // Даем дигл с патронами
- give_item(id, "weapon_deagle");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- }
- }
Вроде все работает как задумали, но возникает проблема - в слоте оказывается 2 пистолета - дефолтное и наш дигл.
strip_user_weapons
Эта функция забирает все оружие игрока. Для работы нужна все та же библиотека fun.
Чтобы исправить нашу проблему, давайте, сначало заберем все оружие, а потом дадим нож и дигл.
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- #include <fun>
- public plugin_init()
- {
- RegisterHam(Ham_Spawn, "player", "Spawn", 1);
- }
- public Spawn(id)
- {
- // Задержка для выдачи оружия
- // Необходимо, чтобы сервер не упал
- set_task(0.1, "GiveDeagle", id);
- }
- public GiveDeagle(id)
- {
- if (is_user_alive(id))
- {
- // Забираем все оружие
- strip_user_weapons(id);
- // Даем нож
- give_item(id, "weapon_knife");
- // Даем дигл с патронами
- give_item(id, "weapon_deagle");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- give_item(id, "ammo_50ae");
- }
- }
Вот теперь работает как надо... Постойте, а где мой AWP!
Если у игрока может быть только пистолет этот код великолепно работает, но если у игрока будет основное оружие, он его заберет и не отдаст... Поэтому ищем другое решение.
user_has_weapon и fm_strip_user_gun
Функция user_has_weapon проверяет есть ли у игрока оружие с данным индексом. Другая же функция, fm_strip_user_gun забирает оружие с заданным индексом. Для ее работы нужно подключить библиотеку - #include <fakemeta_util>. Думаю, идея уже понятна - проверять нет ли у игрока определенного пистолета, и если есть - забирать. Таким образом мы работаем только с пистолетами и никак не трогаем основное оружие. Ну, понеслась...
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- #include <fakemeta_util>
- // Массив с индексами всех пистолетов
- new pistols[6] = {CSW_P228, CSW_ELITE, CSW_FIVESEVEN, CSW_GALIL, CSW_USP, CSW_GLOCK18};
- public plugin_init()
- {
- RegisterHam(Ham_Spawn, "player", "Spawn", 1);
- }
- public Spawn(id)
- {
- // Задержка для выдачи оружия
- // Необходимо, чтобы сервер не упал
- set_task(0.1, "GiveDeagle", id);
- }
- public GiveDeagle(id)
- {
- if (is_user_alive(id))
- {
- // Проверяем на все пистолеты
- for (new i = 0; i < 6; i++)
- {
- // Если у игрока есть пистолет с заданным индексом...
- if (user_has_weapon(id, pistols[i]))
- {
- // ...забираем его
- fm_strip_user_gun(id, pistols[i]);
- // Так как у игрока не может быть больше
- // одного пистолета выходим из цикла
- break;
- }
- }
- // Даем дигл с патронами
- fm_give_item(id, "weapon_deagle");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- }
- }
Надо заметить, что в fm_strip_user_gun уже есть проверка есть ли у игрока заданное оружие, поэтому код можно оптимизировать следующим образом
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- #include <fakemeta_util>
- // Массив с индексами всех пистолетов
- new pistols[6] = {CSW_P228, CSW_ELITE, CSW_FIVESEVEN, CSW_GALIL, CSW_USP, CSW_GLOCK18};
- public plugin_init()
- {
- RegisterHam(Ham_Spawn, "player", "Spawn", 1);
- }
- public Spawn(id)
- {
- // Задержка для выдачи оружия
- // Необходимо, чтобы сервер не упал
- set_task(0.1, "GiveDeagle", id);
- }
- public GiveDeagle(id)
- {
- if (is_user_alive(id))
- {
- // Проверяем на все пистолеты
- for (new i = 0; i < 6; i++)
- {
- // Если у игрока есть пистолет с заданным индексом
- // забираем пистолет и выходим из цикла
- if (fm_strip_user_gun(id, pistols[i]))
- {
- break;
- }
- }
- // Даем дигл с патронами
- fm_give_item(id, "weapon_deagle");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- fm_give_item(id, "ammo_50ae");
- }
- }
Вы, наверно, заметили, что используется некая функция fm_give_item. Это аналог give_item, который находится в fakemeta_util.
Так как user_has_weapon нам не пригодилась приведу другой пример - игроку с бомбой увеличиваем здоровье на 30hp.
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- #include <fun>
- public plugin_init()
- {
- RegisterHam(Ham_Spawn, "player", "Spawn", 1);
- }
- public Spawn(id)
- {
- // Задержка для выдачи оружия
- set_task(0.1, "SetHealth", id);
- }
- public SetHealth(id)
- {
- if (is_user_alive(id))
- {
- // Если у игрока есть бомба...
- if (user_has_weapon(id, CSW_C4))
- {
- // ...прибаляем 30hp
- set_user_health(id, 130);
- }
- }
- }
get_user_weapon
Функция возвращает индекс оружия, которое сейчас выбрано у игрока. Также с помощью этой функции можно возвращать количество патронов в обойме и общее количество, но это бывает мало полезно...Простенький пример - увеличение урона от ножа вдвое
[pawn]
- #include <amxmodx>
- #include <hamsandwich>
- public plugin_init()
- {
- RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
- }
- public TakeDamage(id, inflictor, attacker, Float: damage, damagebits)
- {
- if (is_user_alive(id) && get_user_weapon(attacker) == CSW_KNIFE)
- {
- SetHamParamFloat(4, damage * 2);
- }
- }
cs_set_user_bpammo и cs_set_weapon_ammo
Как видно из приставки cs_ нам понадобится библиотека cstrike. Эти две функции изменяют количество патронов оружия. Первая - устаналивает общее количество патронов, вторая - количество патронов в обойме. Наша задача - по команде выдать AWP с одним патроном в обойме и одним патроном в запасе.
[pawn]
- #include <amxmodx>
- #include <cstrike>
- #include <fun>
- public plugin_init()
- {
- register_clcmd("say /awp", "GiveAwp");
- }
- public GiveAwp(id)
- {
- // Даем игроку AWP
- new awpid = give_item(id, "weapon_awp");
- // Если оружие выдано
- if (awpid != -1)
- {
- // Устаналиваем количество патронов в запасе
- cs_set_user_bpammo(id, CSW_AWP, 1);
- // Устанавливаем количество патронов в обойме
- cs_set_weapon_ammo(awpid, 1);
- }
- }
Здесь следует сделать пару уточнений. Функция give_item возвращает индекс объекта. Не надо путать(!): это не индекс оружия (CSW_AWP), это индекс конкретного объекта оружия. Таким образом для того, чтобы использовать cs_set_weapon_ammo нужно знать индекс объекта оружия.
Удачи в скриптинге!
*Источник: Вы должны зарегистрироваться, чтобы видеть ссылки.