Перейти к контенту

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

И такой еще вопрос, как можно сделать, что бы функция отрабатывалась в следующем апдейте, тоесть вызов происходит в апдейте 1, а отрабатываеться функция в апдейте 2

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

@vampirnik77, самое первое решение, приходящее в голову: на первом апдейте поставить флажок и ничего не делать, а на втором апдейте проверить флажок, сделать что надо и сбросить его.

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

local myfunc_call = 1

function myfunc()

if myfunc_call == 1 then myfunc_call = 2; return end

myfunc_call = 1

...

end

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

 

 

-- Вызывает вункцию func спустя n апдейтов
function wait_call(func, n)
	local counter = n or 1
	level.add_call(
		function()
			if counter == 0 then
				return true
			end
			counter = counter - 1
			return false
		end,
		func
	)
end

 

 

Изменено пользователем Shredder
  • Нравится 1
Ссылка на комментарий

 

 

Конечно можно, берёшь исходники и вперёд. Иначе никак

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

-- Вызывает вункцию func спустя n апдейтов

Хех, я практически тоже самое делал себе))

function _G.parked_call(action, ...)
	local args = {...}
	local x = 2
	level.add_call(
	function()
		x = x - 1
		return x == 0
	end,
	function()
		loadstring("return function(args) "..action.."(unpack(args)) end")()(args)
	end
	)
end
Ссылка на комментарий

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

А может не будем голословны? Исходники передо мной и там не предусмотрено добавление пунктов из скриптов или конфигов.

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

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

А толку то с твоих постов? Даже если и есть возможность, ты же этот способ не показал. Поэтому пока ты голословен

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

Ах вот как, ну окей.

Показать видео - не считается за "показать".

Выложить код, пусть сырой - не считается за "показать"

Надо выложить код не сырой а готовый, со всеми пояснениями :) Ладно, это я пока не сделал. Значит голословен.

Изменено пользователем Zander_driver

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Ну вот поэтому я вас и называю слепым :)

Код в прозекторской, видео... попробуйте сами догадаться где.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

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

Для меня этот вариант вообще не вариант. Не доверяю я программистам, которые пишут в один файл овер 30000 строк кода.

А возвращаясь к исходному вопросу: "... можно ли добавить в это меню свой пункт?", брать исходники и добавлять, иначе никак

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

 

 

Ссылки то сразу дать религия не позволяет?

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

Когда к файлу будут инструкции, число строк в нем перестанет смущать :) а пока да. Все остается так же.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
Немогу понять почему не работает скрипт.По задумки при сбросе рюкзака он должен заполнятся инвентарем актора, делаю для теста что-бы понять как это все потом сделать в другом моде.
файл bind_stalker.script
function actor_binder:update(delta)
object_binder.update(self, delta)
 
-- DEBUG slowdown
-- slowdown.update()
 
local time = time_global()
 
game_stats.update (delta, self.object)
--***************************************************
-->>Treasure rucksack 1/2--- вот рабочий код сбрасываемого рюкзака, брал из википедии сталкера, этот код работает поэтому полностью его не привожу
if self.rr_id~=nil then--то что мы записали при дропе
-- пытаемся получить объект по id
local se_obj=alife():object(self.rr_id)
-- проверяем, что объекта нет
if se_obj==nil or se_obj:section_name()~="inv_ruck" then
local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара")
news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000)
--obj_ruck = ruck--это типа  переменной для теста с таймером
--Start_Timer_5_minutes()--подумал что может не успевает отработать, но с таймером та-же байда
my_mod.push_all(ruck) --вот та функция которая ЗДЕСЬ не работает, но работает в другом месте, не пойму что не так
end
-- сбросим переменную
self.rr_id=nil
end
--Timer_N_minutes()--пробовал типа по таймеру вызывать, все так-же не работает
--<<
--***************************************************
 
-- апдейт погоды
дальше все стандартно
...
Если сделать так, то рюкзак сбрасывается но походу после my_mod.push_all(ruck) ничего не работает :-( игра не вылетает но повторно скрипт уже не срабатывает как нужно, с таймером пробовал но все так-же.Код таймера не привожу так как там по сути все то-же самое только вызывается с задержкой.
 
Из my_mod.script
Функция заимствована из скрипта арены там где телепортирует актера на арену а все вещи складываются в ящик.
 
local function transfer_object_item(item)
    db.actor:transfer_item(item, in_object)
end
 
function push_all(obj)
    in_object  = obj
db.actor:inventory_for_each(transfer_object_item) 
end
 

Эту функцию я тестировал с модовым рюкзаком вызывая ее из калбека когда перс забирает предмет(ы) из ящика и там она работает

function actor_binder:take_item_from_box(box, item)--

--my_mod.push_all(obj)--вот так она работает, при перемещении чего либо из ящика срабатывает калбак, инвентарь актора перемещается в ящик, то что мы оттуда забрали перемещается в инвентарь так как и должно по коду игры.
--my_mod.Message("take_item_from_box")--типа сообщение для информирования 
Изменено пользователем antihumanist
Ссылка на комментарий

@antihumanist, у тебя ruck это серверный объект, а в transfer_item нужно передавать клиентский.

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

 

 

antihumanist, у тебя ruck это серверный объект, а в transfer_item нужно передавать клиентский.

Хм а получить его как ? в справочнике из очевидного не нашел

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

level.object_by_id(ruck.id), но вызвать нужно будет на следующем апдейте, т.к. в этом онлайновый объект ещё не появится

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

Точнее - проверять, пока не появился. Закладываться на фиксированное время - плохо.

Дабы не тормозило - см. про управление апдейтами (тысячи их !)

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

Точнее - проверять, пока не появился

 

Ура работает ! спасибо !

 

--***********************************************************************
--Код тестовый и по хорошему его нужно переделать, но для теста пойдет и так

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

function Start_Timer_5_minutes() 
    iTimer = --[[time_global() +]] 300  --тут закоментирован код таймера, просто устанавлевается флаг
end


function Timer_N_minutes() -- таймер переделанный в функцию проверки на существование, в апдейте
    if iTimer ~= nil --[[and iTimer < time_global()]] then
local c_ruck = level.object_by_id(obj_ruck.id)--поидее если объект не нашелся то его нет(работает)
if  c_ruck then
        my_mod.push_all(c_ruck)
iTimer = nil--убираем флаг или обнуляем таймер
end
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
object_binder.update(self, delta)


-- DEBUG slowdown
-- slowdown.update()


local time = time_global()


game_stats.update (delta, self.object)
--***************************************************
-->>Treasure rucksack 1/2
if self.rr_id~=nil then--то что мы записали при дропе
-- пытаемся получить объект по id
local se_obj=alife():object(self.rr_id)
-- проверяем, что объекта нет
if se_obj==nil or se_obj:section_name()~="inv_ruck" then
local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара")
news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000)
obj_ruck = ruck--передаем в переменную
  Start_Timer_5_minutes()--ставим флаг или таймер
--my_mod.push_all(level.object_by_id(ruck.id))--тут работать не будет
end
-- сбросим переменную
self.rr_id=nil
end
Timer_N_minutes()--выполняем таймер/функцию апдейта состояния рюкзака
--<<
--***************************************************


-- апдейт погоды

 

Тогда еще пара вопросов уж простите.Делаю  фан мод и сборку из  чужих скриптов для этого мода и поэтому вопросы совершенно разные.

Сделал ремонтные наборы, но столкнулся со странным багом, не совсем понимаю его природу.

суть его в том что когда я вызываю подряд две функции на съедание одного и того-же предмета то последняя функция не выполняется и дает глюки, точно так-же с вызовом удаления предмета.

Все обернуто в функцию которая вызывается из колбека self.object:set_callback(callback.use_object, self.repair_start, self)

 

function actor_binder:repair_start(obj, who)
my_mod.Message("use_object")
    if obj then 
main_sleep.sleep(obj)
        if obj:section() == "repair_kit_outfit" then --здесь указываем предмет, при использовании которого будет срабатывать функция ниже
         exp_mod.action_repair() --тут функции которые не учавствуют в тесте и уже тестироваись
elseif obj:section() == "repair_kit" then
exp_mod.repair_all()
elseif obj:section() == "repair_kit_wpn" then
exp_mod.repair_wpn()
--второй вариант ремонта
elseif obj:section() == "repair_kit_device" then--вот отсюда вызываю
exp_mod.repair_device()
elseif obj:section() == "repair_kit_wpn2" then
exp_mod.repair_wpn2()
elseif obj:section() == "repair_kit_outfit2" then
exp_mod.repair_outfit2()
        end
    end
end
--Короче говоря в моде есть три "съедобных" итема ящик с инструментами и ремкомплекты один для брони и другой для оружия, когда игрок пытается съесть ящик с инструментами то выполняется эта функция, которая по задумке должна ремонтировать все во всех слотах при этом съедая/удаляя из инвентаря расходники ремкомплектов. но оставляя инструменты.Не работает когда я пытаюсь вызвать подряд две функции съедания/удаления одного вида предмета.Ремкомплекты так-же обрабатываются при употреблении в пищу, с расчетом одна еденица ремкомплекта на одну еденицу брони/оружия в слоте.С оружием работают последовательно что сделанно для удобства ремонта чего-то одного а не всего сразу.
--repair_item_in_slot(num) -- это моя функция ремонта, переделанная, с википедии сталкера, к ней нет нареканий
--Она проверяет  слот num и возвращает true если предмет был отремонтирован, если в слоте пусто или предмет не того состояния которого требуется для ремонта или еще что не так то возвращает false, так-же информирует игрока.


function repair_device()--ящик с инструментами repair_kit_device, функция в которой должно ремонтироваться все что в слотах(сразу)


 local actor = db.actor
 local kit_outfit2 = actor:object("repair_kit_outfit2")--ремкомплект для костюма




   alife():create("repair_kit_device", vector(),0,0,0)--cпавним сразу как съели, хотя работало и если поместить в конец.
   
if kit_outfit2 then--проверяем наличие расходника для ремонта в инвентаре актора
--db.actor:eat(db.actor:object("repair_kit_outfit2"))         --можно его сразу тупо съесть
   if repair_item_in_slot(6) then                            --тогда этот код здесь не нужен, он запустися в биндере при "поедании" "repair_kit_outfit2"
       alife():release(alife():object(kit_outfit2:id()), true)--и этот код будет то-же не нужен
end--
end--конец ремонта костюма   


local kit_wpn2 = actor:object("repair_kit_wpn2")--ремкомплект для оружия, поидее тут я хочу отремонтировать сразу все стволы, т.е. два слота 1 и 2 поэтому делаю два раза одно и то-же.


if kit_wpn2 then
--db.actor:eat(db.actor:object("repair_kit_wpn2"))можно место удаления съедать, но у меня так не работало для двух одинаковых предметов сразу и я решил переделать
   if repair_item_in_slot(2) then
    alife():release(alife():object(kit_wpn2:id()), true)
end
end 
--Если раскомментировать код ниже, то он работать не будет ! но почему ?
--kit_wpn2 = actor:object("repair_kit_wpn2")--Здесь еще раз инициализируется на случай если объект съеден/удален кодом выше


--if kit_wpn2 then
----db.actor:eat(db.actor:object("repair_kit_wpn2"))--либо код жрачки либо код удаления
 --if repair_item_in_slot(1) then--при юзе кода жрачки не требуется
  --alife():release(alife():object(kit_wpn2:id()), true)
 --end 
--end 
  
end

 

Изменено пользователем Kirgudu
Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

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

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

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

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

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...