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

Скриптование


Svoboда

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

Для ТЧ, делаю девайс, он уже работает, но хотелось бы добавить ключ, который позволит им пользоваться. (вызывать диалоговое окно). Подскажите ПЛЗ как, или хот намекните. СПС.

Поделиться этим сообщением


Ссылка на сообщение

AndreySol, Да вариант с ключем, как с предметом.

 

local key = db.actor:object("key") --проверка на ключ

if note and type(note) == "number" then

if not level.object_by_id(note) then

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

 

Ключа нет, а диалоговое окно открывается.

Поделиться этим сообщением


Ссылка на сообщение

Shredder, Прописал так:

 

if note and type(note) == "number" then

if not level.object_by_id(note) then

local key = db.actor:object("key")

if key then --проверка на ключ

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

 

Вылет по бинду.

Поделиться этим сообщением


Ссылка на сообщение

 

Shredder,

local note = nil

 

function use_repkit()

 

if note and type(note) == "number" then

if not level.object_by_id(note) then

local key = db.actor:object("key")

if key then --проверка на ключ

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

end

note = nil

end

if note and type(note) == "userdata" then

note = note:id()

else

note = nil

end

end

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

Поделиться этим сообщением


Ссылка на сообщение

Shredder, Да, я только учусь. Это прописывал. Но вылет мешает, опять бинд.

И если убрать :

if note and type(note) == "number" then

if not level.object_by_id(note) then

Тот-же вылет.

Поделиться этим сообщением


Ссылка на сообщение

Zander_driver, Согласен, но вылет стабилен!

\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:240: attempt to index global 'repair' (a nil value)

В строчке 240: repair.use_repkit().

 

Если к коду добавить:

if note and type(note) == "number" then

if not level.object_by_id(note) then

 

Девайс пропадает из инвентаря, а диалоговое окно ремонта не появляется.

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

Поделиться этим сообщением


Ссылка на сообщение

Shredder, Спасибо, до этого не допёр: if db.actor:object("key") then. Проверка нужна для квеста. СПАСИБО!!!

 

Поделиться этим сообщением


Ссылка на сообщение
 ----------
-- чтение формы из нет-пакета
----------
function r_shape(packet)
local s
local st = {}
st.count = packet:r_u8()
st.shapes = {}
for i=1, st.count do
s = {}
s.type = packet:r_u8()
if s.type == 0 then
s.center = packet:r_vec3()
s.radius = packet:r_float()
else
s.axis_x = packet:r_vec3()
s.axis_y = packet:r_vec3()
s.axis_z = packet:r_vec3()
s.offset = packet:r_vec3()
end
st.shapes[i] = s
end
return st
end

----------
-- запись формы в нет-пакет
----------
function w_shape(packet, st)
local s
packet:w_u8(st.count)
for i=1, st.count do
s = st.shapes[i]
packet:w_u8(s.type)
if s.type == 0 then
packet:w_vec3(s.center)
packet:w_float(s.radius)
else
packet:w_vec3(s.axis_x)
packet:w_vec3(s.axis_y)
packet:w_v ec3(s.axis_z)
packet:w_vec3(s.offset)
end
end
end

----------
-- перепаковка нет-пакета созданного скриптом рестрикта
----------
function rewrite_restrictor(se_obj, custom, radius)
local packet = net_packet()
se_obj:STATE_Write(packet)
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local shape = r_shape(packet)
local restrictor_type = packet:r_u8()

custom_data = custom
shape = {}
shape.count = 1
shape.shapes = {}
shape.shapes[1] = {}
shape.shapes[1].type = 0
shape.shapes[1].center = vector():set(0,0,0)
shape.shapes[1].radius = radius

packet:w_u16(game_vertex_id)
packet:w_float(distance)
packet:w_s32(direct_control)
packet:w_s32(level_vertex_id)
packet:w _s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(story_id)
packet:w_s32(spawn_story_id)
w_shape(packet, shape)
packet:w_u8(restrictor_type)
se_obj:STATE_Read(packet, packet:w_tell() - packet:r_tell())
end

function create_shompl_restr()
local se_obj = alife():create("space_restrictor",vector():set(-247.4907989502,-20.131322860718,-153.27322387695),12047,47)
local custom = "[logic]\ncfg = scripts\ins\shompl.ltx" --путь к логике рестриктора
rewrite_restrictor(se_obj, custom, 5.0) --5.0 - это радиус действия нашего рестриктора
end

 

 

Вроде всё правильно сделал, но при добавлении в бинд_сталкер имя_файла.create_shompl_restr(), происходит вылет по этой строчке.

Подскажите, может что-то пропустил?

Поделиться этим сообщением


Ссылка на сообщение

NaslednikTutti,

 [logic]
active = sr_idle@one

[sr_idle@one]
on_actor_inside = {+поршень} nil %=имя_скрипта.функцияl()%

 

nil указывает на однократное срабатывание.

 

Добавлено через 23 мин.:

Пытаюсь запустить скрипт

function in_loc()

if level_name == "l05_bar" then

return true

else

return false

end

end

 

function metka_gost()

printf ("Поговорить В Баре с Гостом")

news_manager.send_tip(db.actor, "%c[255,0,255,0]ГОСТ\\n%c[default]Зайди в бар, дело есть.", 0, "trader", 10000)

local obj = alife():story_object(504) --сид Госта

local obj_id = obj.id

function add_spot_on_map(obj_id,type,text)

if obj_id then

if not text then text = "no_text" end

level.map_add_object_spot_ser(obj_id, type, text)

end

end

 

function add_spot_on_map2(obj_id,type,text)

metka_gost.add_spot_on_map(obj.id,"green_location","Поговорить с Гостом")

end

 

из бинд_сталкера. Прописывал в function actor_binder:update(delta) потм в function actor_binder:net_spawn(data)

metka_gost.in_loc (actor, npc)
return false
end

и получаю вылет. Подскажите, что не так сделал.

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

Поделиться этим сообщением


Ссылка на сообщение

Struck, Делаю по уроку.

 

имя_файла.add_spot_on_map(obj.id,"green_location","Текст")

 

Какое имя_файла надо задать наверно не правильно понял.

 

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

 

 

Поделиться этим сообщением


Ссылка на сообщение
NaslednikTutti, Это логика для рестраикса. Изменено пользователем ins33

Поделиться этим сообщением


Ссылка на сообщение

Подскажите, как запустить скрипт через определённый промежуток времени. В скрипте две функции: проверка_наличия_предмета и функция_действия.

Поделиться этим сообщением


Ссылка на сообщение

Struck Я собираюсь его запускать при заходе на локу, с определённым событием.

 

пстор это что?

Поделиться этим сообщением


Ссылка на сообщение

С помощью string.find получаю таблицу в которой есть строки с индексом _delet.
Затем table.remove(tbl, _delet) пытаюсь очистить таблицу от всех строк _delet
и ловлю вылет bad argument #1 to 'foreach' (table expected, got table) -- вместо таблицы получена таблица

table.remove(obj, "_flame") --> bad argument #1 to 'remove' (table expected, got userdata)

 for  a=10,65635,1  do 
  local   obj =level.object _by_id   (   a  )  
  if  obj  and  string.fi nd (  obj:nam e(),"search_")  then 
table.remove ( obj, _delete) 

По сути надо из таблицы:
a_*, а_*2, а_*_3, а_delet, а_*_delet, а_*_конец_таблицы
удалить все вхождения в delet.
Или произвести действие только с:
a_*, а_*2, а_*_3, а_*_конец_таблицы
исключая а_delet, а_*_delet

 

Или может надо вообще по другому получать таблицу?

 

@dsh,

local sObj = alife():object("esc_wolf")

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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