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

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

Люди может кто подсказать в чём дело?

Спавню НПС через алл.спавн - когда заспавнил для пробы без логики они нормально появляются.

Когда прописал им логику

[smart_terrains]
none = true

[logic]
active = camper

[camper]
path_walk = swamp_mil_walk_1
path_look = swamp_mil_look_1

 

Получаю стабильный вылет -

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: e:\games\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

Может кто подсказать в чём дело?

Изменено пользователем @"StreloK"

Prefiero morir de pie, que vivir siempre arrodillado.
 

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

@"StreloK"

На разных ресурсах по игре уже не один десяток раз давались разъяснения по ошибке типа:

_g.script:20: bad argument #2 to 'format' (string expected, got no value)

1. Давно пора бросить привычку читать сообщение об ошибке из стека блокнота и читать именно лог-файл. Именно в нем (как правило) выше секции 'FATAL ERROR' приводятся строки о месте/причине возникновения ошибки.

2. Данная строка формируется функцией 'abort', которая специально вызывается для нештатного прерывания игры при возникновении критичных ошибок. По многим файлам скриптов в различных местах можно увидеть вызовы принудительного прерывания.

 

В твоем случае, вероятнее всего указаны неверные/отсутствующие пути (swamp_mil_walk_1 и/или swamp_mil_look_1), что и приводит к ошибке в какой-то схеме (вероятно в move_mgr.script) и принудительному прерыванию.

Читай лог-файл и исправляй ошибку с путями, почитав про логику для НПС в статьях (см.шапку).

 

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

speczadanie

О нет-пакетах (этом классе) написано в топике "Справочник по классам и функциям".

Ты можешь прочесть и вывести в лог-файл сохраняемые параметры для Сидоровича, поверив на корректность его сохраняемые координаты. Так же после старта сэйва, можно проверить считанные значения.

Сам по себе Сидорович под стол не залезет - вот и ищи причину изменения координат его спавна или перемещения.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos - про глянуть лог-файл действительно забыл, спасибо что напомнил. Правда понять что вызывает ошибку моих знаний тут нехватает к сожалению

Клиент: Синхронизация...
* phase time: 135 ms
* phase cmem: 191612 K
* [win32]: free[1228952 K], reserved[35648 K], committed[832488 K]
* [ D3D ]: textures[379229 K]
* [x-ray]: crt heap[191612 K], process heap[476210 K], game lua[24436 K], engine lua[162 K], render[0 K]
* [x-ray]: economy: strings[3814 K], smem[0 K]
[16-9] get_xml_name for[game_tutorials.xml] returns [game_tutorials.xml]
[16-9] get_xml_name for[ui_credits.xml] returns [ui_credits.xml]
[16-9] get_xml_name for[ui_movies.xml] returns [ui_movies.xml]
[16-9] get_xml_name for[map_spots.xml] returns [map_spots.xml]
[16-9] get_xml_name for[map_spots_escape.xml] returns [map_spots_escape.xml]
[16-9] get_xml_name for[map_spots_garbage.xml] returns [map_spots_garbage.xml]
[16-9] get_xml_name for[map_spots_agroprom.xml] returns [map_spots_agroprom.xml]
[16-9] get_xml_name for[map_spots_darkvalley.xml] returns [map_spots_darkvalley.xml]
[16-9] get_xml_name for[map_spots_bar.xml] returns [map_spots_bar.xml]
[16-9] get_xml_name for[map_spots_military.xml] returns [map_spots_military.xml]
[16-9] get_xml_name for[map_spots_radar.xml] returns [map_spots_radar.xml]
[16-9] get_xml_name for[map_spots_mp.xml] returns [map_spots_mp.xml]
[16-9] get_xml_name for[map_spots_relations.xml] returns [map_spots_relations.xml]
[16-9] get_xml_name for[map_spots_lchangers.xml] returns [map_spots_lchangers.xml]
! Unknown command:  dbg:!-!-!-_Принудительный_Вылет_-!-!-!

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: e:\games\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)


stack trace:

 

 

Можешь что подскозать?

Prefiero morir de pie, que vivir siempre arrodillado.
 

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

@"StreloK"

ПодскАзать тебе к сожалению по сути нечего.

В твоей солянке явно кто-то криворучками постарался 'замазать' полезную для поиска причин информацию.

Строка: '! Unknown command: dbg:!-!-!-_Принудительный_Вылет_-!-!-!' - говорит о перехвате функцией печати в лог-файл и выдаче малоинформативного сообщения о принудительном вылете.

 

Как уже писал выше:

а) не имея твоих кодов солянки, врядли кто-то сможет помочь. А заниматься погадалками можно до бесконечности.

б) смотри корректность своих путей, задаваемых в конфиге логики! Предполагаю, что ты их даже в all.spawn не прописал.

 

Попробуй (межет криворучка не сильно кастрировал коды) заменить функция 'abort' в '_g.script' на эту:

function abort(fmt, ...)
  local sReason = string.format(fmt or '<NIL>', ...)
  assert('ERROR:' .. sReason)
  local con = get_console()
  con:execute('ОШИБКА:' .. string.gsub(sReason,'%s','_'))
  con:execute('flush')
  exit() --/> прерываем игру при фатальных ошибках
end

- может выдаст что-то более врызумительное и информативное.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos, а вот и мой

function create_level_changer(

p_story_id, -- STORY_ID нового level_changer (понадобится нам позже)

p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer

p_lvertex_id, -- level_vertext_id - идентифицируют уровень, на котором будет создан level_changer

p_gvertex_id, -- game_vertext_id

p_dest_lv, -- level_vertex_id - идентифицируют уровень, на будет перебрасывать игрока

p_dest_gv, -- game_vertex_id

p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок

p_dest_dir, -- направрение взгляда игрока

p_dest_level, -- название уровня, например "L11_Pripyat"

p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)

)

local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)

level.map_add_object_spot(obj.id, "level_changer", "")

local packet = net_packet()

obj:STATE_Write(packet)

-- свойства cse_alife_object

local game_vertex_id = packet:r_u16()

local cse_alife_object__unk1_f32 = packet:r_float()

local cse_alife_object__unk2_u32 = packet:r_u32()

local level_vertex_id = packet:r_u32()

local object_flags = packet:r_u32()

local custom_data = packet:r_stringZ()

local story_id = packet:r_u32()

local spawn_story_id = packet:r_u32()

-- свойства cse_shape

local shape_count = packet:r_u8()

for i=1,shape_count do

local shape_type = packet:r_u8()

if shape_type == 0 then

-- sphere

local center = packet:r_vec3()

local radius = packet:r_float()

else

-- box

local axis_x_x = packet:r_float()

local axis_x_y = packet:r_float()

local axis_x_z = packet:r_float()

local axis_y_x = packet:r_float()

local axis_y_y = packet:r_float()

local axis_y_z = packet:r_float()

local axis_z_x = packet:r_float()

local axis_z_y = packet:r_float()

local axis_z_z = packet:r_float()

local offset_x = packet:r_float()

local offset_y = packet:r_float()

local offset_z = packet:r_float()

end

end

-- свойства cse_alife_space_restrictor

local restrictor_type = packet:r_u8()

-- свойства cse_level_changer

local dest_game_vertex_id = packet:r_u16()

local dest_level_vertex_id = packet:r_u32()

local dest_position = packet:r_vec3()

local dest_direction = packet:r_vec3()

local dest_level_name = packet:r_stringZ()

local dest_graph_point = packet:r_stringZ()

local silent_mode = packet:r_u8()

packet:w_begin(game_vertex_id) -- game_vertex_id

packet:w_float(cse_alife_object__unk1_f32)

packet:w_u32(cse_alife_object__unk2_u32)

packet:w_u32(level_vertex_id) -- level_vertex_id

packet:w_u32( bit_not(193) ) -- object_flags = -193 = 0xFFFFFF3E

packet:w_stringZ(custom_data)

packet:w_u32(p_story_id) -- story_id

packet:w_u32(spawn_story_id)

packet:w_u8(1) -- количество фигур

packet:w_u8(1) -- тип фигуры: box

packet:w_float(2) -- axis_x_x

packet:w_float(0) -- axis_x_y

packet:w_float(0) -- axis_x_z

packet:w_float(0) -- axis_y_x

packet:w_float(4) -- axis_y_y

packet:w_float(0) -- axis_y_z

packet:w_float(0) -- axis_z_x

packet:w_float(0) -- axis_z_y

packet:w_float(4) -- axis_z_z

packet:w_float(0) -- offset_x

packet:w_float(0) -- offset_y

packet:w_float(0) -- offset_z

packet:w_u8(3) -- restrictor_type

packet:w_u16(p_dest_gv) -- destination game_vertex_id

packet:w_u32(p_dest_lv) -- destination level_vertex_id

packet:w_vec3(p_dest_pos) -- destination position

packet:w_vec3(p_dest_dir) -- destination direction (направление взгляда)

packet:w_stringZ(p_dest_level) -- destination level name

packet:w_stringZ("start_actor_99") -- some string, always const

packet:w_u8(p_silent) -- 1 for silent level changing

packet:r_seek(0)

obj:STATE_Read(packet, packet:w_tell())

end

 

а вот

function zat_to_lab()

create_level_changer(2000, vector():set(-313.8479309082,18.318702697754,632.98205566406),322208,212, -- где переход

934,2202, vector():set(-79.5249557495117,42.8666152954102,463.847686767578), -- куда переходить

vector():set(0.0,0.0,-1.0), -- направление взгляда при появлении

"av_peshera",1) -- на какую локу и запрос (0 - появится вопрос, 1 - автоматический переход)

news_manager.send_tip("Затон -> Лабиринт", "Новый путь!", 2, 25, "diagterev")

end

 

Напомню, левел ченжер хочу создать в зп, творю на сгм 1.7

Legend of Stalker

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

Вопрос к модераторам/админу форума:

 

Вроде как с сегодня при использовании тегов 'code' в публикуемых годах (IE или Maxthon) обратный слеш '\' стал превращаться в 'W', пример:

это должен быть обратный слеш: \

При использовании кодов, путей и т.п. это будет приводить к фатальным ошибкам! Нужно бы исправить.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos Ну насчёт солянки это ты зря - чистая бета Восстановление Старого Сюжета. И по обрезать функции мог только автор. Решил на досуге заселить Болота по старым Диздокам от ПЫС.

 

За функцию спасибо, теперь более-менее вразумительный лог.

 

[16-9] get_xml_name for[message_box.xml] returns [message_box.xml]
! Unknown command:  ОШИБКА:object 'swanp_soldier_regular_default3': path_walk 'swamp_dok_walk_1' has 1 waypoint, but has no flags
* Log file has been saved successfully!

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: e:\games\stalker\gamedata\scripts\_g.script:1141: attempt to call global 'exit' (a nil value)


stack trace:

 

 

С первым вылетом справился. Но появился новый --

 

! Unknown command:  ОШИБКА:object 'swanp_soldier_regular_default4': path_walk 'swamp_dok_walk_2', index 0: cannot find corresponding point(s) on path_look 'swamp_dok_look_2'
* Log file has been saved successfully!

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: e:\games\stalker\gamedata\scripts\_g.script:1141: attempt to call global 'exit' (a nil value)


stack trace:

Изменено пользователем @"StreloK"

Prefiero morir de pie, que vivir siempre arrodillado.
 

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

Народ, help! Разговор с лебедевым в чистом небе не начинается, он просто стоит и все... Естественно изменял скрипты, а где функции и скрипты отвечающие за эту сцену?

Заранее спасибо!

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

ziStam

Тобою взята функция, которая и далека от оптимальности и использоваться в исходном виде может ТОЛЬКО в ТЧ.

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

Попробуй вначале попроще вариант:

1. Возьми из мода "Simbion" модуль нет-пакетов (m_net_utils.script). Его можно найти и у автора твоей функции (create_level_changer) singapur22'а в его мобильном менеджере.

2. Заспавни переход по нужным координатам:

soLvChg = alife():create("level_changer", pos, lvid, gvid)

3. Замени требуемые параметры на свои, типа:

if soLvChg then
  local tT = m_net_utils.Get_Data_LvChanger(soLvChg)
  tT.story_id             = iStoryId
  tT.shapes[1]            = {type=0, center=vector():set(0,0,0), radius=3} --/ задать радиус (~=3)
  tT.restrictor_type      = 3
  tT.dest_level_name      = _f.Get_LevelName(tLC.d_gv)
  tT.dest_game_vertex_id  = tLC.d_gv
  tT.dest_level_vertex_id = tLC.d_lv
  tT.dest_position        = tLC.d_pos
  tT.dest_direction       = tLC.d_dir
  tT.dest_graph_point     = tLC.d_gp or ''
  tT.silent_mode          = tLC.d_sm or 0
  if tLC.path and tLC.path ~= "" then
    tT.custom_data = "[pt_move_if_reject]\npath = "..tLC.path
  end
  local bFlg = m_net_utils.Set_Data_LvChanger(tT,soLvChg)
  if bFlg then
    Add_MapSpot(soLvChg.id, "level_changer", tLC.hint or 'none')
    if tLC.info and not has_alife_info(tLC.info) then
      give_info(tLC.info)
      _f.Send_ReceivedInfo("st_take_new_way")
    end log("%s:Add_LvChanger:(%s)=[%s]:[%s]", sModule, iStoryId, soLvChg:name(), "+") --/#~#
    return soLvChg --/>
  else
    printf("Add_LvChanger:(%s)=[%s]~Write_net-paket:<%s>", iStoryId, soLvChg:name(), "Error!")
  end
end

- Внимание! Код взят из конкретного мода и требуется адаптация под свои нужды. Чуть позже дам вариант адаптации, если потребно.

 

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

@"StreloK"

Учись читать логи.

Тебе же пишется об ошибке пути: path_look 'swamp_dok_look_2'.

Вот и разбирайся почему у тебя некоректны для него точки ...

Уже ведь давал тебе совет - почитать про логику для НПС и соответственно про пути для схем!

(и прячь, плз, портянки кодов под спойлеры)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Есть ли готовая функция для перевода вектора, возвращаемого функцией db.actor:direction() в direction прописываемый в алл.спавне?

Freedom

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

_Призрак_

Если вопрос адресован мне, то для ЧН, Это отдельный ПДА. Я мог бы прикрутить его к основному, но честно говоря никогда так не пробовал да и нет желания, у него своя шкурка и свои задачи :)

Этакий планшет с иконками...

 

Собстно вот ещё хотел задать вопрос, в ЧН/ТЧ язык на русский никак не сменить? А то сделал мелкую записную книжку, но в ЧН раскладка не меняется. Или хотя бы есть ли колбек на Edit Box, который реагирует на добавление новых букв? Нашёл такой в lua_help но он не сработал. :(

 

const EDIT_TEXT_CHANGED = 81;

const EDIT_TEXT_COMMIT = 82;

 

Зато второй работает, но реагирует он тока на Enter

 

> Есть ли готовая функция для перевода вектора, возвращаемого функцией db.actor:direction() в direction прописываемый в алл.спавне?

Спасибо Kirag

-- преобразует дирекцию в угол

-- Можно найти лишь приблизительный поворт по осям X и Y

-- точность колебится от 1-2 градусов

function dir2angle(dir)
local pi = 0.017453292519943295769236907684886
-- Y --
local dir_h = vector():set(dir.x,0,dir.z):normalize()
local a = math.deg(math.acos(dir_h.z)) 

if dir_h.x < 0 then
    a = 360 - a
end

-- X --
local b = 90 * dir.y
return vector():set(b*pi, -1 * (a*pi), 0)
end

Поворот по Z не находит. Вроде рабочая, давно её не проверял, и не уверен, что надо отнимать a от 360

Но координаты похожие возвращала.

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Gun12

Возвращаясь к классу 'coroutine', дабы и не засорять справочный раздел и дать привязку теории к практике, предлагаю поломать голову над практической задачкой применительно именно к 'coroutine'.

Исходные данные:

Имеется довольно известный модуль из АМК-мода (amk_offline_alife.script), написанный Sokol_Jack-ом.

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

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

local bUpDelay = false --/ флаг разрешения/запрета сканирования
local iCurID = 0 --/ ID последнего отработанного обьекта
local iPause = 10 * 60 --/ периодичность апдейтов (~10 игровых минут)
local iUpTime = game_minutes() --/ время последнего глобального сканирования

function update() --/ вызов из actor_binder:update()
  if bUpDelay == false then --/ сканирование запрещено?
    if game_minutes() > iUpTime + iPause then --/ наступило время следующего сканирования?
      bUpDelay = true --/ разрешаем выполнение сканирования
      iCurID = 0 --/ устанавливаем начальный ID из диапазона (0...65534)
      off_npcs,items = {},{} --/ сброс/инициализация служебных таблиц
      printf("Updating offline-ALife started")
    end
  end
  if bUpDelay == true then --/ разрешено сканирование?
    if iCurID < 65535 then --/ еще не достигнут конец диапазона ID?
      local se_obj = alife():object(iCurID) --/ получаем серверный объект игры
      if se_obj ~= nil then --/ объект в игре?
        add_fresh_meat(se_obj) --/ функция сбора информации по объекту
      end
      iCurID = iCurID + 1 --/ следующий ID
    else --/ диапазон ID закончен - останавливаем сканирование
      bUpDelay = false --/ флаг запрета апдейта
      iUpTime = game_minutes() --/ запоминаем время окончания сканирования
      printf("Updating offline-ALife finished")
    end
  end
end

Как видно, периодично (каждые N-секунд игр. времени) сканируется весь диапазон игровых идентификаторов (ID) и

с найдеными объектами выполняется функция 'add_fresh_meat()'.

Минус данного метода в том, что кол-во объектов в игре довольно значительно (примем среднее для ТЧ значение ~25000).

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

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

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

Но, и тут есть минус. Т.к. разделить процесс сканирования можно вроде как по поддиапазонам ID (например сканировать по 100 за раз), то непредсказуемость длительности проверки конкретного объекта и наличие пустых (незанятых) диапазонов ID приводит и рваному темпу сканирования и затяжкам. Плавающее общее кол-во занятых ID также влияет на рваный тамп сканирования в процессе игры.

 

ИМХО, класс 'coroutine' может дать более плавное распределение нагрузки на ресурсы игры от сканирования всех игровых объектов, имея свойством выполняться и в другом потоке (треде) и приостанавливаться с возобновлением с прерванного момента.

В идеале - сделать бесконечный цикл с заданным (или даже управляемым) временем периода одного цикла (~15 минут игрового времени), который будет постоянно перебирать весь диапазон игровых ID (плавно размазанному по всему периоду цикла) и обновлять информацию по объектам.

 

Т.о. и практическая польза модам на базе АМК будет и практический пример применения класса с приостановкой выполнения функции и ... мозги немного размя можно желающим. ;-)

 

 

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

*Shoker*

Не готов дать свой 'правильный' вариант, но вариант Kirag'а не для этого случая.

1. В 'all.spawn' в параметр 'direction' заносятся цифры (углы) в радианах.

2. 'db.actor:direction()' - возвращает вектор в радианах.

Для чего заниматься переводом в градусы и обратно да еще без учета Z и погрешностями ... странно это?

ИМХО, просто не следует путать 'device().cam_pos' - камеру актора, с направлением объекта актора.

 

P.S. Пользовался этой:

function DirToDir(vVec)
  local vVecN = vector()
  vVecN.x = math.atan2(-vVec.y,vVec.z)
  vVecN.y = math.atan2(-vVec.x,vVec.z)
  vVecN.z = math.atan2(-vVec.y,vVec.x)
  return vVecN --/> vector_angles
end

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

"Ты можешь прочесть и вывести в лог-файл сохраняемые параметры для Сидоровича, поверив на корректность его сохраняемые координаты. Так же после старта сэйва, можно проверить считанные значения."

Artos, как это сделать?

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

Artos

Вот что ты мне напомнил ненароком. Нужно внести эту информацию в справочник :

 

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

 

А вот "размазать по времени" вполне можно.

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

Добрый день!

Необходимо сделать логику НПС-врага так, чтобы он реагировал на всех своих врагов, согласно заданным параметрам в файле game_relations.ltx, но до определённого момента не трогал бы актёра, оставаясь для него врагом, но тем не менее игнорировал бы его как врага.

Есть, конечно, вариант в логике вписать условие игнорирования:

combat_ignore_cond = always

, но это заставляет НПС игнорировать всё и вся.

Пробовал так:

combat_ignore_cond = {=fighting_actor}

и так:

combat_ignore_cond = {=actor_enemy}

- результата нет.

Нужно что-то типа того, как идёт игнорирование другого НПС по его стори_айди:

combat_ignore_cond = {=check_fighting(9608)}

, где 9608 стори_айди какого-нибудь НПС, но только применительно к актёру.

Так тоже не получилось:

combat_ignore_cond = {=check_fighting(actor)}

Есть ещё какие варианты? ТЧ 1.0004 + АМК

 

Пользуйтесь пожалуйста тегами. ColR_iT

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

Попробуй так:

combat_ignore_cond = {=fighting_actor -my_info}

my_info - инфопоршень после которого НПС перестает игнорить актора

И не забудь в logic дописать comabt_ignore = combat_ignore

И где нибудь в этом файле вставить:

[combat_ignore]
combat_ignore_cond = {=fighting_actor -my_info}

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

Freedom

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

Подскажите, возможно ли создание многоразового ремкомплекта в игре, одноразовый сделал, но хочется именно многоразовый, с возможностью восстановления 5-10% от первоначального состояния ствола. Со скриптами практически не дружу, хотя разобраться пытаюсь.

 

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

Сам скрипт ремонта

function use_repair_kit(what)
    local repair_slot_num = 0

    local item_in_slot_1 = db.actor:item_in_slot(1)
    local item_in_slot_2 = db.actor:item_in_slot(2)
    local item_in_slot_6 = db.actor:item_in_slot(6)

    if (item_in_slot_1 ~= nil) then
        repair_slot_num = 1
    end

    if (item_in_slot_2 ~= nil) then
        if (repair_slot_num == 0) then
            repair_slot_num = 2
        elseif (repair_slot_num == 1) then
            if (item_in_slot_1:condition() > item_in_slot_2:condition()) then
                repair_slot_num = 2
            end
        end
    end

    if (item_in_slot_6 ~= nil) then
        if (repair_slot_num == 0) then
            repair_slot_num = 6
        elseif  (repair_slot_num == 1) then
            if (item_in_slot_1:condition() > item_in_slot_6:condition()) then
                repair_slot_num = 6
            end
        elseif  (repair_slot_num == 2) then
            if (item_in_slot_2:condition() > item_in_slot_6:condition()) then
                repair_slot_num = 6
            end
        end
    end

    if (repair_slot_num == 1) then
        local rep_point = item_in_slot_1:condition() + 0.2
        if (rep_point > 1) then
            rep_point = 1
        end
        item_in_slot_1:set_condition(rep_point)
    elseif (repair_slot_num == 2) then
        local rep_point = item_in_slot_2:condition() + 0.2
        if (rep_point > 1) then
            rep_point = 1
        end
        item_in_slot_2:set_condition(rep_point)
    elseif (repair_slot_num == 6) then
        local rep_point = item_in_slot_6:condition() + 0.2
        if (rep_point > 1) then
            rep_point = 1
        end
        item_in_slot_6:set_condition(rep_point)
    end
end

Скрипт выдернут из nzk-мода, сам к сожалению написать не могу.

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

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

 

antreg, что у тебя не получается? Почитай вот эту статью: combat_ignore

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

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

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

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

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

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

Войти

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

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

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