Перейти к содержанию

Вопрос по скриптам sFall


balgot

Рекомендуемые сообщения

Добрый день. Объясните пожалуйста логику работы скрипта быстрой перезарядки в SFall в файле gl_sfall-mods

 

 


procedure InventoryMoveHandler begin

variable event := get_sfall_arg,
itemDrop := get_sfall_arg,
itemWeapon := get_sfall_arg,
cAmmo, ammoPid, ammoObj, inven;

if (event == 4) then begin
if (quickAmmoReload == false) then return;
cAmmo := get_weapon_ammo_count(itemWeapon);              //по описанию процедура возвращает текущее число патронов (или максимальное? тогда понятно)
if (cAmmo == 0) then return;                                                 //почему прерываем если текущих патронов в оружии 0 ? 

ammoPid := get_weapon_ammo_pid(itemWeapon);
if (obj_pid(itemDrop) == ammoPid) then return;                  //почему прерываем если тип патрона совпадает с типом патрона в оружии?

inven := DUDE_INVEN;
if (obj_is_carrying_obj(inven, itemWeapon) > 1) then return; // почему прерываем если в инвентаре более одного экземпляра оружия?

// force unload - вот тут далее вообще не понятно зачем что происходит
set_weapon_ammo_count(itemWeapon, 0);  
// add ammo to inventory
ammoObj := create_object(ammoPid, 0, 0); 
set_weapon_ammo_count(ammoObj, cAmmo); // cAmmo же вроде текущие патроны?
add_obj_to_inven(inven, ammoObj);
end

 

 

Еще есть вопросы по скриптингу. Можно ли сделать перезарядку энергетического оружия одной батареей (одна батарейка полностью заряжает все заряды оружия), понимаю, что могут быть проблемы с разряжанием - можно ли его запретить? Можно сделать энергетические пистолеты легким оружием - как поменять применяемый навык, в прото файлах есть только опции тяжелое и энерго (кстати в ранних версиях прото менеджеров и бис-маппере эта опция отсутствует)? Навык выбирается движком на основании типа урона и анимации выстрела?

Ссылка на комментарий

cAmmo := get_weapon_ammo_count(itemWeapon); //по описанию процедура возвращает текущее число патронов (или максимальное? тогда понятно)

 

Текущие

 

//почему прерываем если текущих патронов в оружии 0 ?

//почему прерываем если тип патрона совпадает с типом патрона в оружии?

 

Потому, что двиг сам сделает зарядку.

 

// почему прерываем если в инвентаре более одного экземпляра оружия?

 

А черт его знает))

Наверное затем чтбы вся пачка не перезаряжалась одной обоймой.

Тут мне надо доработать один момент.

 

// вот тут далее вообще не понятно зачем что происходит

 

Там вроде коментариями написано что происходи.

Ссылка на комментарий

Потому, что двиг сам сделает зарядку.

Стандартный обработчик не будет спрашивать число применяемых для перезарядки патронов и перезарядит полностью?

 

//почему прерываем если тип патрона совпадает с типом патрона в оружии?

Вторая проверка только для других патронов этого же калибра, так?

 

//Наверное затем чтбы вся пачка не перезаряжалась одной обоймой.

 

set_weapon_ammo_count 

- то есть Pid предмета не для уникального экземпляра а для стэка предметов? и перезарядит их все? независимо от того в инвентаре, слотах правой\левой руки?  

Ссылка на комментарий

Стандартный обработчик не будет спрашивать число применяемых для перезарядки патронов и перезарядит полностью?

 

У движка своя процедура перезарядки.

 

Вторая проверка только для других патронов этого же калибра, так?

 

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

 

//Наверное затем чтбы вся пачка не перезаряжалась одной обоймой.

 

set_weapon_ammo_count [/size]

- то есть Pid предмета не для уникального экземпляра а для стэка предметов? и перезарядит их все? независимо от того в инвентаре, слотах правой\левой руки?

 

Ну тут просто защита (выход) когда на стопку с оружием кидаются патроны.

Мне так кажется что тут баг есть, хотя вроде тестировал нормально все было, когда в руке было оружие и имелась стопка такого же оружия в инвентаре. Но надо проверить этот момент еще раз. Есть смутные сомнения...

Ссылка на комментарий

//У движка своя процедура перезарядки

Об этом и речь. Стандартная процедура вроде как должна вызывать окно с выбором количества пачек патронов для перезарядки.

 

Просто не понятно как работает процедура движка.

 

Хук передвижения предметов будет вызываться для перезарядки не через инвентарь, а через основной интерфейс для оружия в руке?

 

А по остальным вопросам из первого поста?

Ссылка на комментарий

Об этом и речь. Стандартная процедура вроде как должна вызывать окно с выбором количества пачек патронов для перезарядки.

Просто не понятно как работает процедура движка.

ну движок вызывает окошко.

 

Хук передвижения предметов будет вызываться для перезарядки не через инвентарь, а через основной интерфейс для оружия в руке?

чет не понял что вы написали, отвечу на всякий случай ДА)

 

А по остальным вопросам из первого поста?

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

 

нельзя сделать энергетическое легким.

Навык выбирается движком на основании типа урона

поэтому нужна доп опция с поддержкой в движке как в случае с энерго/тяжелое.

Ссылка на комментарий

если что то вот доработанная реализация перезарядки, может тебе станет чуть яснее это дело.

variable icount = obj_is_carrying_obj(inven, itemWeapon);
if (icount > 1) then begin
   // если патроны перемещаются(кидаются) на стопку оружия в инвентаре
   // отделить предметы оставив один предмет для перезарядки, потом вернуть остальные
   variable iweapons = create_object(obj_pid(itemWeapon), 0, 0);  // наверное тут потребуется новая функция клонирования(copy) предмета а не создание нового
   icount = rm_mult_objs_from_inven(inven, itemWeapon, icount - 1);

   // fake unload ammo
   set_weapon_ammo_count(itemWeapon, 0);
   // add ammo to inventory
   call add_ammo(ammoPid, cAmmo, inven);

   // add deleted weapons
   add_mult_objs_to_inven(inven, iweapons, icount);
   return;
end
// fake unload ammo
set_weapon_ammo_count(itemWeapon, 0);
// add ammo to inventory
call add_ammo(ammoPid, cAmmo, inven);

/////////////////////////////////////////
procedure add_ammo(variable ammoPid, variable cAmmo, variable inven) begin
   variable ammoObj := create_object(ammoPid, 0, 0);

   variable packSize = get_proto_data(ammoPid, PROTO_AM_PACK_SIZE); // количество патронов в одной пачке
   if (cAmmo > packSize) then begin
      variable count = cAmmo / packSize; // количество добавляемых пачек
      add_mult_objs_to_inven(inven, ammoObj, count);
      cAmmo = cAmmo % packSize; // остаточное количество патронов (если будет)
      if (cAmmo == 0) then return;
      // создать новую пaчку
      ammoObj := create_object(ammoPid, 0, 0);
   end
   if (cAmmo != packSize) then set_weapon_ammo_count(ammoObj, cAmmo);
   add_obj_to_inven(inven, ammoObj);
end
// fake unload ammo - делаем оружие пустым для того чтобы вызвать движковую функцию заряжания.
Ссылка на комментарий

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

 

Про основной интерфейс я имел в виду в бою например, не входя в инвентарь, там тоже будет вызываться этот хук, или по другому игра реализует перезарядку?

 

 

Может посмотришь про разрядку? Либо из списка действий как исключить, либо саму функцию разрядки хуком подменить?

 

А теоретически подменить хуком функцию оценки типа навыка на оружие можно? Это происходит в функции вычисления вероятности попадания?

Ссылка на комментарий

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

 

Да оно и в первоначальном вызывается/лось, просто я провтыкал этот момент.

 

А про основной интерфейс я имел в виду в бою например, не входя в инвентарь, там тоже будет вызываться этот хук, или по другому игра реализует перезарядку?

 

Хз, но явно это несработает, так как нет логики в скрипте которая будет искать патроны другого типа чтобы перезарядиться ими в случае отсутствия текущего типа.

Надо будет по эксперементировать.

Стоп.

А разве движок сам не ищет патроны другого типа? Помойму ищет, так что скрипт тут и не нужен.

 

Может посмотришь про разрядку? Либо из списка действий как исключить, либо саму функцию разрядки хуком подменить?

 

Незнаю, нет ничего чем можно отменить разрядку. Только удалять патроны при разрядке.

В движке есть релизация солнечный пистоль который нельзя разрядить, вот от него и надо плесать.

 

А теоретически подменить хуком функцию оценки типа навыка на оружие можно? Это происходит в функции вычисления вероятности попадания?

Нельзя.

В функции/крючке вычисления можно переопределить шанс относительно навыка легкого оружия.

Ссылка на комментарий

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...