DECORATE. Добавляем перезарядку.

Предисловие.

Для добавление перезарядки, нам понадобится 2 вида патронов — обойма, и пули. Когда перезаряжаемся, мы тратим обойму и получаем патроны.

Перед началом, скачайте пак спрайтов с MEGA.

Также, я буду улучшать оружие coolGun, взятое из урока DECORATE. Делаем оружие.

Создаем пули.

Сначала, создадим первый вид патронов — пули. Добавьте следующий код к себе в DECORATE:

actor coolGunBullets : Ammo
{
  inventory.maxamount 10
  inventory.icon "CBULB0"
}

Разберем код:

actor coolGunBullets : Ammo

Если твой актор является патронами, то он должен наследоваться от Ammo.

  • inventory.maxamount — указывает максимальное количество патронов в инвентаре.
  • inventory.icon — указывает спрайт патронов.

Значение maxamount, запомните на будущее. Оно равно 10.

А так выглядит иконка первого типа патронов.

CBULB0

Пули разобрали, перейдем к обойме.

Создаем обойму.

Переходим ко 2-му типу патронов — обойма. Добавьте следующий код к себе в DECORATE:

actor coolGunAmmo : Ammo
{
  height 16
  radius 16
  inventory.amount 10
  inventory.maxamount 50
  ammo.backpackamount 20
  ammo.backpackmaxamount 100
  inventory.icon "CAMMA0"
  states {
  spawn:
    CAMM A 1
    loop
  }
}

Разберем основные комманды:

  • inventory.amount — задает количество получаемых патронов.
  • inventory.maxamount — задает максимальное количество патронов в инвентаре.
  • ammo.backpackamount — если ты взял рюкзак (думовский предмет), то тебе выдается ammo.backpackamount патронов.
  • ammo.backpackmaxamount — если ты взял рюкзак (думовский предмет), то максимальное количество патронов, станет равным ammo.backpackmaxamount.
  • inventory.icon — задает иконку патронов

А так выглядит иконка второго типа патронов.

CAMMA0

Добавляем перезарядку.

Добавьте стейт Reload в код актора coolGun.

Reload:
  NULL A 0 A_JumpIfInventory("coolGunBullets",10,"Ready")
  NULL A 0 A_JumpIfInventory("coolGunAmmo",1,1)
  goto ready
  CWEP A 0 A_TakeInventory("coolGunAmmo",1)
  CWEP A 0 A_GiveInventory("coolGunBullets",10)
  CWER ABCDEF 5 
  Goto ready

Разберем каждую строку:

NULL A 0 A_JumpIfInventory("coolGunBullets",10,"Ready")

Синтаксис у A_JumpIfInventory следующий:

A_JumpIfInventory("название_предмета",количество,"стейт")
  • название_предмета — задает название предмета инвентаря (патроны).
  • количество — задает количество предметов название_предмета нужное для того чтобы перепрыгнуть на стейт.
  • стейт — задает точку перемещения, вместо стейта можно использовать число, оно будет указывать количество пропускаемых строк кода.

Таким образом, если у нас есть 10 coolGunBullets, то мы перепрыгнем на стейт Ready.

Данная строка:

NULL A 0 A_JumpIfInventory("coolGunBullets",10,"Ready")

Запрещает перезаряжать оружие, если количество патронов в обойме максимальное (максимальное количество патронов мы задавали в coolGunBullets)

NULL A 0 A_JumpIfInventory("coolGunAmmo",1,1)

В этой строке мы проверяем, есть ли у нас хотя-бы 1 обойма. Если есть, то перепрыгиваем через «goto ready«. В сущности, эта строка не позволяет нам перезарядится, если нет обойм.

CWEP A 0 A_TakeInventory("coolGunAmmo",1)

Данная строка забирает одну обойму из нашего инвентаря.

Комманда A_TakeInventory — забирает предмет из инвентаря, синтаксис у неё следующий:

A_TakeInventoty("название_предмета",количество)

Перейдем к следующей строке:

CWEP A 0 A_GiveInventory("coolGunBullets",10)

В этой строке мы даем 10 пулек, игроку. Синтаксис A_GiveInventory то же что и у A_TakeInventoty.

CWER ABCDEF 5 
Goto ready

Дальше проигрываем анимацию перезарядки, и возвращаемся в стейт Ready

Анимация перезарядки

Стейт Reload готов, но он не будет работать. Чтобы он начал работать нужно добавить флаг WRF_ALLOWRELOAD у комманды A_WeaponReady:

Ready:
  CWEP A 1 A_WeaponReady(WRF_ALLOWRELOAD)
  Loop

А также, добавить флаг +Ammo_Optional.

+Ammo_Optional

И пропишите проперти нашему оружию:

weapon.ammotype "coolGunBullets"
weapon.ammouse 1
weapon.ammotype2 "coolGunAmmo"
weapon.ammouse2 0

Наш coolGun теперь использует coolGunBullets (пули) в качестве патронов, вместо Cell. На выстрел плазмы тратит 1 патрон. Также он использует coolGunAmmo (обоймы) в качестве 2-го типа патронов. На выстрел, обойму не тратит, поэтому 0.

Еще пропишем в начале стейта Fire проверку. Если нет патронов в обойме, то перезаряжаемся.

NULL A 0 A_JumpIfNoAmmo("Reload")

A_JumpIfNoAmmo — перепрыгивает на стейт, если нет патронов.

Готово! Прилагаю полный код coolGun:

Скрытый текст
ACTOR coolGun : Weapon 10006
{
Weapon.SelectionOrder 350
Inventory.PickupSound «misc/usgpickup»
Weapon.AmmoGive 200
Weapon.AmmoUse 1
Weapon.SlotNumber 3
Weapon.AmmoType «coolGunBullets»
+Floatbob
+Ammo_Optional
weapon.ammogive 0
weapon.ammotype2 «coolGunAmmo»
weapon.ammouse2 0
AttackSound «weapons/ubersgf»
States
{
Spawn:
CWEP F -1
Stop
Ready:
CWEP A 1 A_WeaponReady(WRF_ALLOWRELOAD)
Loop
Deselect:
CWEP A 1 A_Lower
Loop
Select:
CWEP A 1 A_Raise
Loop
Fire:
NULL A 0 A_JumpIfNoAmmo(«Reload»)
CWEP B 2 offset(-1,0) {
A_FireCustomMissile(«blueProj»);
A_ZoomFactor(0.98);
A_SetPitch(pitch-1.0);
A_Recoil(0.5);
A_FireCustomMissile(«GunSleeveSpawner»,0,0,0);
}
CWEP C 2 offset(1,0) A_SetPitch(pitch+1.0)
CWEP D 5 A_ReFire
CWEP E 0 A_ZoomFactor(1.0)
CWEP E 5
Goto Ready
Reload:
NULL A 0 A_JumpIfInventory(«coolGunBullets»,10,»Ready»)
NULL A 0 A_JumpIfInventory(«coolGunAmmo»,1,1)
goto ready
CWEP A 0 A_TakeInventory(«coolGunAmmo»,1)
CWEP A 0 A_GiveInventory(«coolGunBullets»,10)
CWER ABCDEF 5
Goto ready
}
}

Запускаем, проверяем. Не забудьте привязать клавишу перезарядки, в настройках игры. Также, чтобы заспавнить патроны, введите «summon coolGunAmmo» в консоли.

Заключение

Статья получилась объемной, надеюсь я смог вам объяснить, как делается перезарядка. Если есть вопросы, то задавайте их в комментариях.

Итоговый результат.

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!