Перейти к содержимому


Фотография

костер спички.... прошу помощи


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 OFFLINE   евгений373

евгений373

    Ефрейтор

  • Пользователи
  • 38 сообщений

Отправлено 20 April 2018 - 08:36

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


Сообщение отредактировал евгений373: 20 April 2018 - 08:52

  • 0

#2 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 29 May 2018 - 13:46

Если еще актуально то например так. Выдрал из своего, так что полностью работу не гарантирую. Главное понять принцип. Для начала, если у вас нет магазина с классом "спички" вы должны создать его в конфиге. Расписывать не буду. Для проверки, можно вместо спичек выбрать любой другой предмет в инвентаре. Главное вписать его класс в проверку двойного клика на нем.

 

class CfgMagazines {

class CA_Magazine;

 class WC_Matches : class CA_Magazine;{

scope = 2;
displayName = "Коробок Спичек";
descriptionShort = "Спички - детям не игрушка";
picture = "\путь к картинке\matches.paa"; // можно сделать свою картинку или поставить пустую строку ""
model = "\A3\Structures_F_EPA\Items\Tools\Matches_F.p3d";
mass = 1;
};

};

 

Заиметь в инвентаре предмет.  Допустим это класс "WC_Matches". Можно в инит игрока добавить:  this addItem "WC_Matches"; 

Потом все следующее у меня оформлено в скрипте и вызывается из инита миссии (но там много еще чего намешано.Выдрал только спички)

Для проверки можно этот код скопировать в консоль и выполнить его после запуска миссии в редакторе. Проверил - работает.

 

if (isdedicated) exitwith {};
handle = [] spawn 
{   
fn_dblClick = 
{           
 private ["_unit","_item"];
 _idc = ctrlIDC (_this select 0);          
 _selectedIndex = _this select 1;         
 _unit = player;
 _item = lbData [_idc, _selectedIndex];
 closeDialog 2;
 
if (_item == "WC_Matches" ) then 
{
TitleText ["Делаем костер", "PLAIN DOWN",0.5];
_pos = player getRelPos [1.5, 0];
_fireplace = createVehicle ["Land_Campfire_F",_pos, [], 0, "can_collide"];
};
 
false      
};      
 
while {true} do 
{  
waituntil {!(isnull (finddisplay 602))};
      
((findDisplay 602) displayCtrl 638) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];  
((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", " _this call fn_dblClick"];  
((findDisplay 602) displayCtrl 619) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];    
 
waituntil {isnull (finddisplay 602)};      
};  
}; 
 
Прикрепленный файл  Arma3_x64 2018-05-29 19-20-16-939.jpg   121.49К   0 Количество загрузок:
Прикрепленный файл  Arma3_x64 2018-05-29 19-20-34-288.jpg   101.4К   0 Количество загрузок:

 Надеюсь понятно.

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


  • 0

#3 OFFLINE   евгений373

евгений373

    Ефрейтор

  • Пользователи
  • 38 сообщений

Отправлено 15 June 2018 - 17:30

Если еще актуально то например так. Выдрал из своего, так что полностью работу не гарантирую. Главное понять принцип. Для начала, если у вас нет магазина с классом "спички" вы должны создать его в конфиге. Расписывать не буду. Для проверки, можно вместо спичек выбрать любой другой предмет в инвентаре. Главное вписать его класс в проверку двойного клика на нем.

 

class CfgMagazines {

class CA_Magazine;

 class WC_Matches : class CA_Magazine;{

scope = 2;
displayName = "Коробок Спичек";
descriptionShort = "Спички - детям не игрушка";
picture = "\путь к картинке\matches.paa"; // можно сделать свою картинку или поставить пустую строку ""
model = "\A3\Structures_F_EPA\Items\Tools\Matches_F.p3d";
mass = 1;
};

};

 

Заиметь в инвентаре предмет.  Допустим это класс "WC_Matches". Можно в инит игрока добавить:  this addItem "WC_Matches"; 

Потом все следующее у меня оформлено в скрипте и вызывается из инита миссии (но там много еще чего намешано.Выдрал только спички)

Для проверки можно этот код скопировать в консоль и выполнить его после запуска миссии в редакторе. Проверил - работает.

 

if (isdedicated) exitwith {};
handle = [] spawn 
{   
fn_dblClick = 
{           
 private ["_unit","_item"];
 _idc = ctrlIDC (_this select 0);          
 _selectedIndex = _this select 1;         
 _unit = player;
 _item = lbData [_idc, _selectedIndex];
 closeDialog 2;
 
if (_item == "WC_Matches" ) then 
{
TitleText ["Делаем костер", "PLAIN DOWN",0.5];
_pos = player getRelPos [1.5, 0];
_fireplace = createVehicle ["Land_Campfire_F",_pos, [], 0, "can_collide"];
};
 
false      
};      
 
while {true} do 
{  
waituntil {!(isnull (finddisplay 602))};
      
((findDisplay 602) displayCtrl 638) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];  
((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", " _this call fn_dblClick"];  
((findDisplay 602) displayCtrl 619) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];    
 
waituntil {isnull (finddisplay 602)};      
};  
}; 
 

 Надеюсь понятно.

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

премного благодарен,буду пробовать,после экспиремента отпишусь.


  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 15 June 2018 - 20:44

В арме есть хандлер который активируется при открытии и закрытии инвентаря, и лучше реализовывать это через него, вместо запуска бесконечного цикла

while {true} do  

{  

waituntil {!(isnull (finddisplay 602))}; 

      

((findDisplay 602) displayCtrl 638) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];  

((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", " _this call fn_dblClick"];  

((findDisplay 602) displayCtrl 619) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];    

 

waituntil {isnull (finddisplay 602)};      

};  

}; 

да, это тоже работает, но не стоит привыкать к подобным, далеко не изящным и эффективным решениям.


  • 0

#5 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 15 June 2018 - 20:49

Во вторых не стоит зразу закрывать дисплей инвентаря.


closeDialog 2;

 

if (_item == "WC_Matches" ) then 

{

TitleText ["Делаем костер", "PLAIN DOWN",0.5];


_pos = player getRelPos [1.5, 0];

_fireplace = createVehicle ["Land_Campfire_F",_pos, [], 0, "can_collide"];

};

То есть закрывать дисплей после проверки, если на некий предмет нет санкционированных действий, то собственно и ни каких действий не производится.


  • 0

#6 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 21 June 2018 - 18:49

В арме есть хандлер который активируется при открытии и закрытии инвентаря, и лучше реализовывать это через него, вместо запуска бесконечного цикла

Спасибо за уточнения. У меня этот евентхандлер уже используется для проверки открытия/закрытия контейнеров-сейфов с последующим сохранением в базу. Вроде можно делать несколько одинаковых хандлеров, но посчитал, что могут возникнуть косячки. Как Вы думаете - нормально будут обрабатываться? Или лучше впихнуть все в один, с проверкой на разные действия?


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 21 June 2018 - 19:53

Да косяков как бы и не предвидится, движок тупо вызовет по очереди все определённые для события хандлеры, и исполнит код определённый в хандлерах.

А реализовывать в одном или в разных, тут скорее дело вкуса, и удобства. Либо у вас в одном хандлере описаны все возможные алгоритмы описывающие работу с инвентарём, что избавляет от вероятного сёрфинга по файлам модификации, то есть при тех же багах, вы будете искать проблему в одном месте. Либо раскидать алгоритмы по разным хандлерам, тут есть свой гешефт, лично мне на много удобнее, в плане восприятия, осмысливать не большие куски кода, особенно когда смотришь в эти куски, месяца через два).


  • 1

#8 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 22 June 2018 - 11:39

Да косяков как бы и не предвидится, движок тупо вызовет по очереди все определённые для события хандлеры, и исполнит код определённый в хандлерах.

А реализовывать в одном или в разных, тут скорее дело вкуса, и удобства. Либо у вас в одном хандлере описаны все возможные алгоритмы описывающие работу с инвентарём, что избавляет от вероятного сёрфинга по файлам модификации, то есть при тех же багах, вы будете искать проблему в одном месте. Либо раскидать алгоритмы по разным хандлерам, тут есть свой гешефт, лично мне на много удобнее, в плане восприятия, осмысливать не большие куски кода, особенно когда смотришь в эти куски, месяца через два).

Благодарю. Все понял.


  • 0

#9 OFFLINE   dan

dan

    Рядовой

  • Пользователи
  • 9 сообщений

Отправлено 28 July 2018 - 19:14

Если еще актуально то например так. Выдрал из своего, так что полностью работу не гарантирую. Главное понять принцип. Для начала, если у вас нет магазина с классом "спички" вы должны создать его в конфиге. Расписывать не буду. Для проверки, можно вместо спичек выбрать любой другой предмет в инвентаре. Главное вписать его класс в проверку двойного клика на нем.

 

class CfgMagazines {

class CA_Magazine;

 class WC_Matches : class CA_Magazine;{

scope = 2;
displayName = "Коробок Спичек";
descriptionShort = "Спички - детям не игрушка";
picture = "\путь к картинке\matches.paa"; // можно сделать свою картинку или поставить пустую строку ""
model = "\A3\Structures_F_EPA\Items\Tools\Matches_F.p3d";
mass = 1;
};

};

 

Заиметь в инвентаре предмет.  Допустим это класс "WC_Matches". Можно в инит игрока добавить:  this addItem "WC_Matches"; 

Потом все следующее у меня оформлено в скрипте и вызывается из инита миссии (но там много еще чего намешано.Выдрал только спички)

Для проверки можно этот код скопировать в консоль и выполнить его после запуска миссии в редакторе. Проверил - работает.

 

if (isdedicated) exitwith {};
handle = [] spawn 
{   
fn_dblClick = 
{           
 private ["_unit","_item"];
 _idc = ctrlIDC (_this select 0);          
 _selectedIndex = _this select 1;         
 _unit = player;
 _item = lbData [_idc, _selectedIndex];
 closeDialog 2;
 
if (_item == "WC_Matches" ) then 
{
TitleText ["Делаем костер", "PLAIN DOWN",0.5];
_pos = player getRelPos [1.5, 0];
_fireplace = createVehicle ["Land_Campfire_F",_pos, [], 0, "can_collide"];
};
 
false      
};      
 
while {true} do 
{  
waituntil {!(isnull (finddisplay 602))};
      
((findDisplay 602) displayCtrl 638) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];  
((findDisplay 602) displayCtrl 633) ctrlSetEventHandler ["LBDblClick", " _this call fn_dblClick"];  
((findDisplay 602) displayCtrl 619) ctrlSetEventHandler ["LBDblClick", "_this call fn_dblClick"];    
 
waituntil {isnull (finddisplay 602)};      
};  
}; 
 

 Надеюсь понятно.

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

А как сделать чтобы костер зажигался только когда есть спички, чтобы экшена не было ?


  • 0

#10 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 29 July 2018 - 18:03

А как сделать чтобы костер зажигался только когда есть спички, чтобы экшена не было ?

Проверить наличие в инвентаре спичек. Но нужно другой тип костра (если такой есть конечно), либо делать свой костерок со своими проверками и экшенами.


  • 0

#11 OFFLINE   sasha11273

sasha11273

    Рядовой

  • Пользователи
  • 1 сообщений

Отправлено 13 May 2022 - 10:41

Доброго времени суток. Повторил все действия - костер появляется. Но хотелось бы узнать, как улучшить скрипт по вышеперечисленным советам: 1) как сделать через хандлер который активируется при открытии и закрытии инвентаря, дабы не использовать бесконечный цикл; 2) как запустить проверку - есть ли в инвентаре игрока сама модель костра (как вариант - дрова) и спички перед появлением костра; 3) как удалить спички и дрова с инвентаря за секунду до появления костра, дабы каждый костер требовал дополнительных ингредиентов и не было возможности разжечь тысячи костров  ; 4) как "не стоит зразу закрывать дисплей инвентаря"?. У кого-нибудь есть готовый, доведенный до ума по всем канонам код? Заранее спасибо.


  • 0




Яндекс.Метрика