Приветствую Вас Гость | RSSГлавная | создание годного заскриптованного оружия с нуля - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Статьи » Создание модов » создание годного заскриптованного оружия с нуля (для новичков)
создание годного заскриптованного оружия с нуля
puksusДата: Пятница, 03.01.2014, 15:21 | Сообщение # 1
Пукс
Группа: Модераторы
Сообщений: 957
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Долбанные отступы всё время удаляются, когда я редактирую сообщение, поэтому проще сразу скачать прилепленный архив и сверяться с кодом.

так, начнём с "самого начала" - с модуля, в котором будет ваше первое оружие. Игра автоматически считывает папки с расширением ".rte". Структура модуля может быть какой угодно, но в самой папке обязан находиться файл "index.ini".Поэтому:
1-Создаём папку с названием вашего мода. Пусть в данной статье она называется "Modik.rte"

2-Заходим в нашу пустую папку и создаём файл .txt. Переименовываем его в "Index.ini"(обратите внимание, что начинается с боьшой буквы). В этом файле подключается всё, что есть в вашем моде, будь то оружие, акторы или эффекты и звуки. Вы можете создать контент, однако, если вы его не подключите, он просто не появится в игре. Индекс также может подключать файлы, которые не содержат ничего из перечисленного, однако вместо этого сами подключают файлы. К примеру, в индексном файле, скажем, коалиции подключено всего несколько файлов. Один из них имеет такой путь: "Coalition.rte/Devices/Devices.ini". Это не значит, что там описаны сами девайсы, там просто есть такие же ссылки, подключающие соответствующий контент. Это вносит определённый порядок в модуль. Однако, делать так вовсе не обязательно. Можно подключать все файлы напрямую в Index.ini.

3-Пусть наше оружие со всеми его файлами хранится по следующему пути: "Modik.rte/Weapons/TutorialWeapon/". Обращаю ваше внимание на то, что ванильные модули имеют отдельные папки для спрайтов и звуков, однако, в целях удобства, мы поместим всё в одну. Создайте директории "Modik.rte/Weapons" и "Modik.rte/Weapons/TutorialWeapon". В папке "Modik.rte/Weapons" создайте файл "Weapons.ini". Через этот файл мы будем подключать наше оружие.

4-Откройте наш файл индекса и внесите туда следующее:
DataModule
ModuleName = Modic Tech //Название, которое будет отображаться в списке покупок
IconFile = ContentFile
Path = Modik.rte/ModuleIcon.bmp //Иконка вашего мода. Нарисуйте сами в палитре СС. Подробнее о сей
//палитре ищите на этом сайте
Description = A tutorial module. //Описание
IncludeFile = Modik.rte/Weapons/Weapons.ini //Подключаем наш файл с подключаемым оружием(он пока пуст)

5-Создайте файл "Modik.rte/Weapons/TutorialWeapon/Weapon.ini". Это и будет главным файлом нашего будущего оружия. Давайте теперь внесём его в список загружаемых файлов. Откройте "Modik.rte/Weapons/Weapons.ini" и внесите туда строку: "IncludeFile = Modik.rte/Weapons/TutorialWeapon/Weapon.ini"

6-Скрипт оружия
Время писать ини код оружия. Для большей понятности и последовательности, начнём не с патронов или магазинов, а прямо с самого оружия. Теперь будем работать только с Modik.rte/Weapons/TutorialWeapon/Weapon.ini. Внесите туда следующее:
AddDevice = HDFirearm //Добавляемый объект является Огнестрельным Оружием. К примеру, для щитов используется
//HeldDevice
PresetName = Tutorial Pistol //Имя нашего пистолета в меню покупок
AddToGroup = Weapons //Добавляем наше оружие в различные группы покупок
AddToGroup = Secondary Weapons
Description = A weapon for tutorial purposes //Описание в меню покупок
Mass = 1.6 //Масса в кг
HitsMOs = 0 //Не понимаю эту строку, ведь есть следующая. Если кто объяснит, сей коммент будет заменён
GetsHitByMOs = 1 //Если 0 - по вашему оружие не смогут попадать пули
SpriteFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Weapon.bmp //Спрайт оружия. Создайте сами.
FrameCount = 1 // Количество кадров оружия. Если кадров, скажем, 2, то спрайты будут называться
//Weapon000.bmp и Weapon001.bmp.(FilePath менять не надо)

SpriteOffset = Vector //Этот оффсет я не вполне понимаю, прошу объяснить, кто знает.
X = -5
Y = -4
EntryWound = AEmitter
CopyOf = Dent Metal //При попадании пули будет использоваться этот вунд. Вы можете найти его
//по пути Base.rte/Effects/Wounds/Wounds.ini

ExitWound = AEmitter
CopyOf = Dent Metal //Аналогично, если пуля прошла насквозь
GoldValue = 10 //Цена оружия в меню покупок

//Следующий блок я не вполне понимаю, однако кое-какая инфа есть тут
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Military Stuff
Resolution = 4
Depth = 0
DeepCheck = 0
////
//Вероятнее всего, следующие строки отвечают за то, насколько прочно держит актор сие оружие в руках
JointStrength = 100
JointStiffness = 0.5
////
JointOffset = Vector //Об этом и многих других оффсетах читайте тут.
// Этот оффсет отвечает за положение "главной руки" - обычно это рукоять оружия
X = -3
Y = 0
DrawAfterParent = 0 //Рисовать за/перед держащим актором. В данном случае - за
OneHanded = 1 // Если 0, то нельзя использовать со щитами
StanceOffset = Vector //где находится оружие, когда актор идёт
X = 12
Y = 1
SharpStanceOffset = Vector //Где находится оружие, когда актор целится
X = 13
Y = -1
SupportOffset = Vector //Положение второстепенной руки
X = -3
Y = 0
SharpLength = 120 //Насколько далеко находятся те 3 точки, по которым вы целитесь

//Подключаем магазин, о нём в следующем пункте
Magazine = Magazine
CopyOf = Tutorial Pistol Mag

//Звуки стрельбы. Обычно подключают один звук, однако в целях демонстрации покажем, что это необязательно.
//При выстреле будет выбран случайный из звуков
FireSound = Sound
AddSample = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Shot1.wav
AddSample = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Shot2.wav

//Звук попытки выстрела при пустой обойме
EmptySound = Sound
AddSample = ContentFile
FilePath = Base.rte/Devices/EmptyClick3.wav

//Звуки перезарядки
ReloadStartSound = Sound
AddSample = ContentFile
FilePath = Base.rte/Devices/ReloadStart.wav
ReloadEndSound = Sound
AddSample = ContentFile
FilePath = Base.rte/Devices/ReloadEnd.wav
////
RateOfFire = 300 //Частота выстрелов в минуту
ReloadTime = 3600 //Время перезарядки в милисекундах
FullAuto = 0 //Если 1, то оружие стреляет автоматически. Если 0 - по одному патрону
FireIgnoresThis = 1 //Не проверял, но если 0, то лучше не стрелять себе в ноги
ShakeRange = 19 //Точность, когда персонаж идёт(чем больше - тем хуже точность)
SharpShakeRange = 3.55 //Точность, когда персонаж целится
NoSupportFactor = 1.15 //Насколько уменьшается точность, если актор держит оружие 1 рукой
ParticleSpreadRange = 0 // Отвечает за разлёт выстреливаемых частичек. Зачем нужен этот параметр, если
//есть ShakeRange и SharpShakeRange будет объяснено чуть позже

//Как-то влияет на разлёт гильз(как именно, я не проверял)
ShellSpreadRange = 8
ShellAngVelRange = 2
//
MuzzleOffset = Vector //Откуда вылетают пули
X = 3
Y = -3
EjectionOffset = Vector //Откуда вылетают гильзы
X = -1
Y = -2

//Добавляем гибы. Гибы появляются при разрушении оружия. Первый и третий описаны в
//Base.rte/Effects/Gibs/Gibs.ini
//Второй мы создадим в пункте 8)
AddGib = Gib
GibParticle = MOSParticle //Тип гиба MOSParticle подробнее
CopyOf = Gib Metal Rust Micro A //Ищите сие в Base.rte/Effects/Gibs/Gibs.ini
Count = 10 //Количество частичек
Spread = 2.25 //Разлёт частичек в радианах
MaxVelocity = 15 //Максимальная скорость в метрах в секунду
MinVelocity = 5 //минимальная скорость

//Код этого гиба будет приведён в пункте 8)
AddGib = Gib
GibParticle = MOSRotating
CopyOf = Tutorial Pistol Pistol Gib
Count = 1
Offset = Vector
X = 0
Y = 0
AddGib = Gib
GibParticle = MOSParticle
CopyOf = Gib Metal Grey Micro A
Count = 6
Spread = 2.25
MaxVelocity = 15
MinVelocity = 5
GibWoundLimit = 2   //Максимальное количество вундов, которое может быть на оружии до того, как оно
//разлетится на гибы
//
//Пока что всё
Итак, Зачем нужен параметр ParticleSpreadRange, если есть ShakeRange и SharpShakeRange? Дело в том, что оружие может стрелять сразу несколькими частичками. При изменении ShakeRange и SharpShakeRange Они все будут испускаться под одним и тем же случайным углом каждый выстрел. При изменении же ParticleSpreadRange, каждая частичка полетит по своему. Это полезно при создании дробовиков.

Пару слов о том, как корректировать оффсеты: Запускаете игру и смотрите, как всё печально. Сворачиваете игру, исправляете и снова перезапускаете. Так примерно раз 10. Да, неприятно, ну а вы чего хотели?

7-создание магазина
Если помните, мы подключали магазин вот этими строками:
Magazine = Magazine
CopyOf = Tutorial Pistol Mag
Теперь время написать Его скрипт. Вставьте этот скрипт перед скриптом самого оружия.

AddAmmo = Magazine
PresetName = Tutorial Pistol Mag //Имя, по которому мы обращались к магазину
Mass = 0.2 //Масса

//Аналогично коду в оружии
HitsMOs = 0
GetsHitByMOs = 0

//Если ваше оружие - револьвер, у которого магазина "нет", используйте FilePath = Base.rte/Null.bmp
SpriteFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Mag.bmp
FrameCount = 1
SpriteOffset = Vector
X = -1
Y = -2
//
ParentOffset = Vector //В каком месте относительно оружия подсоединяется магазин
X = -3
Y = -2
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Military Stuff
Resolution = 0
Depth = 0
DeepCheck = 0

//Не совсем понятно, зачем нужно это, если HitsMOs = 0 и GetsHitByMOs = 0. Думаю, эти строки можно спокойно не
//писать вообще
JointStrength = 200
JointStiffness = 1
//
JointOffset = Vector //Не совсем понимаю суть этого оффсета наряду со SpriteOffset
X = 0
Y = -2
DrawAfterParent = 0 //Рисовать перед или за оружием. В данном случае - за.
RoundCount = 12 //Количество патронов в магазине
RTTRatio = 0 // Через сколько патронов выпустится трейсер. В данном случае мы не используем трейсер.
RegularRound = Round
CopyOf = Tutorial Pistol Round //Какой патрон использовать. Об этом в пункте 9)
TracerRound = None //Трейсер не используется

8-создание гиба который обсуждался ранее
Вместите это в любое место перед описанием самого оружия. Я втиснул Между кодом оружия и магазином.

Не вижу смысла это описывать. Информацию найдёте здесь
AddEffect = MOSRotating
PresetName = Tutorial Pistol Pistol Gib
Mass = 1.1
HitsMOs = 1
GetsHitByMOs = 0
SpriteFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Gib.bmp
FrameCount = 1
SpriteOffset = Vector
X = -5
Y = -4
AngularVel = 6
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Civilian Stuff
Resolution = 2
Depth = 0
DeepCheck = 0

9-создание патрона
Мы добавляли патрон к магазину вот таким образом:
RegularRound = Round
CopyOf = Tutorial Pistol Round
Давайте теперь сотворим сие

Перво - неперво, сам патрон
AddAmmo = Round
PresetName = Tutorial Pistol Round
ParticleCount = 2 //Количество испускаемых частичек одновременно.
Particle = MOPixel //Здесь необязательно должен быть пиксель. Мы можем стрелять чем угодно, возможно,
//даже акторами, я не проверял
CopyOf = Tutorial Pistol Damage Particle //Это создадим чуть позже
Shell = MOSParticle
CopyOf = Casing //Это описано в Base.rte/Ammo.ini
FireVelocity = 220 //Скорость снаряда в метрах в секунду
ShellVelocity = 4
Separation = 1 //Насколько далеко частички друг от друга. Я с этим не баловался, поэтому поподробнее не
//Расскажу.

//Вот эту какашку вставьте перед описанием Tutorial Pistol Round. Опять же, инфа здесь
AddEffect = MOPixel
PresetName = Tutorial Pistol Damage Particle
Mass = 0.002
LifeTime = 1250
Sharpness = 400
HitsMOs = 1
Color = Color
R = 0
G = 0
B = 0
Atom = Atom
Material = Material
CopyOf = Bullet Metal
TrailColor = Color
R = 50
G = 140
B = 20
TrailLength = 8
ScreenEffect = ContentFile
FilePath = Base.rte/Effects/Glows/GreenSmall.bmp
EffectStartTime = 0
EffectStopTime = 500
EffectStartStrength = 0.4
EffectStopStrength = 0.0
EffectAlwaysShows = 1

Итак, вы получили полноценный рабочий пистолет в случае, если нарисовали спрайты и подправили оффсеты, вставили или создали необходимые файлы, правильно организовали структуру мода. Если всё правильно, вы увидете свой пистолет в игре. Если нет - ваши проблемы. Решайте их. У меня работает.

Теперь давайте создадим пару скриптов. Допустим, вы всю жизнь мечтали об отдаче. Давайте же намутим сие.

10-создание отдачи
Итак, пришла пора работы с луа. А раз мы решили работать с луа, нужно для начала создать файл и подключить его.
Зайдите в директорию Modik.rte/Weapons/TutorialWeapon/ и создаёте там обычный txt файл. Переименуйте его в "Weapon.lua"
Теперь необходимо подключить его к скрипту оружия. Для этого нужно написать
ScriptPath = Modik.rte/Weapons/TutorialWeapon/Weapon.lua
Обычно я пишу это после строки GetsHitByMOs = 1

Итак, суть скрипта в том, чтобы после выстрела изменять угол наклона оружия и со временем его восстанавливать. Да, так просто. Минус будущего скрипта заключается в том, что он не влияет на то, как актор держит оружие, т.е. руки не будут поворачиваться за оружием, однако это не заметно, если об этом не знать.
И ещё кое - что: Долбаясь над скриптом, я обнаружил, что после каждого кадра угол поворота оружия возвращается к исходному, т.е. чтобы сохранить угол оружия при отдаче нужно каждый кадр добавлять к исходному углу угол самой отдачи. Следовательно, чтобы оружие постепенно возвращалось в исходное положение, необходимо постепенно уменьшать добавляемую каждый кадр к углу оружия величину(угол отдачи).
И ещё немножко теории: Любой скрипт, лепящийся к оружию в кортексе, состоит из трёх автоматически вызываемых функции:
function Create(self) - вызывается единожды при создании объекта. Аргумент - указатель на объект.
function Update(self) - вызывается каждый кадр до смерти объекта. Аргумент - указатель на объект.
function Destroy(self) - вызывается единожды при смерти объекта. Аргумент - указатель на объект.

Время кода: Обратите внимание, что комментарий теперь пишется по другому.

function Create(self)

--Импульс снаряда(масса на скорость на количество частичек, однако я использовал только массу на количество
--частичек, без скорости, да простят мне боги. Вообще, лучше бы автоматизировать это и получать информацию из
--ини файла с помощью кода
self.BulletImpulse = 0.004;

--С помощью этого коэффициента мы будем регулировать величину отдачи
self.RecoilFactor = 2.6;

--Активная переменная, содержит текущий угол наклона оружия
self.CurrentRecoilAngle = 0;

--Объявляем ещё одну активную переменную, с помощью которой будем отслеживать, был ли произведён выстрел
--в предыдущем кадре
if self.Magazine then
self.ammo = self.Magazine.RoundCount;
else
self.ammo = 0;
end
end

function Update(self)

--Проверяем, отзеркалено ли оружие или нет. Потом будем умножать угол отдачи на эту величину.
local checkFlip = 1;
if self.HFlipped then
checkFlip = -1;
end

--Уменьшение текущей отдачи. Лучше бы делать это с помощью таймера, ну да ладно, работает же? Оператор if
--стоит для того, чтобы не рассчитывать отдачу, когда она уже закончилась. Это сэкономит процессорное время.
if self.CurrentRecoilAngle ~= 0 then

--Каждый кадр умножаем текущую отдачу на определённый коэффициент. Это обеспечит её плавное уменьшение.
--В начале - быстрое уменьшение, а потом всё слабее и слабее
self.CurrentRecoilAngle = self.CurrentRecoilAngle * 0.96

--Поскольку оружие может быть отражено по иксу(вспомните checkFlip), необходимо два условия. Этот кусок можно
--переписать как одно условие, если использовать логическое ИЛИ, однако, я не знаю, как оно выглядит в луа.
--Если угол отдачи близок к нулю, установим его в ноль, чтобы потом не рассчитывать его. Посмотрите на внешний if,
--если не понятно.
if self.CurrentRecoilAngle > -0.01 and self.CurrentRecoilAngle < 0 then
self.CurrentRecoilAngle = 0;
elseif self.CurrentRecoilAngle < 0.01 and self.CurrentRecoilAngle > 0 then
self.CurrentRecoilAngle = 0;
end
end

--прибавляем к углу оружия угол отдачи каждый кадр
--RotAngle - стандартное свойство HDFirearm, эту переменную мы нигде не объявляли
self.RotAngle = self.RotAngle + self.CurrentRecoilAngle;

if self.Magazine then

--Здесь мы проверим, был ли сделан выстрел по прошествии предыдущего кадра.
--Если сохранённое с предыдущего кадра значение патронов в магазине больше текущего, значит выстрел
--производился (Хитро, правда?)
if self.ammo > self.Magazine.RoundCount then

--Рассчитываем новый угол отдачи. Как я и обещал, умножаем на checkFlip.
self.CurrentRecoilAngle = self.CurrentRecoilAngle + ((self.BulletImpulse / self.Mass * self.RecoilFactor * 35) * checkFlip)
end

--Сохраняем значение патронов в магазине для того, чтобы можно было провести эту проверку в следующем кадре.
self.ammo = self.Magazine.RoundCount;
end

end

Теперь у вас есть оружие с работающей отдачей, я проверял. Чего ещё не хватает для полного счастья?
Двух типов стрельбы с выбором одного из них через Pie - меню! Мутим дальше.

11-Pie меню и разные режимы стрельбы
Перво - наперво, скажу одно: Смена режима стрельбы осуществляется за счёт смены магазина оружием. Для Pie меню предусмотрен кой-какой ини код, всё достаточно просто.
Итак, пусть наше оружие стреляет как обычными, так и взрывающимися патронами.
Для этого необходимо создать соответствующий патрон и магазин и немного помутить с кодом

Куда что вставлять, думаю, сами догадаетесь, я вам рассказывал. Прошу заметить, изредка нужно будет рисовать новые изображения и вставлять новые звуки, не копируйте бездумно код. Предупреждать не буду.

11.1- Создаём новый магазин
Пусть для баланса с обычным, разрывной режим стрельбы будет иметь меньше патронов в магазине, а так всё также

AddAmmo = Magazine
PresetName = Tutorial Pistol Magazine Blast
Mass = 0.2
HitsMOs = 0
GetsHitByMOs = 0
SpriteFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/Mag.bmp
FrameCount = 1
SpriteOffset = Vector
X = -1
Y = -2
ParentOffset = Vector
X = -3
Y = -2
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Military Stuff
Resolution = 0
Depth = 0
DeepCheck = 0
JointStrength = 200
JointStiffness = 1
JointOffset = Vector
X = 0
Y = -2
DrawAfterParent = 0
RoundCount = 5
RTTRatio = 0
RegularRound = Round
CopyOf = Tutorial Pistol Round Blast //ОБРАТИТЕ ВНИМАНИЕ
TracerRound = None

11.2- Создаём новый патрон
Тут всё сложнее. Нам нужно, чтобы патрон взрывался при попадании куда - либо. Для этих целей подходит AEmitter.
Его описание вы найдёте тут. Мы дадим ему GibImpulseLimit заведомо слишком маленьким, чтобы он мог выдержать удар. Он будет испускать MOPixel'и с эффектом Glow и очень маленьким временем жизни в качестве эмиссии. Его гибы как раз будут повреждающими элементами. Кроме того, его взрыв будет сопровождаться звуком
Потом мы сделаем, чтобы этот патрон летел медленно, со скоростью гранаты.

AddAmmo = AEmitter
PresetName = Tutorial Pistol Blast Emitter
Mass = 0.021
LifeTime = 3500 //Он летит медленно и, следовательно, время жизни должно быть достаточно большим
OrientToVel = 1.0 //Куда направлена скорость - туда направлен и спрайт
Sharpness = 400
HitsMOs = 1
GetsHitByMOs = 1
SpriteFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/BlastRound.bmp //Предупреждаю первый и
//единственный раз. Последующие файлы отслеживайте сами, меня уже задолбало писать эту статью.
FrameCount = 1
SpriteOffset = Vector
X = -2
Y = -2
AtomGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Bullet Metal
Resolution = 1
Depth = 0
DeepGroup = AtomGroup
AutoGenerate = 1
Material = Material
CopyOf = Bullet Metal
Resolution = 1
Depth = 1
DeepCheck = 0
AddEmission = Emission //Испускаем наш Glow. Частичка будет описана позже
EmittedParticle = MOPixel
CopyOf = Tutorial Pistol Glow Particle
Spread = 0
MaxVelocity = 0
MinVelocity = 0
PushesEmitter = 0
EmissionEnabled = 1
EmissionsIgnoreThis = 0
ParticlesPerMinute = 10000
BurstSize = 1
BurstScale = 1
BurstDamage = 0
BurstTriggered = 0
EmissionDamage = 0
Flash = None
FlashOnlyOnBurst = 0
GibSound = Sound //Звук взрыва
AddSample = ContentFile
Path = Modik.rte/Weapons/TutorialWeapon/BlastSound.wav
AddGib = Gib //Этот гиб будет повреждающим, остальные - для красоты
GibParticle = MOPixel
CopyOf = Grenade Fragment Gray
PresetName = Tutorial Pistol Blast Particle
LifeTime = 8
Atom = Atom
Material = Material
CopyOf = Bullet Metal
TrailLength = 2
Count = 12
Spread = 3.14
MaxVelocity = 30
MinVelocity = 30
InheritsVel = 0
AddGib = Gib
GibParticle = MOPixel
CopyOf = Glow Particle Yellow Small
Count = 2
Spread = 2.25
MaxVelocity = 0.1
MinVelocity = 0
InheritsVel = 0
AddGib = Gib
GibParticle = MOSParticle
CopyOf = Side Thruster Blast Ball 1
Count = 2
MinVelocity = 30
MaxVelocity = 50
AddGib = Gib
GibParticle = MOPixel
CopyOf = Air Blast
LifeTime = 20
Count = 3
MinVelocity = 20
MaxVelocity = 35
LifeVariation = 0.50
AddGib = Gib
GibParticle = MOSParticle
CopyOf = Explosion Smoke 1
Count = 1
Spread = 3.1
MaxVelocity = 10
MinVelocity = 0
LifeVariation = 0.50
InheritsVel = 1
AddGib = Gib
GibParticle = MOSParticle
CopyOf = Flame Smoke 1
Count = 1
Spread = 3.1
MaxVelocity = 12
MinVelocity = 3
LifeVariation = 0.50
GibImpulseLimit = 0.000001 //Заведомо очень маленький

//Для того, чтобы понять, найдите в предыдущем коде использование вот этого:
AddEffect = MOPixel
PresetName = Tutorial Pistol Glow Particle
Mass = 0.001
GlobalAccScalar = 0
LifeTime = 20
Sharpness = 0
HitsMOs = 1
Color = Color
R = 255
G = 0
B = 255
Atom = Atom
Material = Material
CopyOf = Bullet Metal
TrailColor = Color
R = 255
G = 0
B = 255
TrailLength = 0
ScreenEffect = ContentFile
FilePath = Base.rte/Effects/Glows/GreenSmall.bmp
EffectStartTime = 0
EffectStopTime = 1000
EffectStartStrength = 0.5
EffectStopStrength = 0.0
EffectAlwaysShows = 1

//И наконец. Найдите упоминание этого в новом магазине
AddAmmo = Round
PresetName = Tutorial Pistol Round Blast
ParticleCount = 1
Particle = AEmitter
CopyOf = Tutorial Pistol Blast Emitter
Shell = MOSParticle
CopyOf = Casing
FireVelocity = 42
ShellVelocity = 4
Separation = 1

11.3-Добавление ини кода Pie меню
Итак, мы создали новый магазин и тип патронов, однако никак не связали с оружием.
Теперь мы должны вставить вот это в скрипт самого оружия. Лучше всего прямо перед гибами после оффсетов.

//Первый пункт для обычных, второй - для разрывных патронов
AddPieSlice = Slice
Description = Regular Mode
//Вероятнее всего - по часовой или против неё расположить иконку
Direction = 1
Icon = Icon
PresetName = Tutorial Pistol Pie Regular
//Первый кадр - если режим неактивен. Второй - если активен. Напоминаю, если FrameCount > 1, то файлы должны
//называться PieRegular000.bmp и PieRegular001.bmp
FrameCount = 2
BitmapFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/PieRegular.bmp
ScriptPath = Modik.rte/Weapons/TutorialWeapon/pie.lua
//Название функции в луа коде Pie меню, об этом в пункте 11.4)
FunctionName = TutorialPistolPieRegular
AddPieSlice = Slice
Description = Blast Mode
Direction = 2
Icon = Icon
PresetName = Tutorial Pistol Pie Blast
FrameCount = 2
BitmapFile = ContentFile
FilePath = Modik.rte/Weapons/TutorialWeapon/PieBlast.bmp
ScriptPath = Modik.rte/Weapons/TutorialWeapon/pie.lua
FunctionName = TutorialPistolPieBlast

11.4-Добавление луа кода Pie меню
Создаём pie.lua и туда пишем:

--Теперь возвращайтесь обратно и найдите упоминание этого в скрипте ини Pie меню, иначе вас покусает Шваб.
--Обратите внимание, что аргумент - указатель на актора, держащего вашу пукалку.

function TutorialPistolPieRegular(actor)
--Получаем указатель на оружие
local gun = ToAHuman(actor).EquippedItem;
if gun ~= nil then
--приводим указатель к нужному типу, если я правильно понял
local gun = ToHDFirearm(gun);
--Что я говорил про смену режима стрельбы, найдите - ка?
local magSwitchName = "Tutorial Pistol Mag";
if gun.Magazine == nil or (gun.Magazine ~= nil and gun.Magazine.PresetName ~= magSwitchName) then
//После перезарядки оружие переключит магазин на вот это в случае, если вот это уже не переключено, гляньте
//на условие if
gun:SetNextMagazineName(magSwitchName);
//Собственно, насильно заставить актора перезарядить наш пистолет
gun:Reload();
end
end
end

function TutorialPistolPieBlast(actor)
local gun = ToAHuman(actor).EquippedItem;
if gun ~= nil then
local gun = ToHDFirearm(gun);
local magSwitchName = "Tutorial Pistol Magazine Blast";
if gun.Magazine == nil or (gun.Magazine ~= nil and gun.Magazine.PresetName ~= magSwitchName) then
gun:SetNextMagazineName(magSwitchName);
gun:Reload();
end
end
end

Этот код взят из моей пушки новой коалиции(я переделываю коалицию) и не ручаюсь, что везде не забыл поменять
"Coalition" на "Tutorial". У меня ошибок не выдаёт и работает, однако, если на вас кортекс ругается, присылайте скрин ошибки, исправлю.
Прилепляю архив с готовым оружием.
Прикрепления: Modik.rte.rar(277Kb)


https://vk.com/puksus

Сообщение отредактировал puksus - Суббота, 04.01.2014, 13:15
 
SintechДата: Воскресенье, 09.03.2014, 18:35 | Сообщение # 2
Краб
Группа: Проверенные
Сообщений: 11
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Отличная статья. Безумно радует факт наглядного описания и использования LUA. Наглядные примеры всегда работают лучше всего, если дело касается программирования. Лови плюс!
Ай, что-то не ставится sad Ну ничего, вручу как только получится.


Сообщение отредактировал Sintech - Воскресенье, 09.03.2014, 18:37
 
gjrfytnДата: Воскресенье, 09.03.2014, 22:34 | Сообщение # 3
Блудный критик
Группа: Модераторы
Сообщений: 633
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Цитата Sintech ()
вручу как только получится

Попробуй теперь.


 
Форум » Статьи » Создание модов » создание годного заскриптованного оружия с нуля (для новичков)
Страница 1 из 11
Поиск:
Статистика Форума
Последние темы Читаемые темы Последние зарегистрированные пользователи
игра обломи предыдущего [Думми1]

Песенки или музыка. [puksus]

Флудильня! [Думми1]

Админ, его статус и как его найти. [Думми1]

Хорошие фильмы [puksus]

District 9 Multi-National United (MNU) [Xterian]

Super Weapons of AcoACorp [puksus]

Black Ravens v.0.8.8 {B27} [degtyar02]

Outposts v.1.5.1 {B32} [Xterian]

OnLine Tech [alexgamer0092]

[1]>Флудильня! [5151]

[2]>Свалка арта. [879]

[3]>Фан-арт по Cortex Command [386]

[4]>игра обломи предыдущего [350]

[5]>Black Ravens v.0.8.8 {B27} [288]

[6]>Выход 24 билда. [281]

[7]>[UNITED TERRAN FORCES] [274]

[8]>Песенки или музыка. [272]

[9]>Улучшения форума [270]

[10]>Russian Combat Small Arms {B24-B27} [263]

owl1121 [04.12.2017|19:03]

serezhka8402 [16.11.2017|13:23]

fedorofflucka2017 [14.11.2017|18:43]

abramovfilip1989 [10.11.2017|11:18]

maksa1990ra [04.11.2017|15:55]

dimatchagin [01.11.2017|07:55]

doktorkto529 [31.10.2017|20:30]

lvivua [29.10.2017|12:30]

farsj10i2 [24.10.2017|14:44]

adrianfames [14.10.2017|08:24]


Вверх
Русский Фан Сайт Cortex Command © 2017.