Русское сообщество по скриптингу

[TUT] Основы в работе с оружием.

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

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

[TUT] Основы в работе с оружием.

Сообщение Touch Dev1l » 11 июн 2013, 00:41

Оружие - одно из ключевых элементов игры и поэтому работать с ним приходится довольно часто. Поэтому для новичков, я считаю, будет интересно узнать основы в работе с оружием. Для начала приведу таблицу с описанием оружия.

[pawn]
  1. ID Константа        Название            Скорость Патроны  Тип патронов

  2. 1  CSW_P228         weapon_p228         250      13/52    ammo_357sig    

  3. 3  CSW_SCOUT        weapon_scout        260      10/90    ammo_762nato  

  4. 4  CSW_HEGRENADE    weapon_hegrenade    250      1                      

  5. 5  CSW_XM1014       weapon_xm1014       240      7/32     ammo_buckshot  

  6. 6  CSW_C4           weapon_c4           250      1                      

  7. 7  CSW_MAC10        weapon_mac10        250      30/100   ammo_45acp    

  8. 8  CSW_AUG          weapon_aug          240      30/90    ammo_556nato  

  9. 9  CSW_SMOKEGRENADE weapon_smokegrenade 250      1                      

  10. 10 CSW_ELITE        weapon_elite        250      30/120   ammo_9mm      

  11. 11 CSW_FIVESEVEN    weapon_fiveseven    250      20/100   ammo_57mm      

  12. 12 CSW_UMP45        weapon_ump45        250      25/100   ammo_45acp    

  13. 13 CSW_SG550        weapon_sg550        210      30/90    ammo_556nato  

  14. 14 CSW_GALIL        weapon_galil        240      35/90    ammo_556nato  

  15. 15 CSW_FAMAS        weapon_famas        240      25/90    ammo_556nato  

  16. 16 CSW_USP          weapon_usp          250      12/100   ammo_45acp    

  17. 17 CSW_GLOCK18      weapon_glock18      250      20/120   ammo_9mm      

  18. 18 CSW_AWP          weapon_awp          210      10/30    ammo_338magnum

  19. 19 CSW_MP5NAVY      weapon_mp5navy      250      30/120   ammo_9mm      

  20. 20 CSW_M249         weapon_m249         220      100/200  ammo_556natobox

  21. 21 CSW_M3           weapon_m3           230      8/32     ammo_buckshot  

  22. 22 CSW_M4A1         weapon_m4a1         230      30/90    ammo_556nato  

  23. 23 CSW_TMP          weapon_tmp          250      30/120   ammo_9mm      

  24. 24 CSW_G3SG1        weapon_g3sg1        210      20/90    ammo_762nato  

  25. 25 CSW_FLASHBANG    weapon_flashbang    250      2                      

  26. 26 CSW_DEAGLE       weapon_deagle       250      7/35     ammo_50ae      

  27. 27 CSW_SG552        weapon_sg552        235      30/90    ammo_556nato  

  28. 28 CSW_AK47         weapon_ak47         221      30/90    ammo_762nato  

  29. 29 CSW_KNIFE        weapon_knife        250      0                      

  30. 30 CSW_P90          weapon_p90          245      50/100   ammo_57mm
[/pawn]

give_item
Для начала, одна из часто встречающихся функций. Эта функция дает оружие и патроны игроку. Для того, чтобы она была доступна, необходимо подключить библиотеку fun - #include <fun>. Простенький пример - при возрождении дается дигл с патронами. Можно давать любое оружие, просто в качестве 2 аргумента функции подставляете строки из 3 или 6 столбика таблицы.

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3. #include <fun>

  4.  

  5. public plugin_init()

  6. {

  7.         RegisterHam(Ham_Spawn, "player", "Spawn", 1);

  8. }

  9.  

  10. public Spawn(id)

  11. {

  12.         if (is_user_alive(id))

  13.         {

  14.                 // Даем дигл с патронами

  15.                 give_item(id, "weapon_deagle");

  16.                 give_item(id, "ammo_50ae");

  17.                 give_item(id, "ammo_50ae");

  18.                 give_item(id, "ammo_50ae");

  19.                 give_item(id, "ammo_50ae");

  20.                 give_item(id, "ammo_50ae");

  21.         }

  22. }
[/pawn]
Вроде все работает как задумали, но возникает проблема - в слоте оказывается 2 пистолета - дефолтное и наш дигл.

strip_user_weapons
Эта функция забирает все оружие игрока. Для работы нужна все та же библиотека fun.
Чтобы исправить нашу проблему, давайте, сначало заберем все оружие, а потом дадим нож и дигл.

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3. #include <fun>

  4.  

  5. public plugin_init()

  6. {

  7.         RegisterHam(Ham_Spawn, "player", "Spawn", 1);

  8. }

  9.  

  10. public Spawn(id)

  11. {

  12.         // Задержка для выдачи оружия

  13.         // Необходимо, чтобы сервер не упал

  14.         set_task(0.1, "GiveDeagle", id);

  15. }

  16.  

  17. public GiveDeagle(id)

  18. {

  19.         if (is_user_alive(id))

  20.         {

  21.                 // Забираем все оружие

  22.                 strip_user_weapons(id);

  23.                 // Даем нож

  24.                 give_item(id, "weapon_knife");

  25.                 // Даем дигл с патронами

  26.                 give_item(id, "weapon_deagle");

  27.                 give_item(id, "ammo_50ae");

  28.                 give_item(id, "ammo_50ae");

  29.                 give_item(id, "ammo_50ae");

  30.                 give_item(id, "ammo_50ae");

  31.                 give_item(id, "ammo_50ae");

  32.         }

  33. }
[/pawn]

Вот теперь работает как надо... Постойте, а где мой AWP!
Если у игрока может быть только пистолет этот код великолепно работает, но если у игрока будет основное оружие, он его заберет и не отдаст... Поэтому ищем другое решение.

user_has_weapon и fm_strip_user_gun
Функция user_has_weapon проверяет есть ли у игрока оружие с данным индексом. Другая же функция, fm_strip_user_gun забирает оружие с заданным индексом. Для ее работы нужно подключить библиотеку - #include <fakemeta_util>. Думаю, идея уже понятна - проверять нет ли у игрока определенного пистолета, и если есть - забирать. Таким образом мы работаем только с пистолетами и никак не трогаем основное оружие. Ну, понеслась...

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3. #include <fakemeta_util>

  4.  

  5. // Массив с индексами всех пистолетов

  6. new pistols[6] = {CSW_P228, CSW_ELITE, CSW_FIVESEVEN, CSW_GALIL, CSW_USP, CSW_GLOCK18};

  7.  

  8. public plugin_init()

  9. {

  10.         RegisterHam(Ham_Spawn, "player", "Spawn", 1);

  11. }

  12.  

  13. public Spawn(id)

  14. {

  15.         // Задержка для выдачи оружия

  16.         // Необходимо, чтобы сервер не упал

  17.         set_task(0.1, "GiveDeagle", id);

  18. }

  19.  

  20. public GiveDeagle(id)

  21. {

  22.         if (is_user_alive(id))

  23.         {

  24.                 // Проверяем на все пистолеты

  25.                 for (new i = 0; i < 6; i++)

  26.                 {

  27.                         // Если у игрока есть пистолет с заданным индексом...

  28.                         if (user_has_weapon(id, pistols[i]))

  29.                         {

  30.                                 // ...забираем его

  31.                                 fm_strip_user_gun(id, pistols[i]);

  32.                                 // Так как у игрока не может быть больше

  33.                                 // одного пистолета выходим из цикла

  34.                                 break;

  35.                         }

  36.                 }

  37.                

  38.                 // Даем дигл с патронами

  39.                 fm_give_item(id, "weapon_deagle");

  40.                 fm_give_item(id, "ammo_50ae");

  41.                 fm_give_item(id, "ammo_50ae");

  42.                 fm_give_item(id, "ammo_50ae");

  43.                 fm_give_item(id, "ammo_50ae");

  44.                 fm_give_item(id, "ammo_50ae");

  45.         }

  46. }
[/pawn]

Надо заметить, что в fm_strip_user_gun уже есть проверка есть ли у игрока заданное оружие, поэтому код можно оптимизировать следующим образом

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3. #include <fakemeta_util>

  4.  

  5. // Массив с индексами всех пистолетов

  6. new pistols[6] = {CSW_P228, CSW_ELITE, CSW_FIVESEVEN, CSW_GALIL, CSW_USP, CSW_GLOCK18};

  7.  

  8. public plugin_init()

  9. {

  10.         RegisterHam(Ham_Spawn, "player", "Spawn", 1);

  11. }

  12.  

  13. public Spawn(id)

  14. {

  15.         // Задержка для выдачи оружия

  16.         // Необходимо, чтобы сервер не упал

  17.         set_task(0.1, "GiveDeagle", id);

  18. }

  19.  

  20. public GiveDeagle(id)

  21. {

  22.         if (is_user_alive(id))

  23.         {

  24.                 // Проверяем на все пистолеты

  25.                 for (new i = 0; i < 6; i++)

  26.                 {

  27.                         // Если у игрока есть пистолет с заданным индексом

  28.                         // забираем пистолет и выходим из цикла

  29.                         if (fm_strip_user_gun(id, pistols[i]))

  30.                         {

  31.                                 break;

  32.                         }

  33.                 }

  34.                

  35.                 // Даем дигл с патронами

  36.                 fm_give_item(id, "weapon_deagle");

  37.                 fm_give_item(id, "ammo_50ae");

  38.                 fm_give_item(id, "ammo_50ae");

  39.                 fm_give_item(id, "ammo_50ae");

  40.                 fm_give_item(id, "ammo_50ae");

  41.                 fm_give_item(id, "ammo_50ae");

  42.         }

  43. }
[/pawn]

Вы, наверно, заметили, что используется некая функция fm_give_item. Это аналог give_item, который находится в fakemeta_util.
Так как user_has_weapon нам не пригодилась приведу другой пример - игроку с бомбой увеличиваем здоровье на 30hp.

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3. #include <fun>

  4.  

  5. public plugin_init()

  6. {

  7.         RegisterHam(Ham_Spawn, "player", "Spawn", 1);

  8. }

  9.  

  10. public Spawn(id)

  11. {

  12.         // Задержка для выдачи оружия

  13.         set_task(0.1, "SetHealth", id);

  14. }

  15.  

  16. public SetHealth(id)

  17. {

  18.         if (is_user_alive(id))

  19.         {

  20.                 // Если у игрока есть бомба...

  21.                 if (user_has_weapon(id, CSW_C4))

  22.                 {

  23.                         // ...прибаляем 30hp

  24.                         set_user_health(id, 130);

  25.                 }

  26.         }

  27. }
[/pawn]

get_user_weapon
Функция возвращает индекс оружия, которое сейчас выбрано у игрока. Также с помощью этой функции можно возвращать количество патронов в обойме и общее количество, но это бывает мало полезно...Простенький пример - увеличение урона от ножа вдвое

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

  7. }

  8.  

  9. public TakeDamage(id, inflictor, attacker, Float: damage, damagebits)

  10. {

  11.         if (is_user_alive(id) && get_user_weapon(attacker) == CSW_KNIFE)

  12.         {

  13.                 SetHamParamFloat(4, damage * 2);

  14.         }

  15. }
[/pawn]

cs_set_user_bpammo и cs_set_weapon_ammo

Как видно из приставки cs_ нам понадобится библиотека cstrike. Эти две функции изменяют количество патронов оружия. Первая - устаналивает общее количество патронов, вторая - количество патронов в обойме. Наша задача - по команде выдать AWP с одним патроном в обойме и одним патроном в запасе.

[pawn]
  1. #include <amxmodx>

  2. #include <cstrike>

  3. #include <fun>

  4.  

  5. public plugin_init()

  6. {

  7.         register_clcmd("say /awp", "GiveAwp");

  8. }

  9.  

  10. public GiveAwp(id)

  11. {

  12.         // Даем игроку AWP

  13.         new awpid = give_item(id, "weapon_awp");

  14.        

  15.         // Если оружие выдано

  16.         if (awpid != -1)

  17.         {

  18.                 // Устаналиваем количество патронов в запасе

  19.                 cs_set_user_bpammo(id, CSW_AWP, 1);

  20.                 // Устанавливаем количество патронов в обойме

  21.                 cs_set_weapon_ammo(awpid, 1);

  22.         }

  23. }
[/pawn]

Здесь следует сделать пару уточнений. Функция give_item возвращает индекс объекта. Не надо путать(!): это не индекс оружия (CSW_AWP), это индекс конкретного объекта оружия. Таким образом для того, чтобы использовать cs_set_weapon_ammo нужно знать индекс объекта оружия.

Удачи в скриптинге!

*Источник: Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
Touch Dev1l
 
Сообщения: 1304
Зарегистрирован: 14 апр 2013, 13:50
Забанен
Благодарил (а): 126 раз.
Поблагодарили: 254 раз.

Re: [TUT] Основы в работе с оружием.

Сообщение Leonidddd » 11 июн 2013, 01:33

эмм... как бы уже есть все это только на Вы должны зарегистрироваться, чтобы видеть ссылки. сайте и даже больше,чем в этой статье.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: [TUT] Основы в работе с оружием.

Сообщение Touch Dev1l » 11 июн 2013, 03:28

Leonidddd писал(а):эмм... как бы уже есть все это только на Вы должны зарегистрироваться, чтобы видеть ссылки. сайте и даже больше,чем в этой статье.


То там. Тут пусть тоже будет =]
То тут нет.
Аватара пользователя
Touch Dev1l
 
Сообщения: 1304
Зарегистрирован: 14 апр 2013, 13:50
Забанен
Благодарил (а): 126 раз.
Поблагодарили: 254 раз.

Re: [TUT] Основы в работе с оружием.

Сообщение Papito » 11 июн 2013, 21:06

Нужно все темы оттуда перекинуть сюда... :thumbs_up
Последний раз редактировалось Papito 11 июн 2013, 21:08, всего редактировалось 1 раз.
Аватара пользователя
Papito
 
Сообщения: 545
Зарегистрирован: 09 ноя 2012, 16:28
Откуда: Montana
Благодарил (а): 44 раз.
Поблагодарили: 121 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter Strike 1.6
SAMP

Re: [TUT] Основы в работе с оружием.

Сообщение Retro-kolt Lincoln » 11 июн 2013, 21:07

[pawn]
  1. public Spawn(id)

  2. {

  3.         // Задержка для выдачи оружия

  4.         // Необходимо, чтобы сервер не упал

  5.         set_task(0.1, "GiveDeagle", id);

  6. }
[/pawn]
Шо? У меня всегда оружие даётся при спавне без какой либо задержки, что-то сервер не падает, если пишете статью, то хоть проверяйте точность данных.
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: [TUT] Основы в работе с оружием.

Сообщение Mapaky9 » 11 июн 2013, 22:55

[pawn]
  1. if (is_user_alive(id))
[/pawn]
Этой проверки не достаточно. Надо проверять еще и на соединение игрока к серверу ибо будет вбивать ошибку.
Аватара пользователя
Mapaky9
 
Сообщения: 185
Зарегистрирован: 02 июн 2013, 20:30
Откуда: Уфа
Благодарил (а): 61 раз.
Поблагодарили: 67 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: [TUT] Основы в работе с оружием.

Сообщение Awake » 11 июн 2013, 23:01

Mapaky9 писал(а):[pawn]
  1. if (is_user_alive(id))
[/pawn]
Этой проверки не достаточно. Надо проверять еще и на соединение игрока к серверу ибо будет вбивать ошибку.

Нет, не будет. ;)
Opo4uMapy писал(а):Awake, не умничай .
Аватара пользователя
Awake
 
Сообщения: 416
Зарегистрирован: 14 ноя 2011, 18:34
Откуда: Архангельск
Благодарил (а): 46 раз.
Поблагодарили: 85 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: [TUT] Основы в работе с оружием.

Сообщение Mapaky9 » 12 июн 2013, 08:52

Awake писал(а):
Mapaky9 писал(а):[pawn]
  1. if (is_user_alive(id))
[/pawn]
Этой проверки не достаточно. Надо проверять еще и на соединение игрока к серверу ибо будет вбивать ошибку.

Нет, не будет. ;)

Почему? Я думаю будет :-D .
Аватара пользователя
Mapaky9
 
Сообщения: 185
Зарегистрирован: 02 июн 2013, 20:30
Откуда: Уфа
Благодарил (а): 61 раз.
Поблагодарили: 67 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: [TUT] Основы в работе с оружием.

Сообщение KORD_12.7 » 12 июн 2013, 10:10

Mapaky9 писал(а):
Awake писал(а):
Mapaky9 писал(а):[pawn]
  1. if (is_user_alive(id))
[/pawn]
Этой проверки не достаточно. Надо проверять еще и на соединение игрока к серверу ибо будет вбивать ошибку.

Нет, не будет. ;)

Почему? Я думаю будет :-D .

Не будет:

[pawn]
  1. static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */

  2. {

  3.         int index = params[1];

  4.        

  5.         if (index < 1 || index > gpGlobals->maxClients)

  6.         {

  7.                 return 0;

  8.         }

  9.        

  10.         CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);

  11.  

  12.         if (g_bmod_tfc)

  13.         {

  14.                 edict_t *e = pPlayer->pEdict;

  15.                 if (e->v.flags & FL_SPECTATOR ||

  16.                         (!e->v.team || !e->v.playerclass))

  17.                 {

  18.                         return 0;

  19.                 }

  20.         }

  21.        

  22.         return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);

  23. }
[/pawn]

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 142 раз.
Поблагодарили: 257 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: [TUT] Основы в работе с оружием.

Сообщение Mapaky9 » 12 июн 2013, 11:19

KORD_12.7 писал(а):
Mapaky9 писал(а):
Awake писал(а):
Mapaky9 писал(а):[pawn]
  1. if (is_user_alive(id))
[/pawn]
Этой проверки не достаточно. Надо проверять еще и на соединение игрока к серверу ибо будет вбивать ошибку.

Нет, не будет. ;)

Почему? Я думаю будет :-D .

Не будет:

[pawn]
  1. static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */

  2. {

  3.         int index = params[1];

  4.        

  5.         if (index < 1 || index > gpGlobals->maxClients)

  6.         {

  7.                 return 0;

  8.         }

  9.        

  10.         CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);

  11.  

  12.         if (g_bmod_tfc)

  13.         {

  14.                 edict_t *e = pPlayer->pEdict;

  15.                 if (e->v.flags & FL_SPECTATOR ||

  16.                         (!e->v.team || !e->v.playerclass))

  17.                 {

  18.                         return 0;

  19.                 }

  20.         }

  21.        

  22.         return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0);

  23. }
[/pawn]

Можешь объяснить что дает этот код? Не до конца понимаю.
Аватара пользователя
Mapaky9
 
Сообщения: 185
Зарегистрирован: 02 июн 2013, 20:30
Откуда: Уфа
Благодарил (а): 61 раз.
Поблагодарили: 67 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5