puksus | Дата: Пятница, 03.01.2014, 15:21 | Сообщение # 1 |
Пукс
Группа: Модераторы
Сообщений: 987
Награды: 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". У меня ошибок не выдаёт и работает, однако, если на вас кортекс ругается, присылайте скрин ошибки, исправлю. Прилепляю архив с готовым оружием.
https://vk.com/beezoya
Сообщение отредактировал puksus - Суббота, 04.01.2014, 13:15 |
|
| |