[TUT] Как создать свою пушку?Автор: GordonFreemanИсточник: http://serfreeman1337.narod.ru/weapon_mod.htmlСоздание своей пушки - очень легкое дело. Прежде всего нам стоит определиться что-за оружие у нас будет, подобрать модели и звуки. Хотя, все таки преждего всего нам надо почитать про
Weapon Mod API. И так, давайте сделаем клон glock 18, но уже в стиле пистолет-пулемёта: 600 выстрелов в минуту. Как только определились, можно приступать к крафтингу плагина. Для начала подключим необходимый модуль:
Код:
#include <hl_wpnmod> // Weapon Mod
Теперь нам стоит определиться с ресурсами. У нас это будут стандартные звуки и модели от обычного глока. Для удобности напишем пару макросов:
Код:
#define MODEL_WORLD "models/w_9mmhandgun.mdl" // Модель в мире
#define MODEL_VIEW "models/v_9mmhandgun.mdl" // Модель в руках у игрока
#define MODEL_PLAYER "models/p_9mmhandgun.mdl" // Модель в руках модели игрока &)
#define MODEL_CLIP "models/w_9mmclip.mdl" // Магазин
#define SOUND_FIRE "weapons/pl_gun3.wav" // Звук выстрела
#define SOUND_RELOAD "weapons/reload1.wav" // Звук перезарядки
Как и все ресурсы, нам необходимо прекэшить их. Для этого в инклюде есть небольшые макросы для каждого случая:
Код:
#define PRECACHE_MODEL(%0) engfunc(EngFunc_PrecacheModel,%0)
#define PRECACHE_SOUND(%0) engfunc(EngFunc_PrecacheSound,%0)
#define PRECACHE_GENERIC(%0) engfunc(EngFunc_PrecacheGeneric,%0)
Прекэшим наши ресурсы:
Код:
public plugin_precache()
{
PRECACHE_MODEL(MODEL_VIEW)
PRECACHE_MODEL(MODEL_WORLD)
PRECACHE_MODEL(MODEL_PLAYER)
PRECACHE_MODEL(MODEL_CLIP)
PRECACHE_SOUND(SOUND_FIRE)
PRECACHE_SOUND(SOUND_RELOAD)
PRECACHE_GENERIC("sprites/weapon_9mmsmg.txt")
}
Теперь нам необходимо зарегестрировать наше оружие в модуле, для этого используем натив
wpn_mod_register_weapon. И так, давайте создадим несколько макросов с настройками оружия и зарегистрируем его.
Код:
// Параметры нашего оружия
#define WEAPON_NAME "weapon_9mmsmg" // Название оружия
#define WEAPON_SLOT 2 // Слот HUD'a, в котором будет отображаться наше оружие
#define WEAPON_POSITION 4 // Позиция в слоте
#define WEAPON_PRIMARY_AMMO "9mm" // Название припасов оружия, в нашем случаем - 9mm
#define WEAPON_PRIMARY_AMMO_MAX 250 // Максимальное кол-во боеприпасов
#define WEAPON_SECONDARY_AMMO "" // Вторичные боеприпасы - их нету
#define WEAPON_SECONDARY_AMMO_MAX -1 // нету
#define WEAPON_MAX_CLIP 30 // Максимальное кол-во патронов в магазине
#define WEAPON_DEFAULT_AMMO 100 // Начальное кол-во боеприпасов
#define WEAPON_FLAGS 0 // Флаги оружия
#define WEAPON_WEIGHT 12 // "Вес" оружия, при выборе его autoweaponswitching
#define WEAPON_DAMAGE 14.0 // Урон оружия
// Создадим отдельные боеприпасы со 100 патронами
#define AMMOBOX_CLASSNAME "ammo_9mmsmg"
public plugin_init()
{
new smg = wpnmod_register_weapon
(
WEAPON_NAME,
WEAPON_SLOT,
WEAPON_POSITION,
WEAPON_PRIMARY_AMMO,
WEAPON_PRIMARY_AMMO_MAX,
WEAPON_SECONDARY_AMMO,
WEAPON_SECONDARY_AMMO_MAX,
WEAPON_MAX_CLIP,
WEAPON_FLAGS,
WEAPON_WEIGHT
)
// Регистрируем наше оружие, устанавливаем его параметры из дефайнов
}
Мы его зарегистрировали, в smg находится ID нашего оружия. Что с ним делать? С помошью этого ID мы можем регистрировать различные хуки нашего оружия, для этого используем натив
wpnmod_register_weapon_forward и следующие
типы хуков:
Код:
Fwd_Wpn_Spawn - Вызывается при создании/спавне энтити оружия.
Fwd_Wpn_Deploy - Вызывается при активировании игроком оружия.
Fwd_Wpn_Idle - Период бездействия оружия, IDLE.
Fwd_Wpn_PrimaryAttack - Вызвается, когда владелец оружия нажал левую клавишу мыши. Главная атака.
Fwd_Wpn_Reload - Перезарядка оружия.
Fwd_Wpn_Holster - Вызывается при убирании оружия в "кобуру".
Регистрируем хуки:
Код:
wpnmod_register_weapon_forward(smg,Fwd_Wpn_Spawn,"fw_SmgSpawn")
wpnmod_register_weapon_forward(smg,Fwd_Wpn_Deploy,"fw_SmgDeploy")
wpnmod_register_weapon_forward(smg,Fwd_Wpn_Holster,"fw_SmgHolster")
wpnmod_register_weapon_forward(smg,Fwd_Wpn_Idle,"fw_SmgIdle")
wpnmod_register_weapon_forward(smg,Fwd_Wpn_PrimaryAttack,"fw_SmgPrimaryAttack")
wpnmod_register_weapon_forward(smg,Fwd_Wpn_Reload,"fw_SmgReload")
Жизнь вашего оружия начинается с его появления на карте, модуль спавнит энтитю, которой нужно вручную установить требуемые параметры. Пишем небольшую функцию на установку оружию мировой модели и начального боезапаса.
Код:
public fw_SmgSpawn(const ent)
{
SET_MODEL(ent,MODEL_WORLD)
wpnmod_set_offset_int(ent, Offset_iDefaultAmmo, WEAPON_DEFAULT_AMMO)
}
Для установки начального количества боеприпасов мы использовали натив wpnmod_set_offset_int, который служит для безопасной модификации памяти по смещению.
Продолжение следует...
ЗЫ
Скоро.

_________________

Vi Veri Veniversum Vivus Vici