<?xml version="1.0" encoding="utf-8"?>
<!-- Generated on Thu, 04 Jun 2026 18:33:17 +0200 -->
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GMod-Fan Inc. - Форум</title>
    <link>https://gmod-fan.com/forum/discussions/topic-5432.html</link>
    <description>Последние ответы в теме: Урок по созданию мода.</description>
    <generator>LogicBoard</generator>
    <item>
      <title>Урок по созданию мода.</title>
      <description><![CDATA[Хороший гайд<img class='smiles_img' src='https://gmod-fan.com/forum/templates/Adaptive/bbcode/smiles/015.gif' /><!--br--><br /><center><img src='http://i.imgur.com/84gBRo5.gif' alt='Прикрепленная картинка' /></center>﻿]]></description>
      <link>https://gmod-fan.com/forum/discussions/last/topic-5432.html</link>
      <pubDate>Fri, 15 Apr 2016 17:05:36 +0200</pubDate>
      <author>art8mka</author>
      <guid isPermaLink="true"><![CDATA[https://gmod-fan.com/forum/discussions/last/topic-5432.html]]></guid>
    </item>
    <item>
      <title>Урок по созданию мода.</title>
      <description><![CDATA[В прошлом <a href="http://gmod-fan.ru/forum/discussions/topic-5417.html" >уроке</a> вы научились основам создания аддона,теперь я научу вас созданию полноценного мода.<br />Аддон-пример будет называться - &quot;SandBox Player Classes&quot; классы для игрока как в Team Fortress 2. <br />Делаем все как в прошлом уроке - создадим папки и файлы.<br />Итак в папке server мы создадим lua файлик.<br />Теперь,собственно,приступим к кодингу.<br />Впишем в lua файл:<br />function SelectPlayerClasses( ply ) // Создадим новую функцию,которую будет использовать хук.&quot;ply&quot; - Это игрок который подключился к игре. <br />if engine.ActiveGamemode()==&quot;sandbox&quot; then // Создадим условие,чтобы этот мод работал только в игровом режиме &quot;SandBox&quot;.<br />local mathx = math.random(1,11) // Создадим локальную переменную которая будет с помощью кода &quot;math.random&quot; случайно выбирать классы.<br />// Чтобы добавить еще классы вам нужно вместо 11 в math.random,вписать следующие числа.<br />if mathx == 1 then // Всего у нас будет 11 классов.При желании вы можете добавить ещё,нужно только добавить следующие числа.<br />ply:SetNWInt(&quot;ClassType&quot;,1)<br />elseif mathx == 2 then<br />ply:SetNWInt(&quot;ClassType&quot;,2)<br />elseif mathx == 3 then<br />ply:SetNWInt(&quot;ClassType&quot;,3)<br />elseif mathx == 4 then<br />ply:SetNWInt(&quot;ClassType&quot;,4)<br />elseif mathx == 5 then<br />ply:SetNWInt(&quot;ClassType&quot;,5)<br />elseif mathx == 6 then<br />ply:SetNWInt(&quot;ClassType&quot;,6)<br />elseif mathx == 7 then<br />ply:SetNWInt(&quot;ClassType&quot;,7)<br />elseif mathx == 8 then<br />ply:SetNWInt(&quot;ClassType&quot;,8)<br />elseif mathx == 9 then<br />ply:SetNWInt(&quot;ClassType&quot;,9)<br />elseif mathx == 10 then<br />ply:SetNWInt(&quot;ClassType&quot;,10)<br />elseif mathx == 11 then<br />ply:SetNWInt(&quot;ClassType&quot;,11) // Чтобы добавить больше классов,вам нужно вписать новое условие.Пример(Уберите кавычки если хотите добавить класс.):<br />// elseif mathx == 12 then <br />// ply:SetNWInt(&quot;ClassType&quot;,12)<br />end<br />timer.Simple(14,function() // Создадим таймер который через 14 секунд после подключения игрока,выведет текст в чате.<br />if IsValid(ply) then // Условие для проверки существования игрока.Чтобы не вызывало ошибок.<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Приветствуем &quot; .. ply:Nick() .. &quot;! \nВаш класс:&quot; .. ply:GetNWString(&quot;ClassName&quot;)) // Сообщение выводимое игроку через 14 секунд.<br />// Текст нужно вписать в кавычках,ply:Nick() - это ник игрока,ply:GetNWString(&quot;ClassName&quot;) -это название класса игрока.<br />// Чтобы в текст вписать значения из какого-нибудь кода,вам нужно закрыть текст кавычкой и затем вписать .. затем название кода.<br />end<br />end) // Функция закрытия таймера.Обязательно после end вписать скобку.<br />end<br />end<br />hook.Add( &quot;PlayerInitialSpawn&quot;, &quot;SelectPlayerClassesUniqueid&quot;, SelectPlayerClasses ) // Хук с событием &quot;PlayerInitialSpawn&quot; когда игрок подключается к серверу.<br /><br />Далее мы будем давать класс игроку после его возрождения:<br /><br />function SetPlayerClass( ply ) <br />if engine.ActiveGamemode()==&quot;sandbox&quot; then <br />timer.Simple(0.02,function() // Движок не сразу выдает оружие игроку.Поэтому нам нужно сделать таймер который активирует наш код через 0.02 секунд.<br />if IsValid(ply) then<br />local classtype = ply:GetNWInt(&quot;ClassType&quot;) // Находим класс игрока.Номер класса игрока мы выдали когда игрок подключился,в верхней функции.<br />ply:RemoveAllItems() // Удаляем все оружие и патроны игрока.<br />local name // Создадим локальную переменную которой присвоим название класса.Название класса будет выдаваться в функции класса.<br />if classtype == 1 then<br />name = Class.Gordon(ply)<br />elseif classtype == 2 then<br />name = Class.Healer(ply)<br />elseif classtype == 3 then<br />name = Class.Berserker(ply)<br />elseif classtype == 4 then<br />name = Class.Metropolice(ply)<br />elseif classtype == 5 then<br />name = Class.Soldier(ply)<br />elseif classtype == 6 then<br />name = Class.Elite(ply)<br />elseif classtype == 7 then<br />name = Class.Shotgunner(ply)<br />elseif classtype == 8 then<br />name = Class.Cowboy(ply)<br />elseif classtype == 9 then<br />name = Class.Demoman(ply)<br />elseif classtype == 10 then<br />name = Class.Rebel(ply)<br />elseif classtype == 11 then<br />name = Class.Trooper(ply) // Всего 11 классов по методу описанному выше,вы можете добавить еще.Надо вписать функцию класса.<br />end<br />ply:SetNWString(&quot;ClassName&quot;,tostring(name)) // Впишем сюда название класса.Этот код мы использовали в функции выше,где мы выводим текст.<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Ваш класс:&quot; .. tostring(name)) // Выводим название класса игроку после его возрождения.<br />// tostring(name) - без него будут ошибки.Иногда переменная name будет выдаваться не в формате текста,поэтому нам нужен этот код.<br />end<br />end)<br />end<br />end<br />hook.Add( &quot;PlayerSpawn&quot;, &quot;SetPlayerClassUniqueid&quot;, SetPlayerClass ) // Хук с событием &quot;PlayerSpawn&quot; когда игрок возрождается.<br /><br />Теперь приступим к созданию самих классов:<br /><br />Class = {} // Создадим таблицу Class для наглядности.<br /><br />function Arsenal(ply,wep) // Создадим функцию которую будем использовать для выдачи оружия классу.ply - игрок которому выдаем оружие.wep - название оружия.<br />ply:Give(wep) // Вот сам код выдачи оружия.<br />end<br /><br />function Ammunition(ply,num,item) // Функция для выдачи патронов игроку.num - количество патрон.item - название патрон.<br />ply:GiveAmmo(num,item,true)<br />end<br /><br />function Class.Gordon(ply) // Теперь создадим первый класс.<br />// И первым нашим классом будет Фриман.<br />local name = &quot;Гордон Фриман&quot; // Название класса,вписать в кавычках.<br />Arsenal(ply,&quot;weapon_crowbar&quot;) // Вызываем функцию выдачи оружия которую мы написали выше.Название оружие вписать в кавычках.<br />Arsenal(ply,&quot;weapon_physcannon&quot;)<br />Arsenal(ply,&quot;weapon_bugbait&quot;)<br />Arsenal(ply,&quot;item_battery&quot;) // Это понадобиться нам для брони.<br />Arsenal(ply,&quot;item_battery&quot;)<br />return name // Это нам нужно для вывода названия класса игроку.<br />end<br /><br />function Class.Healer(ply)<br />local name = &quot;Доктор&quot;<br />Arsenal(ply,&quot;weapon_crowbar&quot;)<br />Arsenal(ply,&quot;weapon_pistol&quot;)<br />Arsenal(ply,&quot;weapon_medkit&quot;)<br />Ammunition(ply, 40, &quot;Pistol&quot;) // Вызываем функцию выдачи патрон.Количество вписать без кавычек.Название патрон с кавычками.<br />return name<br />end<br /><br />function Class.Berserker(ply)<br />local name = &quot;Боец&quot;<br />Arsenal(ply,&quot;weapon_fists&quot;)<br />Arsenal(ply,&quot;weapon_crowbar&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />ply:SetWalkSpeed(ply:GetWalkSpeed() + 200) // Увеличим скорость ходьбы игроку.К начальной скорости добавим 200 единиц.<br />ply:SetRunSpeed(ply:GetWalkSpeed() + 450) // Увеличим скорость бега игроку.<br />return name<br />end<br /><br />function Class.Metropolice(ply)<br />local name = &quot;Полицейский&quot;<br />Arsenal(ply,&quot;weapon_stunstick&quot;)<br />Arsenal(ply,&quot;weapon_pistol&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Ammunition(ply, 100, &quot;Pistol&quot;)<br />// Вы также сможете указать свою модель игрока для класса.Для этого впишите в функцию класса - ply:SetModel(&quot;models/player/police.mdl&quot;) в кавычках название модели.<br />return name<br />end<br /><br />function Class.Soldier(ply)<br />local name = &quot;Солдат&quot;<br />Arsenal(ply,&quot;weapon_smg1&quot;)<br />Arsenal(ply,&quot;weapon_frag&quot;)<br />Arsenal(ply,&quot;weapon_frag&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Ammunition(ply, 200, &quot;SMG1&quot;)<br />return name<br />end<br /><br />function Class.Elite(ply)<br />local name = &quot;Спецназ&quot;<br />Arsenal(ply,&quot;weapon_ar2&quot;)<br />Arsenal(ply,&quot;weapon_frag&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Ammunition(ply, 200, &quot;AR2&quot;)<br />Ammunition(ply, 1, &quot;AR2AltFire&quot;)<br />return name<br />end<br /><br />function Class.Shotgunner(ply)<br />local name = &quot;Охотник&quot;<br />Arsenal(ply,&quot;weapon_shotgun&quot;)<br />Arsenal(ply,&quot;weapon_frag&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Ammunition(ply, 40, &quot;Buckshot&quot;)<br />return name<br />end<br /><br />function Class.Cowboy(ply)<br />local name = &quot;Ковбой&quot;<br />Arsenal(ply,&quot;weapon_pistol&quot;)<br />Arsenal(ply,&quot;weapon_357&quot;)<br />Ammunition(ply, 60, &quot;Pistol&quot;)<br />Ammunition(ply, 16, &quot;357&quot;)<br />return name<br />end<br /><br />function Class.Demoman(ply)<br />local name = &quot;Подрывник&quot;<br />Arsenal(ply,&quot;weapon_frag&quot;)<br />Arsenal(ply,&quot;weapon_slam&quot;)<br />Arsenal(ply,&quot;weapon_slam&quot;)<br />Arsenal(ply,&quot;weapon_rpg&quot;)<br />Ammunition(ply, 2, &quot;RPG_Round&quot;)<br />Ammunition(ply, 2, &quot;Grenade&quot;)<br />return name<br />end<br /><br />function Class.Rebel(ply)<br />local name = &quot;Повстанец&quot;<br />Arsenal(ply,&quot;weapon_crossbow&quot;)<br />Arsenal(ply,&quot;weapon_crowbar&quot;)<br />Ammunition(ply, 10, &quot;XBowBolt&quot;)<br />return name<br />end<br /><br />function Class.Trooper(ply)<br />local name = &quot;Кавалерист&quot;<br />Arsenal(ply,&quot;flechette_gun&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />Arsenal(ply,&quot;item_battery&quot;)<br />return name<br />end<br /><br />Ну вот мы создали все 11 классов.<br />Теперь перейдем к консольным командам.<br />Создадим команду перевыбора классов для всех игроков,и которую будет вызывать только админ.<br />Команда будет называться - pc_repick_classes.<br /><br />function Repick(ply) // ply - игрок который  использовал консольную команду.<br />if engine.ActiveGamemode()==&quot;sandbox&quot; then <br />if ply:IsAdmin() then // Проверяем игрока на права админа.<br />for k,v in pairs(player.GetAll()) do // Находим всех игроков и перевыбираем им классы.Используем цикл.Где v  - это все игроки на сервере.<br />if IsValid(v) then<br />local mathp = math.random(1,11)<br />if mathp == 1 then<br />ply:SetNWInt(&quot;ClassType&quot;,1)<br />elseif mathp == 2 then<br />ply:SetNWInt(&quot;ClassType&quot;,2)<br />elseif mathp == 3 then<br />ply:SetNWInt(&quot;ClassType&quot;,3)<br />elseif mathp == 4 then<br />ply:SetNWInt(&quot;ClassType&quot;,4)<br />elseif mathp == 5 then<br />ply:SetNWInt(&quot;ClassType&quot;,5)<br />elseif mathp == 6 then<br />ply:SetNWInt(&quot;ClassType&quot;,6)<br />elseif mathp == 7 then<br />ply:SetNWInt(&quot;ClassType&quot;,7)<br />elseif mathp == 8 then<br />ply:SetNWInt(&quot;ClassType&quot;,8)<br />elseif mathp == 9 then<br />ply:SetNWInt(&quot;ClassType&quot;,9)<br />elseif mathp == 10 then<br />ply:SetNWInt(&quot;ClassType&quot;,10)<br />elseif mathp == 11 then<br />ply:SetNWInt(&quot;ClassType&quot;,11)<br />end<br />v:PrintMessage(HUD_PRINTTALK, &quot;Все классы были перевыбраны.Возродитесь чтобы применить свой класс.&quot;) // Выводим текст всем игрокам.<br />end<br />end<br />ply:PrintMessage(HUD_PRINTTALK, &quot;[Админ]Классы успешно перевыбраны!&quot;) // Выводим текст админу который ввел команду.<br />else<br />ply:PrintMessage(HUD_PRINTTALK, &quot;Доступ запрещен!&quot;) // Выводим текст игроку без доступа админа.<br />end<br />end<br />end<br />concommand.Add( &quot;pc_repick_classes&quot;, Repick, nil, nil) // Функция создания консольной команды.В кавычках вписать название команды.Затем название функции.<br /><br />Теперь создадим команду для админа,которая сможет выбирать определенные классы для определенного игрока.<br />Примерное использование команды такое - pc_class_set Hds46 2.Где Hds46 - название игрока.Где 2 - название номера класса.<br /><br />function SetClassForPlayer(ply,cmd,arg,argstr) // cmd - название команды.arg - название введенных значений.argstr - название значений в форме текста.<br />if engine.ActiveGamemode()==&quot;sandbox&quot; then <br />if ply:IsAdmin() then<br />if arg[1] != nil then // Проверяем значение ника игрока на пустоту.<br />if arg[2] != nil then // Проверяем  значение номера класса на пустоту.<br />for k,v in pairs(player.GetAll()) do<br />if IsValid(v) then<br />if arg[1] == v:Nick() then // Проверка на значение ника игрока.Если такой игрок есть функция идет дальше. <br />if IsValid(v) then<br />if (arg[2] == &quot;1&quot; or<br />arg[2] == &quot;2&quot; or<br />arg[2] == &quot;3&quot; or<br />arg[2] == &quot;4&quot; or<br />arg[2] == &quot;5&quot; or<br />arg[2] == &quot;6&quot; or<br />arg[2] == &quot;7&quot; or<br />arg[2] == &quot;8&quot; or<br />arg[2] == &quot;9&quot; or<br />arg[2] == &quot;10&quot; or<br />arg[2] == &quot;11&quot;) then // Проверка на номера классов.У нас ведь всего одиннадцать классов.<br />v:SetNWInt(&quot;ClassType&quot;,tonumber(arg[2])) // Выдадим игроку определенный класс.tonumber(arg[2]) - выводим текст в номер.<br /> // Сообщение игроку получившего класс.<br />v:PrintMessage(HUD_PRINTTALK,&quot;[Админ]&quot; .. ply:Nick() .. &quot; поменял вам класс. \nВозродитесь чтобы получить его.&quot;)<br />ply:PrintMessage(HUD_PRINTTALK,&quot;[Админ]Вы успешно поменяли класс игроку &quot; .. v:Nick() .. &quot;!&quot;) // Вывод текста игроку который ввел команду.<br />else<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Номер класса не существует.&quot;) // Если номер класса определенный сверху нет,то выводим текст игроку.<br />end<br />end<br />end<br />end<br />end<br />else<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Нужно ввести номер класса.&quot;)  // Если игрок не ввел номер класса.<br />end<br />else<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Нужно ввести имя игрока.&quot;) // Если игрок не ввел ник игрока.<br />end<br />else<br />ply:PrintMessage(HUD_PRINTTALK,&quot;Доступ запрещен!&quot;) // Если игрок не админ.<br />end<br />end<br />end<br />concommand.Add( &quot;pc_class_set&quot;, SetClassForPlayer, nil, nil)<br /><br />Ну вот.Вроде бы все,есть классы,консольные команды.<br />Но игроки спавнят оружие через спавн меню.<br />Тогда в папке autorun создадим папку client и там создадим lua файл.<br />В файле прописываем это.<br /><br />local function DisallowSpawnMenu( )<br />   if not LocalPlayer():IsAdmin() then<br />      return false<br />   end<br />end<br /> <br />hook.Add( &quot;SpawnMenuOpen&quot;, &quot;DisallowSpawnMenuCL&quot;, DisallowSpawnMenu)<br /><br />Если игрок не админ,то он не может открыть спавнменю.<br /><br />Чистый код можно скачать <a href="https://yadi.sk/d/9AnYkxcigq5jE" target="_blank">здесь</a>.<br />Этот мод хорошо подходит для deathmatch'а и coop'а.<br />При наличии идей вы сможете создать много разнообразных классов.<br />Не забудьте преобразовать весь код в Utf-8(Без BOM) иначе русский текст не будет отображаться.<br /><br /><br /><br />Также просмотрите мои прежние туториалы.<br /><a href="http://gmod-fan.ru/forum/discussions/topic-5417.html" >Туториал по созданию скриптового аддона.</a><br /><a href="http://gmod-fan.ru/forum/discussions/topic-4832.html" >Создаем оружие стреляющее пулями (SWEP )</a><br /><a href="http://gmod-fan.ru/forum/discussions/topic-2056.html" >Создание собственного оружия (SWEP).</a><br /><br />Вы можете помочь мне материально по WebMoney.<br />Ru-Кошелек: R236462443208<br /><br />Пишите в комментах если у вас появились ошибки или есть предложения.]]></description>
      <link>https://gmod-fan.com/forum/discussions/last/topic-5432.html</link>
      <pubDate>Sun, 24 May 2015 08:07:58 +0200</pubDate>
      <author>Hds46</author>
      <guid isPermaLink="true"><![CDATA[https://gmod-fan.com/forum/discussions/last/topic-5432.html]]></guid>
    </item>
  </channel></rss>