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

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

Что-то не пойму, реально ли перенести вещи в ящик который находится далеко от ГГ? Более 150 м.

Делаю так:

 

 

function RelocActInvInBox(oBoxSId)
local oBox = get_story_object(oBoxSId)
if oBox then
  local function TransferItems(oItem)
   if oItem:section()~="wpn_binoc" and oItem:section()~="wpn_knife" and oItem:section()~="device_torch" then
    db.actor:transfer_item(oItem,oBox)
   end
  end
  db.actor:inventory_for_each(TransferItems)
end
end

 


В онлайне работает, в оффлайне - нет, оно и понятно. Но как быть?

Ранее был известен под ником BoBaH_671.

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

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

 

 

--Ограбление на Янтаре.
function yan_grab_func_1()
 level.disable_input()
 level.hide_indicators()
 timefactor = level.get_time_factor()
 level.set_time_factor(1000)
 local dir=device().cam_dir
 db.actor:set_actor_direction(dir.x,dir.y,0) --выравниваем направление взгляда, чтобы было падение более реалистичным
 level.add_cam_effector("camera_effects\\surge_02.anm", 2532, false, "")
 level.add_pp_effector("surge_fade.ppe", 2011, false)
 local snd_obj = xr_sound.get_safe_sound_object([[actor\hit_5]])
 snd_obj:play_no_feedback(actor, sound_object.s2d, 0, vector(), 15.0)
 sim = alife()
 soBox = sim:story_object(62333)
 switch_online(soBox.id)
 start_quick_timer(3, "gz_tasks.yan_grab_func_2") --Здесь таймеры Артоса. Можно использовать любые другие. По идее надо чуть подождать вроде чтобы тайник вышел в онлайн. Ну у меня как раз в данном случае все совпало как надо: пока потемнение в глазах пусть и пара таймеров сработает, мне не мешают.
end

function yan_grab_func_2()
 level.add_pp_effector("peace_fade.ppe", 1973, true)
 gz_utils.spawn_item_in_inv("item_hud_medkit", 3)
 gz_utils.spawn_item_in_inv("military_outfit")
 gz_utils.spawn_item_in_inv("wpn_ak74")
 gz_utils.spawn_item_in_inv("ammo_5.45x39_fmj", 2)
 gz_utils.spawn_item_in_inv("item_hud_voda", 3)
 start_quick_timer(4, "gz_tasks.yan_grab_func_3")
end

local function transfer_object_item(item)
    out_object:transfer_item(item, in_object)
end

function yan_grab_func_3()
 box_with_loot = level_object_by_sid(62333)
 out_object = db.actor
 in_object = box_with_loot
 db.actor:inventory_for_each(transfer_object_item)
 level.set_time_factor(timefactor)
 level.remove_pp_effector(1973)
 level.enable_input()
 level.show_indicators()
 --switch_offline(soBox.id)
end

 


Вам в принципе важно вот это:
 

 sim = alife()
 soBox = sim:story_object(62333)
 switch_online(soBox.id)
Изменено пользователем Kondr48
Ссылка на комментарий

@BoBaH_671, очевидно оперировать серверными объектами, так как дистанция работы клиентских методов равна радиусу онлайна, и немного не понятно зачем их применять за этими рамками. На xp-dev есть метод teleport_object, но у меня не было повода проверить как он работает, судя по коду работает корректно (говорю основываясь на подобных методах, которые пишу сам).

 

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

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

Карлан, а какой поможет межлокационно? Речь идет о том, чтобы передать вещи актора в тайник который находится где-то там. Как поможет teleport_object? Телепортировать тайник в зону где он станет онлайн и потом обратно? Или функция работает шире, чем я думаю? Хотелось бы каких-то более подробных что ли пояснений.

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

@Kondr48, не знаю, можно ли это сделать скриптами - reject итема который хочешь перенести, далее attach_child или как оно там к ящику в который хочешь сохранить предмет. Это лишь теория)

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

 

 

Но как быть?

Для начала - показать содержимое ф-ции get_story_object(...). Ну или судя по всему, сразу, самому изменить в ней получение объекта ящика с "клиентской" ф-ции на "серверную"...

Ссылка на комментарий
Для начала - показать содержимое ф-ции get_story_object

Это функция оригинала ЗП, на этой платформе я и работаю.

function get_story_object(story_obj_id)
local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
if obj_id == nil then return nil end
return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end
самому изменить в ней получение объекта ящика с "клиентской" ф-ции на "серверную"...

Помогите в этом, будьте добры. ;)

Уже разобрался, отбой. 

В сдк в параметрах объекта убрал галку can_switch_offline.

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

Ранее был известен под ником BoBaH_671.

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

 

 

В сдк в параметрах объекта убрал галку can_switch_offline.

Костыль сделал...

Если ящик будет на локации, отличной от той, где сейчас ГГ(актер) то опять не сработает. А переделка ф-ции(а еще лучше написание собственной) состоит в использовании уже подсказанного выше:

local sim = alife()
soBox = sim:story_object(62333)

Этот код вернет серверный объект ящика, который существует всегда, не зависимо от того на какой локации относительно загруженной находится и попал ли в он-лайн радиус.

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

А как в функцию добавить паузу? Чтобы следующее например отключение инфопоршня произошло через секунду после его получения?

give_info("zamer_dozimetr")
????????????????????????????		
disable_info("zamer_dozimetr")
Добавлено Kirgudu,

Перенёс из «общих вопросов программирования»

Ничто не вечно под луной.

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

Таймеры использовать. Например отсюда:
http://www.amk-team.ru/forum/topic/13216-sborochnyj-tcekh/?p=971137

Вообще есть что-то штатное через level.add_call если не ошибаюсь, но я не помню как это использовать.

P.S. но я вообще не понимаю, зачем давать поршень и забирать его через секунду.

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

@KitkaT.Net,

local toggle_time = 0
function test_pause()
  give_info("zamer_dozimetr")
  toggle_time = time_global() + 1000
  level.add_call(
    function() return time_global() > toggle_time end, -- условие срабатывания
    function() disable_info("zamer_dozimetr") end -- выполняется, если условие равно true
  )
end
  • Спасибо 1
  • Нравится 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

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

  • Нравится 1

Ничто не вечно под луной.

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

@KitkaT.Net, я же тебе приводил пример, когда при юзании предмета выдается поршень. То есть сделай такую логику:

[logic]
active = sr_idle

[sr_idle]
on_info = {+check_your_info =actor_in_zone(имя_рестриктора)} sr_idle@timer ;-- check_your_info - это тот самый поршень, который ты выдаешь при юзе предмета и проверяем нахождение актора в нужной зоне.

[sr_idle@timer]
on_timer = 30000 | sr_idle@nil %+your_timer_complete%
on_info = {!actor_in_zone(имя_рестриктора)} sr_idle ;-- а тут если актор вышел из зоны до истечения времени, логика возвращается в первую секцию. Это если тебе нужно.

То есть мы проверяем наличие поршня после использования и наличие актора в нужной зоне. Можно использовать схему sr_timer, в ней на худ будет выводится время. 

Изменено пользователем BoBaH_671
  • Спасибо 1

Ранее был известен под ником BoBaH_671.

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

Как повторить подряд n раз ф-цию? Нужно заспавнить n трупов. Устраивает, просто забыл поставить end для for :unsure:

function spawn_dead_mil_esc()
	local obj=alife():create("mil_spetsnaz",vector():set(341.901,15.535,-16.927),585673,2)
	obj:on_death()
end

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

Изменено пользователем dPlayer
Добавлено Kirgudu,

for i=1,n do func() end чем-то не устраивает?

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

Добрый день. Сделал меню:

class "gui_ryukzak" (CUIScriptWnd)

function gui_ryukzak:__init() super()
	self:InitControls()
	self:InitCallBacks()
end

function gui_ryukzak:__finalize()
end

function gui_ryukzak:InitControls()
	local xml = CScriptXmlInit()
	self:Init(0,0,1024,768)
	xml:ParseFile("ui_gui_ryukzak.xml")
	self.fon = xml:InitStatic("fon", self)
	self:Register(xml:Init3tButton("fon:button_add", self.fon), "button_add")
	self:Register(xml:Init3tButton("fon:button_exit", self.fon), "button_exit")
	self:Register(xml:Init3tButton("fon:button_open", self.fon), "button_open")
	self.Text_1 = xml:InitStatic("fon:Text_1", self.fon)
	self.Text_2 = xml:InitStatic("fon:Text_2", self.fon)
	self.Text_3 = xml:InitStatic("fon:Text_3", self.fon)
	self.global_text = xml:InitStatic("fon:global_text", self.fon)

end

function gui_ryukzak:InitCallBacks()
	self:AddCallback("button_add", ui_events.BUTTON_CLICKED, self.button_add_button_clicked, self)
	self:AddCallback("button_exit", ui_events.BUTTON_CLICKED, self.button_exit_button_clicked, self)
	self:AddCallback("button_open", ui_events.BUTTON_CLICKED, self.button_open_button_clicked, self)
end 

Как мне открыть это меню? Знаю что как-то так:

		if dik == DIK_keys.DIK_Q then
			self:...()

Так же, как мне его закрыть?

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

@Kober(BRUC), в ТЧ открыть:

level.start_stop_menu(gui_ryukzak(), true)

Закрыть внутри класса:

self:GetHolder():start_stop_menu(self, true)

В ЗП: открыть:

gui_ryukzak():ShowDialog()

закрыть внутри класса:

self:HideDialog()

Изменено пользователем naxac
  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

 

 

Как заспавнить тайник скриптом? Причем чтобы все данные о нём в этом же скрипте и указать (визуал и наполнение)

Вопрос некорректный. Данные разнообразны, в частности даже визуал и наполнение, первое это серверная часть, второе это клиентская часть. Можно сделать несколько секций с нужными тебе визуалами, либо сделать метод и ассоциировать его с чем либо. По второму жди пока тайник выйдет в онлайн и забрасывай все что тебе нужно.

 

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

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

Есть поле в которое можно ввести текст:

function start_game:name_GetText()
	return self.name:GetText()
end

Как это работает? Как мне вывести эту информацию(которая была вписана в это текстовое поле игроком) в, например, локальную переменную txt_set:

local txt_set = ""

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

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

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

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

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

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

Войти

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

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

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