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

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

Всем доброго времени суток. В чистую ТЧ сделал себе, по статьям из вики, спальник и ремкомплект. По отдельности они работают без проблем, но при соединении в одну геймдату работает только спальник. Совместно ими используется только bind_stalker.script.

function init (obj)


xr_motivator.AddToMotivator(obj)
end

function actor_init (npc)
npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}

lasthealth = 0
lasttime = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.WeatherManager()
self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
printf("actor net spawn")

level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
return false
end

db.add_actor(self.object)

if self.st.disable_input_time == nil then
level.enable_input()
end

self.weather_manager:reset()
-- game_stats.initialize ()

if(actor_stats.add_to_ranking~=nil)then
actor_stats.add_to_ranking(self.object:id())
end

--' Загружаем настройки дропа
death_manager.init_drop_settings()

return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
-- game_stats.shutdown ()
db.del_actor(self.object)

sr_light.clean_up ()

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
--self.object:set_callback(callback.actor_sleep, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)
self.object:set_callback(callback.use_object, nil)



if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end

xr_sound.stop_all_sound_object()

object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
object_binder.reinit(self)

local npc_id = self.object:id()

db.storage[npc_id] = { }

self.st = db.storage[npc_id]
self.st.pstor = nil

self.next_restrictors_update_time = -10000

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
self.object:set_callback(callback.use_object, self.use_object, self)
self.object:set_callback(callback.use_object, self.repair_outfit_start, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
local story_id = box:story_id()
if story_id == nil then
return
end

treasure_manager.take_item_from_box(box, story_id)
--[[
local respawner = se_respawn.get_respawner_by_parent(story_id)
if respawner == nil then
return
end

--' Необходимо уменьшить счетчик в респавнере
respawner:remove_spawned(item:id())

local smart_terrain = db.strn_by_respawn[respawner:name()]
if smart_terrain == nil then
return
end

local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
if npc ~= nil then
xr_sound.set_sound_play(npc, "reac_box")
xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)
end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
level_tasks.process_info_portion(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
if sell_bye == true then
game_stats.money_trade_update (money)
else
game_stats.money_trade_update (-money)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
--printf("article_callback [%s][%s]", group, name)
if device().precache_frame >1 then return end

if group == "Diary" then
news_manager.send_encyclopedy("diary", group)
else
news_manager.send_encyclopedy("encyclopedy", group)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
level_tasks.proceed(self.object)
--game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
end

function actor_binder:use_obj(obj)
main_sleep.sleep(obj)
end

----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
if _objective:get_idx() == 0 then
if _state == task.fail then
news_manager.send_task(db.actor, "fail", _task, _objective)
elseif _state == task.completed then
task_manager.reward_by_task(_task)
news_manager.send_task(db.actor, "complete", _task, _objective)
else
news_manager.send_task(db.actor, "new", _task, _objective)
end
else
if _task:get_objective(0):get_state() == task.in_progress then
news_manager.send_task(db.actor, "update", _task, _objective)
end
end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
if (false==app_ready()) or (device().precache_frame>1) then return end
--'news_manager.send_task(db.actor, "new")
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)

show_time.show_time()
-- апдейт погоды
self.weather_manager:update()

-- апдейт схемы детектора
self.actor_detector:update()

-- апдейт звуковой схемы актера
xr_sound.update_actor()

--' Проверка потери жизни
--[[
if self.object.health - lasthealth > 0.001 or
self.object.health - lasthealth < -0.001 then
printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
lasthealth = self.object.health
lasttime = game.time()
end
]]
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end
-- Обновление сна с переносом чувака в указанную позицию
if self.st.sleep_relocate_time ~= nil and
game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle
then
self.object:set_actor_position(self.st.sleep_relocate_point)
local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
self.object:set_actor_direction(dir:getH())
self.st.sleep_relocate_time = nil
end

-- Апдейт прятание оружия игрока во время диалога
if weapon_hide == true or self.object:is_talking() then
if self.weapon_hide == false then
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
self.object:restore_weapon()
self.weapon_hide = false
end
end

-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
if self.next_restrictors_update_time < time then
bind_restrictor.actor_update(delta)

self.next_restrictors_update_time = time + 200

task_manager.actor_update()
end

-- обновление постпроцессов
if post_process ~= 0 then
if post_process:update () == true then
post_process = 0
end
end

-- обновление пси-антенны
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end

--' Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static == nil then
hud:AddCustomStatic("cs_radiation_danger", true)
hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static ~= nil then
hud:RemoveCustomStatic("cs_radiation_danger")
end
end



if self.bCheckStart then
printf("SET DEFAULT INFOS")

if not has_alife_info("storyline_actor_start") and
(level.name() == "l01_escape")
then
self.object:give_info_portion("storyline_actor_start")
_G.g_start_avi = true
printf("*AVI* RUN START AVI")
end

-- if not has_alife_info("encyclopedy") then
-- self.object:give_info_portion("encyclopedy")
-- end

if not has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end

if not has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end

level_tasks.add_lchanger_location()

self.bCheckStart = false
end
--autosave.save_update()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)

local save_treasure_manager = true

printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
object_binder.save(self, packet)

--' Сохраняем уровень сложности
if save_treasure_manager == true then
packet:w_u8(level.get_game_difficulty() + 128)
else
packet:w_u8(level.get_game_difficulty())
end


--' Сохраняем данные об отключенном вводе
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packer:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end

xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)

sr_psy_antenna.save( packet )

if save_treasure_manager == true then
treasure_manager.save(packet)
end

task_manager.save(packet)
self.actor_detector:save(packet)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
object_binder.load(self, reader)
printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

--' Загружаем уровень сложности
local game_difficulty = reader:r_u8()

local load_treasure_manager = false
if game_difficulty >= 128 then
game_difficulty = game_difficulty - 128
load_treasure_manager = true
end


get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

if reader:r_eof() then
abort("SAVE FILE IS CORRUPT")
end

local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end

xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)

sr_psy_antenna.load(reader)

if load_treasure_manager == true then
treasure_manager.load(reader)
end


task_manager.load(reader)
self.actor_detector:load(reader)
end




function actor_binder:repair_outfit_start(obj, who)
if obj then
if obj:section() == "abc_repair" then
remkomplekt.action_repair()
end
end
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
-- sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
weapon_hide = true
end
function restore_weapon()
weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
printf ("file : %s",file_name)
printf ("section : %s",section_name)

local file = ini_file(file_name)
local n = file:line_count(section_name)
printf ("lines : %d",n)

local id, value = "", "", result
for i=0,n-1 do
result, id, value = file:r_line(section_name,i,"","")
printf ("line %d : %s = %s",i,id,value)
end
end

test_section_iteration("system.ltx","space_restrictor")
/**/


 

Вопрос как их заставить работать в одном моде?

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

self.object:set_callback(callback.use_object, self.use_object, self)

self.object:set_callback(callback.use_object, self.repair_outfit_start, self)

А чего вы для одного колбека делаете две разные функции?

Оставьте только первое.

 

self.object:set_callback(callback.use_object, self.use_object, self)

Потом ищите свою функцию use_object (она у вас почему-то use_obj называется), где спальник прописан и переносите кусочек, который отвечает за ремкоплект из функции repair_outfit_start в use_object.

Вот так:

 

function actor_binder:use_object(obj)
 main_sleep.sleep(obj)
 if obj:section() == "abc_repair" then
  remkomplekt.action_repair()
 end
end
 

function actor_binder:use_obj(obj)

main_sleep.sleep(obj)

end

 

function actor_binder:repair_outfit_start(obj, who)

if obj then

if obj:section() == "abc_repair" then

remkomplekt.action_repair()

end

end

end

 

 

P.S. А вообще старайтесь думать. Потому что в bind_stalker справки внесены совсем без понимания.

 

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

Что-то не пойму, реально ли перенести вещи в ящик который находится далеко от ГГ? Более 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

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

 

 

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

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

 

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

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

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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