Garry's Mod

Garry's Mod

146 ratings
[Update 3.2] Полный гайд по созданию SWEP (Оружие)
By RenPar Kramer and 1 collaborators
Всегда хотели создать свой SWEP, но не знаете как? Этот подробный гайд поможет вам.
Здесь будет полное описание создания оружия, через видео или текст, что вам удобней
   
Award
Favorite
Favorited
Unfavorite
Гайды от Tak'а
Эти серии видеогайдов от Tak'а учит делать оружия, как любителя, при этом, постепенно вводя в курс дела. Позже планируются более развёрнутые видеоуроки
Если вы хотите сразу начать с сути дела, перемотайте видео на 1:25

Этот гайд посвящён функциям
Если хотите начать с сути дела, перемотайте видео на 1:00
Этот гайд посвящён разным небольшим модернизациям пушки (звуки, иконки, ПКМ атака и прочее)
Если хотите начать с сути дела, перематывайте на 0:52
Этот гайд посвящён тому, как НПС взаимодействуют с пушками
Если хотите начать с сути дела, перемотайте видео на 0:20

Заготовка Tak'a наконец-то готова к использованию. Возможно она будет обновлена еще много раз, но пока что вот такая версия здесь будет лежать.
[UPD] Заготовка больше не обновляется, и я крайне не рекомендую вам ее использовать для создания полноценного оружия. Вы можете конечно поиграться с ней, но все таки пушки лучше писать код с нуля, для того чтобы вы лучше разобрались в нем сами.
Скачать ее можно тут[github.com]
[ПРЕДУПРЕЖДЕНИЕ]
UPD от RenPar'а: текстовая часть руководства заброшено (так что смотрите лучше гайды от Tak'а, видосики выше). А ещё kinda неактуально от того, что я знаю. Я писал руководство с поверхностным пониманием, так что возможно я мог написать где-то дичи. А переписывать с новым пониманием нет энтузиазма, так как я покинул давным-давно сферу что-то писать, рассказывать
Гайд от RenPar'а - Подготовка
Это серия разделов руководства от RenPar'а, которые пытаются ввести в курс дела с 0, и сразу по серьёзному, пытаясь объяснить многие вещи до их корней

Предупреждение
Будет лучше, если вы будете хотя бы знать основы lua, или очень схожего с ним языка. Иначе многие вещи будет трудно понять

Программа
Для начала, нам нужна программа, которая способна редактировать lua файлы. Для этого может подойти обычный блокнот, но лучше Notepad++, поскольку он способен распознавать синтаксис языка lua, и сообщать вам об ошибках
Исключение: команды, созданные для Garry's Mod)

Создание lua файла
Чтобы создать файл с расширением .lua, нужно использовать один из способов, представленных ниже:
  • Панель управления\Оформление и персонализация\Параметры папок\Показ скрытых файлов и папок -> Скрывать расширения для зарегистрированных типов файлов [Галочку расстрелять]
    Теперь вы можете менять расширение файла через "Переименовать файл"

  • (Способ RenPar'а) Создаём блокнот и ZIP архив. Первое закидываем во второе и меняем там расширение

Для начала, нужно создать папку, по указанному пути. Это будет папка нашего аддона:
GarrysMod\garrysmod\addons\[Создаваемая папка]
Далее в этой папке нужно создать папку lua, а в ней папку weapons
После создания [Название оружия].lua, мы его закидываем в папку игры по такому пути:
GarrysMod\garrysmod\addons\[Наш аддон]\lua\weapons

Готово, теперь игра способна читать ваш lua файл. В нашем же случае, игра предоставит нам возможность использовать нами созданное оружие

Дополнительно
Вы можете скачать готовую заготовку lua файла от Tak'а
Ссылка[www20.zippyshare.com]
SWEP.Base
Что это такое, и для чего оно нужно?
Я бы просто сделал описание в списке и забыл. Но нужно знать, что это такое. Но изменять НЕ РЕКОМЕНДУЮ. Только для сильно прошаренных в этом деле. Это скрытый фундамент нашего оружия, о котором многие новички не подозревают.

Чем же это значение является? Мы садимся писать lua файл, и прописываем SWEP.Spawnable = true. Готово, у нас появилось оружие в Garry's Mod от одной строчки. И всё уже есть, и вид от 1 лица, и от 3 лица. Да даже стрельба и перезарядка есть. Хотя мы прописали всего одно значение, когда мы разрешили заспавнить оружие через Q меню.

Так почему это происходит?

Всё дело в SWEP.Base, а конкретней
SWEP.Base = "weapon_base"
Это значение подключает библиотеку кода к нашему орудию. И в данном случае (это стандартное свойство значения) используется папка weapon_base, зарытая в папке игры. Там расположено 5 lua файлов, но трогать их не стоит. Максимум заглянуть для изучения (там разработчик оставил описания многих вещей).

Как же это работает? А всё просто, все значения, которые не прописаны в lua файле нашего оружия, подстраиваются сами во время работы игры. К примеру: мы забыли прописать SWEP.Category. Библиотека сама подставит значение со стандартной опцией. Это SWEP.Category = "Other". Всё просто. Там к тому же и прописаны функции огня и перезарядки.
Интересный факт: SWEP.Base каким-то образом сам себя прописывает в коде оружия. Так что, писать его необязательно

Вывод
Если вы забыли что-то прописать: значение или функцию, библиотека кода автоматически его добавит, но со стандартными опциями. И на заметку юным экспериментаторам: вот и причина того, почему перестаёт работать оружие (в плане огня и перезарядки), когда мы начинаем писать функции этого самого огня и перезарядки, не указав действия/неверно написав. Библиотека видит, что уже есть функция огня/перезарядки, и не подставляет свою.
Function & Hook
Hooks - Хуки
Начну сразу со сравнения. Hook - в переводе с английского, крюк. А крюк за что-то цепляется.
В Garry's Mod'е их не зря назвали так. Начнём по порядку.

Для примера напишу это:
function SWEP:Equip()
print "Hello World!"
end
Простая функция. Функцию обычно вызывают где-либо (к примеру, в участке кода), чтобы она там выполнила работу и предоставила какой-то результат. Удобная штука. Но в игре это немного сложнее. Чтобы её вызвать, нужны хуки. А хуки в свою очередь вызывают функции при определённых условиях. В моей функции используется хук SWEP.Equip. Он запускает функцию, когда игрок получает оружие в инвентарь.

Ход работы:
  • Игрок получает оружие
  • Активируется функция с хуком SWEP.Equip
  • В консоль пишется Hello World!

Идём дальше. Хуки могут приносить с собой переменные, если того захочет программист. Модифицируем код:
function SWEP:Equip(ply) print "Hello World!" ply:TakeDamage (10) end
SWEP.Equip может принести только одну переменную: это ID игрока, который поднял оружие. И я сделал так, чтобы мы нанесли урон этому игроку, после поднятия. Кстати, обычно так многие и пишут ply, но это обычная переменная. То есть, вы можете написать таким образом:
function SWEP:Equip(a) print "Hello World!" a:TakeDamage (10) end
И всё будет прекрасно работать. Это просто переменная, а не неизвестная фигня. Но новички часто путаются из-за этого.

Ход работы:
  • Игрок получает оружие
  • Активируется функция с хуком SWEP.Equip, которая приносит переменную с информацией об ID игрока, который поднял оружие
  • В консоль пишется Hello World!
  • Игроку наносится 10 урона

Return
У некоторых функций есть особые значения: return'ы, с помощью которых обычно выставляется true/false во время работы. Но и не просто true/false, а говорящие
function SWEP:Holster() return true end
Эта функция вызывается, когда игрок пытается сменить наше оружие на чужое. Но если функция будет пустой, ничего не будет происходить. Почему? Нет return true в функции. То есть, SWEP:Holster кроме вызова, ещё и имеет условие внутри себя. В данном случае, после работы функции, проверяет, возвращается ли true, и если да, разрешает сменить оружие

А что говорить насчёт функций? Почитайте в справочнике Lua, в полне простой оператор
Simple Functions
[Перед прочтением данного раздела, рекомендуем пробежаться по спискам, чтобы иметь хотя бы какое-то представление, что для чего отвечает. Если в списке я объяснил, что это такое, то тут не буду, в целях избегания "воды"]
Вы всегда можете модифицировать или изменить функции. Всё зависит от ваших знаний и фантазий. Тут же приведён слегка модифицированный пак функций из weapon_base

Анимация от 3 лица
function SWEP:Initialize() self:SetHoldType( "ar2" ) end
[Weapon]:SetHoldType( "[Пак анимаций]" ) - применяется к этому оружию и носителю индивидуально

Перезарядка
function SWEP:Reload() self:DefaultReload( ACT_VM_RELOAD ) end
[Weapon]:DefaultReload ( [Sequence] ) - оператор, который проигрывает целый сценарий анимаций для перезарядки, как от 1 лица, так и от 3. Но в основном от первого. И текущее значение универсально к правильным моделям. Чтобы знали: VM - View Model

Смена оружия/запрет оружия
function SWEP:Holster() return true end
[Было уже описано в списке и в других разделах]

Эффекты и анимации
function SWEP:ShootEffects() self:SendWeaponAnim( ACT_VM_PRIMARYATTACK ) self.Owner:MuzzleFlash() self.Owner:SetAnimation( PLAYER_ATTACK1 ) end
Это даже не хук. Эта функция вызывается в другой (и в нашем случае, в основном огне)
[Weapon]:SendWeaponAnim( [Sequence]) - оператор, который включает пак анимаций от 1 лица во время атаки
[Entity]:MuzzleFlash() - вспышка от 1 лица при выстреле (если имеется в модели)
[Entity]:SetAnimation( [Sequence] ) - включение пака анимаций атаки от 3 лица

Атака - описание
Атака разделяется на два вида: основной и дополнительный огонь. И у каждой свои функции, и отличает их всё только припиской Primary или Secondary. Разобрали
Из чего же состоит атака в коде? А состоит из несколько блоков функций (который вызываются не с помощью хуков). Как пирамида. Обо всём по порядку:

SWEP:PrimaryAttack()
Без лишних слов:
function SWEP:PrimaryAttack() if ( !self:CanPrimaryAttack() ) then return end self:EmitSound( "Weapon_AR2.Single" ) self:ShootBullet( 5, 1, 0.02 ) self:TakePrimaryAmmo( 1 ) self.Owner:ViewPunch( Angle( -0.5, 0, 0 ) ) self:SetNextPrimaryFire( CurTime() + 0.2 ) end
В ЛКМ функции заложено несколько других:
  • [Weapon]:CanPrimaryAttack() - функция проверки патрон. Может ли оружие стрелять
  • [Weapon]:ShootBullet( [Урон], [Кол-во пуль], [Разброс] ) - функция огня/стрельба пулями
  • [Weapon]:TakePrimaryAmmo ( [Затраты на выстрел] ) - функция траты боезапаса
Начну с операторов:
  • [Entity]:EmitSound ( "[Звук]" ) - звук выстрела
  • [Player]:ViewPunch ( Angle ( -0.5, 0 , 0 ) ) - отдача при выстреле
  • [Weapon]:SetNext PrimaryFire ( CurTime() + 0.2 ) - задержка между выстрелами
    Примечание: Angle( Pitch, Yaw, Roll ) - это оператор углов. Как-бы объяснить. Эти 3 значения отвечают каждый за свою сторону. Загуглите вместе эти 3 слова и там будут картинки.
    CurTime() - оператор, взаимодействующий с игровым временем. Через него задают время
Ход работы:
  • Игрок нажимает ЛКМ, вызывается функция SWEP:PrimaryAttack()
  • В функции вызывается SWEP:CanPrimaryAttack(), которая после работы возвращает значение true/false
  • True: закончить работу
  • False: проигрывается звук, ставится задержка выстрела
  • False: вызывается две других функции, одна после работы выстреливает пули, другая отнимает боезапас

Function SWEP:CanPrimaryAttack()
if ( !self:CanPrimaryAttack() ) then return end
(Для информации - после выполнения работы, функция SWEP:CanPrimaryAttack() должна возвращать true/false)
Как это всё работает? Прочитаю вам на русском:
Если можно атаковать, то мы прекращаем работу функции
Но почему если мы можем стрелять, прекращает работу функции? А вы заметили ! перед self? Этот символ инвертирует значения наоборот. Из true в false и наоборот. Почему я сразу не прочитал правильно? Чтобы объяснить. Но почему ставится ! перед оператором? Ответ вы найдёте в самой функции:
function SWEP:CanPrimaryAttack() if ( self:Clip1() <= 0 ) then self:EmitSound( "Weapon_Pistol.Empty" ) self:SetNextPrimaryFire( CurTime() + 0.2 ) return false end return true end
Эти операторы уже были в прошлой функции (EmitSound & SetNextPrimaryFire), так что впредь не буду их упоминать.
Нас интересует If:
if ( self:Clip1() <= 0 ) then return true end return false
Если магазин основного боезапаса меньше или равен 0, то сделать следующее: ...
[Weapon]:Clip1() - оператор, который достаёт информацию о том, сколько патрон в текущем магазине

Почему ! перед self:
Почему же стоит ! перед self в прошлой функции? Сделано больше для удобства. То есть мы языком выражаем в текущей функции, что мы не можем стрелять. А для условия (if) мы конвертируем в противоположный boolean. То есть, на языке программиста тут не трудно запутаться. Можно конечно убрать этот самый символ, и добавить в условие else, туда переместить return, а в этой функции поменять местами true и false в return'ах

SWEP:TakePrimaryAmmo( [Перемен.{1}] )
Эта функция схожа с предыдущей, но имеет пару отличий как в плане кода, так и в плане предназначения.
function SWEP:TakePrimaryAmmo( num ) if ( self:Clip1() <= 0 ) then if ( self:Ammo1() <= 0 ) then return end self.Owner:RemoveAmmo( num, self:GetPrimaryAmmoType() ) return end self:SetClip1( self:Clip1() - num ) end
Если нет патрон в магазине и в кармане: закончить работу
Если нет патрон в магазине, но есть в кармане: удалить кол-во патрон
Если есть патроны в магазине: вычесть кол-во патрон с магазина
  • Перемен.{1} - кол-во пуль, которые будут забраны.
  • [Player]:RemoveAmmo( кол-во пуль, вид патрон )
  • [Weapon]:GetPrimaryAmmoType() - достаёт информацию о виде патрон в оружии

SWEP:ShootBullet()
Вот и самое главное: пули и система огня
Чтобы не было путаницы, я не буду называть переменные, а просто опишу, к чему оно относится. Вы же можете потом изменить
function SWEP:ShootBullet( [Урон], [Кол-во пуль], [Разброс], [Вид патрон], [Сила], [Шлейф???] ) local bullet = {} bullet.Num = [Кол-во пуль] bullet.Src = self.Owner:GetShootPos() bullet.Dir = self.Owner:GetAimVector() bullet.Spread = Vector( [Разброс], [Разброс], 0 ) bullet.Tracer = [Шлейф???] || 5 bullet.Force = [Сила] || 1 bullet.Damage = [Урон] bullet.AmmoType = [Вид патрон] || self.Primary.Ammo self.Owner:FireBullets( bullet ) self:ShootEffects() end
[Player]:GetShootPos() - оператор, добывающий информацию, на какую точку смотрит игрок
[Player]:GetAimVector() - оператор, добывающий информацию о направлении взгляда игрока
|| (две вертикальной линии) - это знак ИЛИ. То есть, если переменной нет, или она пустая, присваивается другое значение, следующее по очереди.
[Entuty]:FireBullets( [Таблица с информацией о пулях] ) - оператор, стреляющий пулями, используя информацию из таблицы
[Weapon]:ShootEffects() - запуск функции, несущую графическую роль
Самая большая функция в стандартных оружиях, но и не такая сложная, как на первый взгляд. Мы в начале создаём пустую таблицу и заполняем её. А потом просто в одном из операторов используется эта самая таблица.
P.S. Таблицу лучше создавать локальной, так как таблица за пределами функции не нужна. Да и могут возникнуть проблемы, если будет несколько версий пуль/атак с глобальной таблицей пуль на всех.
{Список} SWEP.[Значение]
Это что-то типо редактора персонажа в RPG, только для оружия
    Информационные значения
  • [1]SWEP.PrintName = "[Название орудия]"
  • [2]SWEP.Category = "[Название категории]"
  • [3]SWEP.Author = "[Автор]"
  • [4]SWEP.Contact = "[Контакты автора]"
  • [5]SWEP.Purpose = "[Для чего предназначается оружие]"
  • [6]SWEP.Instructions = "[Инструкция]"

  • [1] Отображается на интерфейсе и в Q меню
  • [2] Папка, где будет хранится орудие в Q меню
  • [3-6] Дополнительная информация об оружии, которая будет отображаться при выборе, если SWEP.DrawWeaponInfoBox = true
  • Примечание: информация может отображаться в иных местах, в зависимости от HUD и разных аддонов

    Вид от 1 и 3 лица
  • [1]SWEP.ViewModel = "models/weapons/v_rif_famas.mdl"
  • [2]SWEP.ViewModelFlip = true/false
  • [3]SWEP.ViewModelFlip1 = true/false
  • [4]SWEP.ViewModelFlip2 = true/false
  • [5]SWEP.ViewModelFOV = 62
  • [6]SWEP.BobScale = 1
  • [7]SWEP.SwayScale = 1
  • [8]SWEP.CSMuzzleFlashes = true/false
  • [9]SWEP.CSMuzzleX = true/false
  • [10]SWEP.UseHands = true/false
  • [11]SWEP.WorldModel = "models/weapons/w_rif_famas.mdl"

  • [1] Модель, используемая от 1 лица
  • [2-4] Отзеркалить модель в другую сторону. К примеру: правша-левша. [3-4] Предназначены для дополнительных View моделей, которое использует оружие
  • [5] Насколько далеко будет расположена модель от камеры
  • [6] Тряска модели при ходьбе/беге. Ноль - нет реакции. Положительное число: насколько сильно будет трясти влево-вправо. Отрицательное - тоже самое, но анимация проигрывается задом наперёд
  • [7]Отставание модели от движения камеры игрока. Работает также, как и с [6]. Только при отрицательных значениях, модель скачет в сторону поворота камеры
  • [8] Специально для CS:S моделей. Исправляет вспышку от выстрела
  • [9] Специально для CS:S моделей. Изменяет форму вспышки. Требует значения true у [8]
  • [10] Возможность использовать в модели кастомные руки от player model'ей. Корректно будет работать, если у модели эта функция поддерживается.
  • [11] Модель, используемая от 3 лица

    HUD
  • [1]SWEP.BounceWeaponIcon = true/false
  • [2]SWEP.DrawWeaponInfoBox = true/false
  • [3]SWEP.DrawAmmo = true/false
  • [4]SWEP.DrawCrosshair = true/false
  • [5]SWEP.Slot = 1
  • [6]SWEP.SlotPos = 1

  • [1] Анимация попрыгивания в интерфейсе выбора
  • [2] Прорисовывать дополнительную информацию при выборе оружия в слотах
  • [3] Прорисовывать в HUD'е количество боезапаса
  • [4] Прорисовывать прицел
  • [5] Столбец, в котором будет хранится оружие после подбора
  • [6] Приоритет распределения оружия по слотам. Чем выше число, тем ниже, по сравнению с другими оружиями в этом столбце, будет опускаться
  • Примечание: в [5-6] отчёт идёт с 0. То есть: первый столбец будет как 0. Второй как 1 и так далее

    Опции
  • [1]SWEP.Spawnable = true/false
  • [2]SWEP.AdminOnly = true/false
  • [3]SWEP.AutoSwitchTo = true/false
  • [4]SWEP.AutoSwitchFrom = true/false
  • [5]SWEP.DisableDuplicator = true/false
  • [6]SWEP.m_WeaponDeploySpeed = 1

  • [1] Возможность взять оружие из Q меню
  • [2] Доступен только для админов
  • [3] Автоматическая смена оружия на наше, когда мы его подбираем
  • [4] Автоматическая смена оружия на чужое, когда мы подбираем чужое
  • [5] Отключить дубликатор на наше оружие, когда оно лежит в не подобранном виде
  • [6] Скорость смены оружия, при его выборе

    Без категории
  • SWEP.Base = "weapon_base"
  • Подстраивает свою библиотеку кода. О ней подробней в другом разделе

    Неизвестные/неизученные значения
  • SWEP.ClassName = "{???}"
  • SWEP.Owner = {???}
  • SWEP.Weight = 5
  • SWEP.RenderGroup = {???}
  • SWEP.SpeechBubbleLid = {???}
  • SWEP.WepSelectIcon = {???}
  • SWEP.Folder = {???}
  • SWEP.AccurateCrosshair = true/false
  • SWEP.ScriptedEntityType = {???}
  • SWEP.m_bPlayPickupSound = true/false
{Список} Hooks - хуки
Это можно представить как настольную игру с какими-то правилами. Но для компьютера. По типу:
[Игрок нажал ЛКМ (hook) -> Вытяните карту (function) -> Сделайте то, что там написано (операторы)]
Variable - переменная. Я буду использовать сокращение: var.
Boolean - true/false. Я буду использовать сокращение: BL
Return - какое-то условие, чаще всего BL. Чтобы дать проверить условие, пишем return true/false/переменную

    События
  • [1]SWEP:Equip(Var)
  • [2]SWEP:Deploy()
  • [3]SWEP:Holster(Var)

  • [1] Активируется, когда игрок получает оружие в инвентарь. Var - ID игрока, который получил оружие
  • [2] Активируется, когда мы достаём оружие из инвентаря [P.S. Есть неизученный return]
  • [3] Активируется, когда мы пытаемся поменять наше оружие на чужое. Var - оружие, на которое мы хотим переключиться
    Return: если после работы [3] возвращается BL = true, то разрешает поменять оружие. False - запрещает

    Действия
  • [1]SWEP:PrimaryAttack()
  • [2]SWEP:Reload()

  • [1] Активируется, когда игрок нажимает ЛКМ
  • [2] Активируется, когда игрок нажимает перезарядку
    Примечание: если у перезарядки нет каких-то действий, или там стоят быстро выполнимые операторы, то при зажиме кнопки R функция будет вызываться каждую миллисекунду

    Необычные
  • [1]SWEP:Initialize()
  • [2]SWEP:Think()

  • [1] Активируется, когда оружие создаётся. То есть: когда мы берём его из Q меню и получаем в инвентарь (а не достаём из него). Ну или когда используем tool gun, чтобы его заспавнить
  • [2] Активируется каждую миллисекунду, когда оружие в руках
{Список} Анимации
    Анимации от 3 лица
  • pistol - пистолет
  • smg - пистолет-пулемёт
  • grenade - граната
  • ar2 - винтовка
  • shotgun - дробовик
  • rpg - базука
  • physgun - физ. ган.
  • crossbow - арбалет
  • melee - лом
  • slam - мины
  • normal - ???
  • fist - кулаки
  • melee2 - двуручное холодное оружие
  • passive - опущенная винтовка
  • knife - нож
  • duel - двуручные пистолеты
  • camera - камера
  • magic - телепатия
  • revolver - револьвер
{Список} bullet.[Значение]
Представьте, что все значения ниже, это как обычный урок информатики, где вы заполняете таблицы в Microsoft Exel. Только вместо базы данных учеников вы заполняете базу данных патронов
P.S. Перед этими значениями должна быть создана таблица local bullet = {}
    Скалярные значения
  • [1]bullet.Damage = [Урон]
  • [2]bullet.Force = [Сила]
  • [3]bullet.Distance = [Дальнобойность]
  • [4]bullet.HullSize = ???
  • [5]bullet.Num = [Кол-во пуль]
  • [6]bullet.Tracer = [След от пули будет появляться через X выстрелов]

  • [1] Урон пули
  • [2] Сила пули (физический толчок, придаваемый физическим объектам)
  • [3] Дистанция, до которой может долететь пуля, в последствии исчезая
  • [4] ???
  • [5] Количество пуль, выпускаемых за раз
  • [6] При стрельбе образуются так называемые следы от пули, данное числовое значение указывает, спустя какое кол-во раз будет появляться следующий след

    Векторные значения
  • [1]bullet.Dir = [Vector ( X, Y, Z )]
  • [2]bullet.Spread = [Vector( X, Y, Z )]
  • [3]bullet.Src = [Vector ( X, Y, Z )]

  • [1] Направление огня
  • [2] Разброс пуль (используются только X и Y)
  • [3] Точка, откуда вылетают пули

    Текстовые значения
  • [1]bullet.AmmoType = "[Вид патронов]"
  • [2]bullet.TracerName = [Тип следов выстрелов]

  • [1] Вид/тип патронов, которым будем присваиваться эта информация
  • [2] Тип следа, оставляемого пулей. Можно вставить название любого эффекта

    ???
  • bullet.Attacker = ???
  • bullet.Callback = ???
  • bullet.IgnoreEntity = ???
FAQ - Вопросы и Ответы
Пока что пусто, вопросов пока не возникало
Полезные ссылки и информация
Обновления и планы
В планах
  • Дополнить раздел {Список}Hooks - хуки
  • Дополнить раздел {Список}bullet.[Значение]
  • Дополнить раздел Simple Functions о оставшихся простых функциях

Update 3.2
  • Добавлен второй видеогайд Tak'а в руководство
  • Небольшие поправки
108 Comments
Tak  [author] Mar 6 @ 1:13pm 
@поглотитель кваса честно я уже вообще не помню что там происходит в заготовке, крайне не советую ей пользоваться для полноценного создания оружия, больше рекомендую её использовать для простого изучения каких-то основных понятий и функционала.
оружие будет стрелять пропами только в том случае, если в функции атаки будет прописан код о создании пропа, также нужно будет выставить его вектор движения, модель и тд и тп.
Tak  [author] Mar 6 @ 1:11pm 
@thegoodman если ты говоришь про текстуры летящих пуль - то только через костыли, превращая их в снаряды.
звук выстрела нужно добавлять через PlaySound, и менять его соответственно там же. Проще всего его добавить в функцию выстрела ближе к концу работы, чтобы все воспроизводилось как следует.
Tak  [author] Mar 6 @ 1:09pm 
@alex гайда нет, у меня нет времени им заниматься, можешь начать с изучения страницы вики по гаррису про C модели.
TheGoodMan Mar 6 @ 7:05am 
как поменять патрон на кастомный? типа поменять текстурку, звук поменять выстрела.
Alex Mar 6 @ 2:17am 
а есть гайд по созданию кастомной модельки оружия с анимациями и c_hands?
как сделать оружие стреляющие пропами/энтити? в шаблоне было написано что надо закоментировать первый SWEP.PrimaryAttack и раскоментировать второй, но после этого оржие вообще перестает стрелять и появляются скриптовые ошибки. помогите пожайлусто!
Tak  [author] Feb 28 @ 10:56am 
название хука может быть любым, цвет в функции killicon.Add ты можешь также поменять на какой захочешь.
в обоих случаях иконки должны быть в формате vtf и иметь файл материала в формате vmt, путь к которому тебе и нужно прописывать в обоих случаях.
Tak  [author] Feb 28 @ 10:56am 
@sobaken_Zloy228
иконки смены оружия делаются через выставление переменной SWEP.WepSelectIcon = "путь/к/твоей/иконке".
иконки убийства делаются через хук DrawDeathNotice через отдельный скрипт в папке autorun, в котором строчки будут выглядеть примерно так:
hook.Add( "DrawDeathNotice" , "НазваниеХука" , function()
killicon.Add( "техническое_название_оружия", "путь/к/иконке/убийства", Color( 255, 255, 255, 255 ))
end )
sobaken_Zloy228 Feb 28 @ 8:27am 
как добавить эти долбанные картинки для смены оружия и иконки убийства помгите плз
Tak  [author] Jan 21 @ 12:25am 
@средняя палочка tw если ошибок нет, то предмет возможно просто скрыт. Иногда ошибки выдаются во время загрузки, так что почекай консоль