Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                             local reason = string.format(fmt, ...)
                             error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
gamerДата: Чт, 08.01.2015, 14:21 | Сообщение # 571
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

Хоть бы написали пошел вон ....Спасибо за критику и помощь.Прошу удалить из сайта

Сообщение отредактировал gamer - Пн, 12.01.2015, 23:00
 
sergej5500Дата: Вс, 11.01.2015, 21:18 | Сообщение # 572
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Возникло несколько вопросов.

1. Для СГМ есть дополнение "Улучшенный интеллект НПС". В процессе игры иногда бывают вылеты.

[cut=Лог][error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...r. - call of pripyat\gamedata\scripts\rx_wmgr.script:584: C stack overflow
[/cut]

Скрипт

Можно ли исправить скрипт?

2. В СГМ часто используются функции типа:

create_force("simulation_mix_boar_flesh",75.020805358887,-1.3890371322632,486.38436889648,398712,1649)
create("zat_b5_firepos_spot",352.80047607422,30.511331558228,73.61572265625,1553254,178)

[cut=_g]function create(who,x,y,z,lv,gv,spot_name,spot_descr)
local who_table=parse_general_names(who)
if z==nil and lv==nil and gv==nil then
obj=alife():create(get_random_string(who_table),level.vertex_position(x),x,y)
else
obj=alife():create(get_random_string(who_table),vector():set(x,y,z),lv,gv)
end
if obj then
sgm_modules.submodule_on_create(who,obj.id)
if exists(spot_name) and exists(spot_descr) then
add_spot_on_map(obj.id,spot_name,spot_descr)
end
end
return obj
end

function create_force(squad_sect,x,y,z,lv,gv)
if y~=nil then
local board=sim_board.get_sim_board()
local squad=board:create_force(squad_sect,x,y,z,lv,gv)
for k in squad:squad_members() do
board:setup_squad_and_group(k.object)
end
squad:update()
else
local board=sim_board.get_sim_board()
local smart=board.smarts_by_names[x]
local squad=board:create_squad(smart,squad_sect)
board:enter_smart(squad,smart.id)
for k in squad:squad_members() do
board:setup_squad_and_group(k.object)
end
squad:update()
end
end[/cut]

Можно ли переделать функции, чтобы спавнить объекты по спавн-пойнтам. В СГМ есть неиспользуемая локация digger_stash. Вероятнее всего, разработчик СГМ использовал утилиты от АМК для сборки спавна. Приделать новую локу утилита может, а убрать нет. У меня не получилось. Отсоединить локацию можно с помощью СДК. Но диапазон гейм-вертексов наверняка поменяется. И объекты, заспавненные при помощи функций create и create_force, могут оказаться на других локациях.
 
makdmДата: Пн, 12.01.2015, 13:29 | Сообщение # 573
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, переделал функцию create

Теперь её также можно вызвать следующим образом:

create( секция, спавн-поинт, метка, описание_метки)

[cut noguest=Функция]
function create(who,x,y,z,lv,gv,spot_name,spot_descr)

local who_table=parse_general_names(who)
local sp_name = spot_name
local sp_descr = spot_descr
local obj = nil

if type( x ) == "string" then
if level.patrol_path_exists( x ) then
local ptr = patrol( x )
obj = alife():create(get_random_string(who_table),ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0))
sp_name = y
sp_descr = z
end
elseif z==nil and lv==nil and gv==nil then
obj=alife():create(get_random_string(who_table),level.vertex_position(x),x,y)
else
obj=alife():create(get_random_string(who_table),vector():set(x,y,z),lv,gv)
end

if obj then
sgm_modules.submodule_on_create(who,obj.id)
if exists(sp_name) and exists(sp_descr) then
add_spot_on_map(obj.id,sp_name,sp_descr)
end
end

return obj
end [/cut]

З.Ы. Функцию create_force переделывать нет смысла, т.к. spawn_point задаётся в секции сквада.
Вызов функции

create_force( секция_сквада, имя_смарта )


Терпение......
И все получится!


Сообщение отредактировал makdm - Пн, 12.01.2015, 13:50
 
sergej5500Дата: Чт, 15.01.2015, 21:43 | Сообщение # 574
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

Спасибо за помощь. Еще один вопрос. Можно ли СГМ тайники спавнить по спавн-пойнтам?

Непосредственно тайники спавнит функция.

[cut=Код]function place_secrets()
local selected_point
local par_point_num=1
par_points={}
local ini = ini_file("misc\\config_secrets.ltx")
local n = ini:line_count("secret")
for i=0,n-1 do
local result, id, value = ini:r_line("secret",i,"","")
if ini:section_exist(id) then
local items_count = ini:line_count(id)
local item_section = ""
local par_items="medkit"
local par_rank=nil
for i=0,items_count-1 do
result, item_section, str = ini:r_line(id,i,"","")
if item_section=="point_num" then
par_point_num=str
elseif item_section=="items" then
par_items=str
elseif item_section=="rank" then
par_rank=str
end
for s=1,par_point_num do
if item_section=="point_"..s then
par_points["point_"..s]=str
end
end
end
selected_point=math.random(1,par_point_num)
for k,v in pairs(par_points) do
if k~=nil and k=="point_"..selected_point then
local r_param=sgm_functions.check_section_comma(ini,id,k,nil,5)
if r_param~=nil then
local model_prefix="_"..get_random_line("a,b,c")
create_id=create_rukzak_item(par_items,id..model_prefix,tonumber(r_param[1]),tonumber(r_param[2]),tonumber(r_param[3]),tonumber(r_param[4]),tonumber(r_param[5]))
if par_rank~=nil and par_rank~="rank_0" then
if par_rank=="rank_1" then
bonus_rank_1_items(create_id)
elseif par_rank=="rank_2" then
bonus_rank_2_items(create_id)
else
bonus_rank_3_items(create_id)
end
end
end
end
end
par_points={}
end
end
end[/cut]

У каждого тайника есть секция, в которой указаны координаты.

[cut=Секция][zat_secret_1]
point_1 = -519.77032470703,28.677597045898,453.02563476563,28466,34
point_2 = -79.961,-3.57,434.717,783326,131
point_num = 2
items = wpn_ak74u
rank = rank_1[/cut]

Можно ли вместо числовых координат вставить спавн-пойнты и как переделать функцию спавна?

Добавлено (15.01.2015, 21:43)
---------------------------------------------
Добрый вечер.

Для квеста добавил два счетчика.

Счетчик убитых зверей. Вызывается из секции death, если зверя убил ГГ.

function esc_b1_monster_attack_death_count(actor,npc)
sgm_functions.inc_counter("esc_b1_monster_attack_death_all_count")
end


Счетчик погибших военных. Вызывается, если военных погиб в ходе квеста.

function esc_b1_army_death_count(actor,npc)
sgm_functions.inc_counter("esc_b1_army_death_all_count")
end


Наградная функция. Вызывается в диалоге.

function esc_b1_monster_attack_task_complete(actor,npc)
local reward=sgm_functions.read_variable("esc_b1_monster_attack_death_all_count")*200 - sgm_functions.read_variable("esc_b1_army_death_all_count")*350
if reward>0 then
dialogs.relocate_money(npc,reward,"in")
end
give_random_treasure()
give_secret(1)
end


За каждого убитого монстра ГГ должен получить по 200 рублей. За каждого погибшего воина - штраф 350 рублей.
Если конечная сумма окажется больше нуля, то игрок получит деньги.

Вместо денег получил вылет.

[cut=Лог]FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...Припяти\gamedata\scripts\dialogs_rasvet_addon.script:13: attempt to perform arithmetic on a nil value


stack trace:
[/cut]

Как правильно составить наградную функцию.

 
denis2000Дата: Чт, 15.01.2015, 23:30 | Сообщение # 575
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Пробуйте так:
Код
function esc_b1_monster_attack_task_complete(actor,npc)
if sgm_functions.read_variable("esc_b1_monster_attack_death_all_count")~=nil and sgm_functions.read_variable("esc_b1_army_death_all_count")~=nil then
   local reward = sgm_functions.read_variable("esc_b1_monster_attack_death_all_count")*200 - sgm_functions.read_variable("esc_b1_army_death_all_count")*350
elseif sgm_functions.read_variable("esc_b1_monster_attack_death_all_count")~=nil and sgm_functions.read_variable("esc_b1_army_death_all_count")==nil then  
   local reward = sgm_functions.read_variable("esc_b1_monster_attack_death_all_count")*200
   else
   local reward = 0
end
if reward > 0 then
   dialogs.relocate_money(npc,reward,"in")
end
give_random_treasure()
give_secret(1)
end


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Сб, 17.01.2015, 18:06 | Сообщение # 576
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго всем здравия мне в голову пришла мысль при начале новой игры ГГ сравнится случайный «лут».

[cut=Код]
Код
--Переменные
local standard_set {
      "device_torch",
      "wpn_binoc",
      "wpn_knife"
}

local random_number_1 = math.random(1,5)
local random_number_2 = math.random(2,7)

local random_loot_1 {
      "conserva",
      "energy_drink",
      "medkit",
      "bandage"
}

local random_loot_2 {
      "vodka",
      "kolbasa",
      "bread",
      "bandage",
      "drug_coagulant",
      "drug_radioprotector"
}

local random_loot_3 {
      "conserva",
      "kolbasa",
      "bread",
      "drug_antidot",
      "medkit_army",
      "drug_radioprotector"
}
--end

function spawn_random_loot_1 (first_speaker, second_speaker)  
  dialogs.relocate_item_section(second_speaker, "standard_set", "in")
  dialogs.relocate_item_section(second_speaker, "random_loot_1", "in",random_number_1)
  end

  function spawn_random_loot_2 (first_speaker, second_speaker)  
  dialogs.relocate_item_section(second_speaker, "standard_set", "in")
  dialogs.relocate_item_section(second_speaker, "random_loot_2", "in",random_number_2)
end

  function spawn_random_loot_3 (first_speaker, second_speaker)  
  dialogs.relocate_item_section(second_speaker, "standard_set", "in")
  dialogs.relocate_item_section(second_speaker, "random_loot_3", "in",random_number_1)
end
[/cut]
После чего решил проверить работоспособность скриптов для этого я модернизировал один из файлов логики.
[cut=Логика]
Код
[logic]
active = sr_idle@spawn_loot_start

[sr_idle@spawn_loot_start]
on_info1 = {~10} sr_idle@spawn_loot_1
on_info2 = {~10} sr_idle@spawn_loot_2
on_info3 = {~10} sr_idle@spawn_loot_3

[sr_idle@spawn_loot_1]
on_info = %=spawn_random_loot_1% sr_idle@1

[sr_idle@spawn_loot_2]
on_info = %=spawn_random_loot_2% sr_idle@1

[sr_idle@spawn_loot_3]
on_info = %=spawn_random_loot_3% sr_idle@1

[/cut]
Но при старте новой игры спавн предметов не происходит.


 
sergej5500Дата: Сб, 17.01.2015, 18:13 | Сообщение # 577
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Сахар,

Думаю, что рестриктор не срабатывает. Попробуй так.

[logic]
active = sr_idle@spawn_loot_start

[sr_idle@spawn_loot_start]
on_info = {~10} sr_idle@1 %=spawn_random_loot_1%, {~10} sr_idle@1 %=spawn_random_loot_2%, {~10} sr_idle@1 %=spawn_random_loot_3%, sr_idle@1

[sr_idle@1]
 
makdmДата: Ср, 28.01.2015, 11:21 | Сообщение # 578
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Можно ли СГМ тайники спавнить по спавн-пойнтам?

Цитата sergej5500 ()
Можно ли вместо числовых координат вставить спавн-пойнты и как переделать функцию спавна?


Вот функция спавна по вей-поинтам.

[cut noguest=Функция]function place_secrets()
local selected_point
local par_points = ""
local points_tbl = {}
local ini = ini_file("misc\\config_secrets.ltx")
local n = ini:line_count("secret")
for i=0,n-1 do
local result, id, value = ini:r_line("secret",i,"","")
if ini:section_exist(id) then
local items_count = ini:line_count(id)
local item_section = ""
local par_items="medkit"
local par_rank=nil
for i=0,items_count-1 do
result, item_section, str = ini:r_line( id, i, "", "" )
if item_section=="points" then
par_points = str
elseif item_section=="items" then
par_items = str
elseif item_section=="rank" then
par_rank = str
end
end

local points_tbl = parse_names( par_points )
local path_name = points_tbl[ math.random( 1, #points_tbl ) ]
local ptr = patrol( path_name )
local position = ptr:point( 0 )
local lv_id = ptr:level_vertex_id( 0 )
local gv_id = ptr:game_vertex_id( 0 )

local model_prefix="_"..get_random_line("a,b,c")
create_id = create_rukzak_item( par_items, id..model_prefix,
position.x, position.y, position.z, lv_id, gv_id)
if par_rank~=nil and par_rank~="rank_0" then
if par_rank=="rank_1" then
bonus_rank_1_items( create_id )
elseif par_rank=="rank_2" then
bonus_rank_2_items( create_id )
else
bonus_rank_3_items( create_id )
end
end

points_tbl = {}
end
end
end[/cut]

А вот так теперь выглядит секция тайника

[cut noguest=Секция][esc_secret_1]
points = esc_secret_1_spawn_point_1, esc_secret_1_spawn_point_2, esc_secret_1_spawn_point_3
items = wpn_toz34
rank = rank_1[/cut]

Проверяй всё ли работает правильно.


Терпение......
И все получится!
 
STALKER_2010Дата: Сб, 07.03.2015, 16:27 | Сообщение # 579
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ -10 ]

Всем добрый день.
Возникла проблема с переносом одного файла из ЧН в ЗП. А именно с функциями загрузки STATE_Read при создании новой игры.
[cut=STATE_Read (сокращенный)]
Код

function se_sim_faction:STATE_Read(packet, size)
        cse_alife_smart_zone.STATE_Read(self, packet, size)

        set_save_marker(packet, "load", false, "se_sim_faction")

        local n = packet:r_u8()

        self.squad_target_cache = {}
        for i = 1,n do
         local id = packet:r_stringZ()
         local value = packet:r_u16()
         self.squad_target_cache[id] = value
        end

        set_save_marker(packet, "load", true, "se_sim_faction")
end
[/cut]
В squad_target_cache валится всякая чепуха огромных размеров. Естественно set_save_marker негодует, да и оперировать этими данными конечно же нельзя. Там и куски логик, и всякие данные...
Как работает загрузка этих объектов через STATE_* при начале игры? Откуда берутся данные, которые игра подсовывает STATE_Read при начале новой игры, ведь свой STATE_Write ещё ни разу не вызывался (что видно по логам)! Надо где-нибудь что-нибудь прописывать? Класс - cse_alife_smart_zone.
[cut=class_registrator.script]
Код

cs_register    (object_factory, "ce_smart_zone",    "sim_faction.se_sim_faction",   "SFACTION",   "sim_faction")
cs_register    (object_factory, "ce_smart_zone",     "smart_terrain.se_smart_terrain",  "SMRTTRRN",   "smart_terrain")
cs_register    (object_factory, "ce_smart_zone",     "se_zones.se_restrictor",    "SPC_RS_S",   "script_restr")
[/cut]
Вот такое содержимое class_registrator. Как я думаю вы уже поняли, мой файл - это sim_faction. SFACTION - sim_faction из SDK CS, который в ЗП является DO_NOT_USE. Естественно в simulation.ltx я исправил sim_faction class.
Не представляю, как исправить данную ошибку. Возможно из-за того, что где-то что-то я не прописал. Помогите пожалуйста!


Сообщение отредактировал STALKER_2010 - Сб, 07.03.2015, 20:04
 
makdmДата: Сб, 07.03.2015, 21:51 | Сообщение # 580
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата STALKER_2010 ()
Помогите пожалуйста!

STALKER_2010, правильно заданный вопрос - это уже половина ответа.
Из вашего "помогите" - ничего не понял, если честно.
Вообще не понятно зачем вам это и что вы хотите сделать. Зачем нужен какой-то перенос функции из одной игры в другую?
Иногда хотят из телеги сделать паровоз, а вопрос задают: "И почему у меня колёса не крутятся?"
Вы по - русски можете написать, что вы хотите вообще сделать?


Терпение......
И все получится!
 
STALKER_2010Дата: Вс, 08.03.2015, 08:05 | Сообщение # 581
Гражданский
Пользователи
Сообщений: 12
Награды: 0
Репутация: [ -10 ]

makdm, вопросы были следующие, и правда, надо бы его перенести в конец сообщения.
Цитата STALKER_2010 ()
Как работает загрузка этих объектов через STATE_* при начале игры? Откуда берутся данные, которые игра подсовывает STATE_Read при начале новой игры, ведь свой STATE_Write ещё ни разу не вызывался (что видно по логам)! Надо где-нибудь что-нибудь прописывать?

Т.е. В начале новой игры первый раз вызывается STATE_Read, которому подсовываются вообще левые пакеты. STATE_Write вызывается только после этого. Вопрос, откуда беруться данные, подсовываемые STATE_Read до первого STATE_Write? Или Write должен вызываться, просто я где-то не прописал класс?


Сообщение отредактировал STALKER_2010 - Вс, 08.03.2015, 08:16
 
makdmДата: Вс, 08.03.2015, 10:49 | Сообщение # 582
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата STALKER_2010 ()
В начале новой игры первый раз вызывается STATE_Read

Цитата STALKER_2010 ()
Вопрос, откуда беруться данные, подсовываемые STATE_Read до первого STATE_Write?


При начале новой игры, данные для объектов считываются из all.spawn
И как только объект создан движком для него можно вызвать методы STATE_Read и STATE_Write
И никакой чепухи в объекте не будет. А будет именно то, что и было записано в all.spawn


Терпение......
И все получится!
 
sergej5500Дата: Чт, 12.03.2015, 00:31 | Сообщение # 583
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.

В СГМ для спавна рюкзаков с хабаром используют функцию

[cut=Функция]-- 'Создание инвентарного обьекта, с заполнение предметами.
function create_rukzak_item(items_tbl,model,x,y,z,lv,gv,extra_fill)
local secret_case=db.actor
local set_model
if model==1 then set_model="secret_rukzak"
elseif model==2 then set_model="secret_instrument"
elseif model==3 then set_model="secret_dinamit"
else set_model=model end
if z==nil and lv==nil and gv==nil then
secret_case=alife():create(set_model,level.vertex_position(x),x,y)
else
secret_case=alife():create(set_model,vector():set(x,y,z),lv,gv)
end
if exists(items_tbl) then
local parse_first_table=utils.parse_spawns(items_tbl)
for k,v in pairs(parse_first_table) do
for i=1,v.prob do
alife():create(v.section,vector(),0,0,secret_case.id)
end
end
end
if extra_fill~=nil and extra_fill==true then
sgm_secrets.flip_secret_items(secret_case.id)
end
return secret_case.id
end[/cut]

Вызывается строкой типа:

cell_items="money_meshochek_15000_20000,2,money_meshochek_5000_10000,3"
create_rukzak_item(cell_items,"esc_b2_sidor_schron_rukzak",346.78637695313,15.076410293579,243.62799072266,617354,1633)


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

[cut=функция]function create_rukzak_item(items_tbl,model,x,y,z,lv,gv,spot_name,spot_descr,extra_fill)
local secret_case=db.actor
local set_model
local sp_name = spot_name
local sp_descr = spot_descr
if type(x) == "string" then
if level.patrol_path_exists(x) then
local ptr = patrol(x)
secret_case = alife():create(get_random_string(set_model,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0))
sp_name = y
sp_descr = z
end
elseif
if model==1 then set_model="secret_rukzak"
elseif model==2 then set_model="secret_instrument"
elseif model==3 then set_model="secret_dinamit"
else set_model=model end
if z==nil and lv==nil and gv==nil then
secret_case=alife():create(set_model,level.vertex_position(x),x,y)
else
secret_case=alife():create(set_model,vector():set(x,y,z),lv,gv)
end
end
end
if exists(items_tbl) then
local parse_first_table=utils.parse_spawns(items_tbl)
for k,v in pairs(parse_first_table) do
for i=1,v.prob do
alife():create(v.section,vector(),0,0,secret_case.id)
end
end
end
if extra_fill~=nil and extra_fill==true then
sgm_secrets.flip_secret_items(secret_case.id)
end
return secret_case.id
end[/cut]

После этого мод перестал загружаться. Вылет на этапе отображения версии мода. Функция версии мода прописана а _g.script. Там же правленая функция.

Вопрос. Где я допустил ошибку?
 
denis2000Дата: Чт, 12.03.2015, 09:18 | Сообщение # 584
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Где я допустил ошибку?

Ощибки синтаксиса (не хватает скобки и лишние буквы):
Цитата
secret_case = alife():create(get_random_string(set_model),ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0))

Цитата
sp_name = y
sp_descr = z
end
elseif
if model==1 then set_model="secret_rukzak"

Цитата
secret_case=alife():create(set_model,vector():set(x,y,z),lv,gv)
end
end
end


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Чт, 12.03.2015, 12:18 | Сообщение # 585
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

denis2000,

Спасибо за помощь. Функция теперь в таком виде.

[cut=Функция]function create_rukzak_item(items_tbl,model,x,y,z,lv,gv,spot_name,spot_descr,extra_fill)
local secret_case=db.actor
local set_model
local sp_name = spot_name
local sp_descr = spot_descr
if type(x) == "string" then
if level.patrol_path_exists(x) then
local ptr = patrol(x)
secret_case = alife():create(get_random_string(set_model,ptr:point(0),ptr:level_vertex_id(0),ptr:game_vertex_id(0)))
sp_name = y
sp_descr = z
end
else
if model==1 then set_model="secret_rukzak"
elseif model==2 then set_model="secret_instrument"
elseif model==3 then set_model="secret_dinamit"
else set_model=model end
if z==nil and lv==nil and gv==nil then
secret_case=alife():create(set_model,level.vertex_position(x),x,y)
else
secret_case=alife():create(set_model,vector():set(x,y,z),lv,gv)
end
end
if exists(items_tbl) then
local parse_first_table=utils.parse_spawns(items_tbl)
for k,v in pairs(parse_first_table) do
for i=1,v.prob do
alife():create(v.section,vector(),0,0,secret_case.id)
end
end
end
if extra_fill~=nil and extra_fill==true then
sgm_secrets.flip_secret_items(secret_case.id)
end
return secret_case.id
end[/cut]

При вызове функции в диалоге:

[cut=Код]function esc_b2_sidor_schron_spawn(actor,npc)
local esc_b2_sidor_schron_spawn=math.random(1,3)
if esc_b2_sidor_schron_spawn==1 then
cell_items="money_meshochek_15000_20000,2,money_meshochek_5000_10000,3"
create_rukzak_item(cell_items,"esc_b2_sidor_schron_rukzak","esc_b2_sidor_schron_rukzak_1")
end
if esc_b2_sidor_schron_spawn==2 then
cell_items="money_meshochek_15000_20000,2,money_meshochek_5000_10000,3"
create_rukzak_item(cell_items,"esc_b2_sidor_schron_rukzak","esc_b2_sidor_schron_rukzak_2")
end
if esc_b2_sidor_schron_spawn==3 then
cell_items="money_meshochek_15000_20000,2,money_meshochek_5000_10000,3"
create_rukzak_item(cell_items,"esc_b2_sidor_schron_rukzak","esc_b2_sidor_schron_rukzak_3")
end
give_info("esc_b2_sidor_schron_rukzak_spawn")
end[/cut]

следует вылет

[cut=лог]FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...ld publishing\Зов Припяти\gamedata\scripts\_g.script:2125: bad argument #1 to 'getn' (table expected, got nil)


stack trace:[/cut]

Строка 2125

-- 'Случайный выбор строки из таблицы.
function get_random_string(tbl)
return tbl[math.random(table.getn(tbl))]
end
 
Поиск: