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

[SoC] Ковыряемся в файлах


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

Stalker_AleX333, вот держи: >>Click Me<<возьмешь нужные, хотя для таких просьб - есть спецально отведенная тема.

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

Изменено пользователем Куфзук
Ссылка на комментарий
у меня сейчас ничего не произошло

Уже нашёл кучу объектов с одинаковыми именами, например, тот же clmbl#0 есть на нескольких локациях. Походу это ляп разрабов. Кое-где так спешили, что забыли заменить level_prefix тем, чем надо.

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

Dennis_Chikin,

после кто-то неизвестный ворует патроны. 8(

...

Но, блин, кто ??? Сам движок ?

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

По идее все объекты удаляются в drop_manager. Но ты говоришь, что отключил. Значит ещё где-то осталось. Поищи "release" по коду. Нет так уж и много упоминаний.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
Полтергейст: Вопросик насчёт all.spawn: какие будут последствия, если у двух объектов одинаковое имя?
... Походу это ляп разрабов. Кое-где так спешили, что забыли ...

Не делай поспешных выводов в очередной раз.

Если просмотреть 'all.spawn', то можно заметить, что немало типов объектов в нем имеют одинаковые имена (костры, лампочки, ящики, ...).

Задумайся сам, а требуется ли выдумывать имена для подобных объектов, если условие: "на одной локации только уникальные имена" - выполняется в любом случае для подобных объектов.

Костры между локациями не перемещаются, ссылок на имена лампочек с разных карт не имеется, ящики, если и используются 'глобально', то только по story_id'ам, а не по именам ... Так ли уж обязательно задавать уникальные имена? :-)

Так что разработчики просто с'экономили на именах и своем времени ...

Иной вопрос для модмейкеров: заспавнить в тот же ящик к Сидорычу (с не уникальным именем для игры и без сид'а) - нужно немного 'попотеть' и пошевелить мозгами/познаниями. ;-)

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

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

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

parsek123, хочешь сделать обычный тайник, ну, или именной - без разницы, они только названиями отличаются и способом наполнения шмотками? Тогда понадобится присвоить ему ("инвенторибоксу", название секции inventory_box) уникальный story_id.

Присваиваем ящику "у Сидора" уникальный story_id, например, 5025 (можно и любой другой - главное, чтобы он был уникальным - иначе будут проблемы с запуском игры). Кроме этого, нужно добавить ящику "кустодату", в которой нужно указать, что этот ящик - тайник, иначе он не будет загружаться шмотками автоматически (зато его запросто можно будет отловить по story_id, и засунуть в него в любой момент всё, что угодно):

[658]

; cse_abstract properties

section_name = inventory_box

name = level_prefix_inventory_box_0003

position = -247.503921508789,-24.7944984436035,-135.684509277344

direction = 0,2.67659902572632,0

 

; cse_alife_object properties

game_vertex_id = 0

distance = 0

level_vertex_id = 594270

object_flags = 0xffffff3f

 

custom_data = <<END

[logic]

cfg = scripts\treasure_inventory_box.ltx

END

 

story_id = 5025

 

; cse_visual properties

visual_name = physics\equipment_cache\equipment_box_01_case

 

 

Далее, прописываем свеженький тайник в game_story_ids.ltx, примерно вот так:

5025 = "esc_secret_0025"

 

Затем регистрируем его treasure_manager.ltx, вот так:

В начале файла после названия секции

esc_secret_0025

 

B конец файла добавляем его секцию:

 

[esc_secret_0025]

target = 5025 ;story_id тайника

name = esc_secret_0025_name ;имя тайника

description = esc_secret_0025_descr ;краткое описание тайника

items = conserva, 3, grenade_f1, 2 ;в тайнике по умолчанию будут спониться 3 консервы и две гранаты Ф-1

condlist = {=npc_rank(novice)} 5 ;условие выдачи тайника

community = military ;группировка непися, выдающего тайник

 

 

Всё, тайник начнёт работать в автоматическом режиме.

Если же нужно принудительно затарить этот тайник нужными шмотками - например, десятью бутылками водки, консервой и дробовиком, делаем это при помощи скрипта:

local box = alife():story_object(5025)

if box then

for a=1, 10 do

alife():create("vodka", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

end

alife():create("conserva", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

alife():create("wpn_bm16", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

end

 

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

Artos, постой - постой. Ты хочешь сказать, что создание на одной локации двух объектов с одинаковым именем - чревато последствиями?

Могу тогда сказать, что сразу они не возникают. Я спаунил двух НПС с одинаковым именем, у них вообще вся секция спавна была одинаковая, только координаты отличались, оба они были в поле зрения и ничего критичного не произошло.

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

Имеется вот такая конструкция

1. Создаём файл new_hud_health.script в папке gamedata/scripts и пишем в него:

 

Код

local hud_name = "hud_health"

 

-- записываем переменную

function save_variable(variable_name, value)

xr_logic.pstor_store(db.actor, variable_name, value)

end

 

-- загружаем переменную

function load_variable(variable_name, value_if_not_found)

return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)

end

 

-- удаляем переменную

function del_variable(variable_name)

if db.storage[db.actor:id()].pstor[variable_name] then

db.storage[db.actor:id()].pstor[variable_name] = nil

end

end

 

-- координаты(параметры) x, y, width, height

local pbg = {x=0,y=0,w=0,h=0} --/ bg

local plv = {x=0,y=0,w=0,h=0} --/ lv

 

local skl_w = -1 --/ текущая длина шкалы

local wide = false --/ текущий режим экрана

 

local color = 0

local change_color = false

local change_wpn = false

local hud_show = false

 

function update(bShow)

local hud = get_hud()

local cs_bg = hud:GetCustomStatic("hud_health_bg")

local cs_lv = hud:GetCustomStatic("hud_health_lv")

 

if (load_variable("opt_hp",true) == false or bShow == false) then

if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end

if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end

return

save_variable("opt_hp",false)

end

 

local hp = db.actor.health

 

if (hp == nil or hp == 0) then

if hud_show == false then --/ рамку можно не стирать при смене оружия

if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end

end

if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end

return

end

 

-- проверка смены режима экрана

if wide ~= db.wide then

wide = db.wide

if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end

if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end

cs_bg, cs_lv = nil, nil

end

 

local cur_hud = "hud_health_bg"

if cs_bg == nil then

hud:AddCustomStatic(cur_hud, true)

cs_bg = hud:GetCustomStatic(cur_hud)

local wnd = cs_bg:wnd()

if wnd then

pbg = read_params(cur_hud)

wnd:SetWndPos(pbg.x,pbg.y)

wnd:SetWidth (pbg.w)

wnd:SetHeight(pbg.h)

wnd:SetAutoDelete(true)

end

end

 

cur_hud = "hud_health_lv"

if cs_lv == nil then

hud:AddCustomStatic(cur_hud, true)

cs_lv = hud:GetCustomStatic(cur_hud)

local wnd = cs_lv:wnd()

if wnd ~= nil then

plv = read_params(cur_hud)

wnd:SetWndPos(pbg.x+plv.x,pbg.y+plv.y)

wnd:SetWidth (skl_w)

wnd:SetHeight(plv.h)

wnd:SetAutoDelete(true)

change_color = true --/ смена цвета

end

end

 

if cs_lv ~= nil then

local hp_w = math.floor(hp * plv.w)

if hp_w ~= skl_w then

if hp_w < 1 then

skl_w = -1

else

skl_w = hp_w

end

end

local texture_c = get_texture(hp)

local wnd = cs_lv:wnd()

wnd:SetWidth(skl_w) --/ Set Level Condition

wnd:InitTexture(texture_c) --/ Set ColorTexture

wnd:SetText(string.format(math.floor(hp*100+0.0001)).."%")

end

 

end

 

function read_params(cur_hud)

local ltx = ini_file("scripts\\new_hud_health.ltx")

local section = cur_hud

if wide then section = section.."_wide" end

if ltx and ltx:section_exist(section) then

local p = {x=0,y=0,w=0,h=0}

local result, idx, value, i

for i=0, ltx:line_count(section)-1 do

result, idx, value = ltx:r_line(section, i, "", "")

if idx == "x" then

p.x = tonumber(value)

elseif idx == "y" then

p.y = tonumber(value)

elseif idx == "width" then

p.w = tonumber(value)

elseif idx == "height" then

p.h = tonumber(value)

end

end

return p

end

end

 

function get_texture(hp)

local textures = {

[0] = "ui_mg_progress_efficiency_full", --/ зеленая

[1] = "ui_hud_shk_car", --/ оранжевая

[2] = "ui_hud_shk_health" --/ красная

}

local clr = 0 --/ current color

if hp > 0.7 then clr = 0

elseif hp > 0.3 then clr = 1

elseif hp < 0.3 then clr = 2

end

if color ~= clr then

color = clr

change_color = true

else

change_color = false

end

return textures

end

 

 

2. Создаём файл new_hud_health.ltx в папке gamedata/config/scripts и пишем в него:

 

Код

[hud_health_bg]

x = 860

y = 660

width = 155

height = 34

 

[hud_health_lv]

x = 33

y = 5

width = 110

height = 10

 

[hud_health_bg_wide]

x = 900

y = 660

width = 123

height = 34

 

[hud_health_lv_wide]

x = 24

y = 5

width = 84

height = 10

 

 

 

3. В файле ui_custom_msgs.xml прописываем:

 

Код

<hud_health_bg x="0" y="0" width="1" height="1" stretch="1" complex_mode="1">

<texture>ui_hud_shkala_health</texture>

</hud_health_bg>

<hud_health_lv x="0" y="0" stretch="1" complex_mode="1">

<texture><!-- заглушка --></texture>

<text x="85" y="0" font="arial_14" r="255" g="255" b="255" a="255" ttl="8" complex_mode="1"/>

</hud_health_lv>

 

 

 

4. Открываем файл maingame.xml

 

находим строчки:

<static_health ....>

.....

</static_health>

 

и

 

<progress_bar_health ...>

....

</progress_bar_health>

 

выделяем и заменяем на следущее:

Код

<static_health x="860" y="660" width="155" height="34">

<texture></texture>

<auto_static x="5" y="10" width="19" height="18">

<texture></texture>

</auto_static>

</static_health>

<progress_bar_health x="33" y="5" width="110" height="10" horz="1" min="0" max="100" pos="0">

<progress>

<texture></texture>

</progress>

</progress_bar_health>

 

 

 

5. Открываем файл bind_stalker.script и пишем после:

 

Код

.....

level_tasks.add_lchanger_location()

 

self.bCheckStart = false

end

 

 

следущее:

new_hud_health.update()

 

после этой строчки должно стоять end, проверьте

 

 

С помощью её сделана цифровая шкала здоровья, т.е. перебираются цифры от 0 до 100 в процентах.

Отсюда вопрос: Возможно ли применить эту систему для создания цифровой шкалы выносливости, брони, радиации и т.д?

«Ну и жесть!» Сказал асфальтовый каток, оглянувшись назад на бывшую "копейку".

Nevada47.gif

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

Nevada47 я писал такой скрипт для показателей состояния брони и оружия + для здоровья. тоже в 0-100 и всё работало

 

Правда у меня раз в 5 меньше скрипт был

 

p/s/ Где такой урок нашёл?

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

Nevada47, как сказал TRAMP14, ты можешь применить данную "систему", чтобы вывести на экран состояние актора и предметов (броня, оружие). Например:

db.actor.power         -- выносливость
db.actor.psy_health     -- пси здоровье
db.actor.radiation        -- радиация
db.actor:item_in_slot(6):condition()    -- состояние брони
db.actor:item_in_slot(2):condition()    -- состояние оружия во втором слоте
db.actor:item_in_slot(3):condition()    -- состояние оружия в третьем слоте

 

:offtopic:TRAMP14, а почему именно взял, может сам написал!? (Вопрос риторический)

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

Куфзук,

Я спаунил двух НПС с одинаковым именем, ... ничего критичного не произошло.

Похоже, что системное имя - рудимент от билдов. И похоже, что в самом движке внутри это поле не используется. Да и нет нужды, поскольку и так есть уникальный id и назначаемый по желанию sid. В дополнительном текстовом идентификаторе просто нет нужды. И обратите внимание. В билдах была функция получения клиентского объекта по имени, а в релизе уже нет. И в ЗП с концами вырезали такую же из alife_simulator для серверных объектов.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

В ЗП есть некоторые отличия. Например в ЗП в схеме animpoint указывается не СИД смарт_кавера, а именно его имя

 

Это так, на заметку

Изменено пользователем _Призрак_

Freedom

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

Что значит сей вылет:

 

FATAL ERROR

[error]Expression    : motion_ID.valid()
[error]Function      : CKinematicsAnimated::ID_Cycle
[error]File          : E:\stalker\sources\trunk\xr_3da\SkeletonAnimated.cpp
[error]Line          : 121
[error]Description   : ! MODEL: can't find cycle: 
[error]Arguments     :

 

Чего это за ругань на модель?

 

З.Ы. Появилось после добавления в алл.спавн вот этого:

 

[12125]
; cse_abstract properties
section_name = physic_destroyable_object
name = labx8_physic_destroyable_object_0002
position = -83.050994873047,-15.810188293457,78.368743896484
direction = -2.5466479200986E-5,0,1

; cse_alife_object properties
game_vertex_id = 3838
distance = 0
level_vertex_id = 2815
object_flags = 0xffffff3a
custom_data = <<END
[drop_box]
community = def_box
items = ammo_5.56x45_ss190, 2, medkit, 2
END

; cse_visual properties
visual_name = physics\box\box_wood_01

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10


[12126]
; cse_abstract properties
section_name = physic_destroyable_object
name = labx8_physic_destroyable_object_0003
position = -81.293601989746,-14.004913330078,77.134628295898
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3838
distance = 0
level_vertex_id = 3039
object_flags = 0xffffff3a
custom_data = <<END
[drop_box]
community = small_box_science
END

; cse_visual properties
visual_name = physics\box\box_metall_01

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10


[12127]
; cse_abstract properties
section_name = physic_object
name = labx8_physic_object_0001
position = -81.293601989746,-19.004913330078,77.134628295898
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3838
distance = 0
level_vertex_id = 3039
object_flags = 0xffffff3a

; cse_visual properties
visual_name = physics\stul\stul_1a

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 10


[12128]
; cse_abstract properties
section_name = physic_object
name = labx8_physic_object_0002
position = -44.67280960083,-20.554525375366,71.50284576416
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3850
distance = 0
level_vertex_id = 6757
object_flags = 0xffffff3a

; cse_visual properties
visual_name = AleX_MOD\physics\box\box_karton_1

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 5


[12129]
; cse_abstract properties
section_name = zone_mincer
name = labx8_zone_mincer_0001
position = -89.982894897461,-20.200975418091,79.161865234375
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3838
distance = 0
level_vertex_id = 1686
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:0ffset = 0,0,0
shape0:radius = 2.13479919433594

; cse_alife_space_restrictor properties
restrictor_type = 0

; cse_alife_custom_zone properties
max_power = 50

; cse_alife_anomalous_zone properties
offline_interactive_radius = 30
artefact_spawn_count = 32
artefact_position_offset = 0x71cf

; se_zone_anom properties


[12130]
; cse_abstract properties
section_name = zone_ameba
name = labx8_zone_ameba_0001
position = -77.063751220703,-15.979523658752,68.551933288574
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3848
distance = 0
level_vertex_id = 3828
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:0ffset = 0,0,0
shape0:radius = 2.13479919433594

; cse_alife_space_restrictor properties
restrictor_type = 0

; cse_alife_custom_zone properties
max_power = 1.09000005722046

; cse_alife_anomalous_zone properties
offline_interactive_radius = 30
artefact_spawn_count = 32
artefact_position_offset = 0xbcd0

; se_zone_anom properties


[12131]
; cse_abstract properties
section_name = zone_radioactive_weak
name = labx8_zone_radioactive_weak_0001
position = -46.364807128906,-20.554525375366,66.397842407227
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3850
distance = 0
level_vertex_id = 6738
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:0ffset = 0,0,0
shape0:radius = 5.02820301055908

; cse_alife_space_restrictor properties
restrictor_type = 0

; cse_alife_custom_zone properties
max_power = 0.0299999993294477

; cse_alife_anomalous_zone properties
offline_interactive_radius = 30
artefact_spawn_count = 32
artefact_position_offset = 0x828f


[12132]
; cse_abstract properties
section_name = zone_witches_galantine
name = labx8_zone_witches_galantine_0001
position = -64.963333129883,-16.00484085083,58.421161651611
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 3850
distance = 0
level_vertex_id = 5616
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:0ffset = 0,0,0
shape0:radius = 3.53479919433594

; cse_alife_space_restrictor properties
restrictor_type = 0

; cse_alife_custom_zone properties
max_power = 500

; cse_alife_anomalous_zone properties
offline_interactive_radius = 30
artefact_spawn_count = 32
artefact_position_offset = 0x6c0f

; se_zone_anom properties

 

Вроде все верно...

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

TRAMP14,

p/s/ Где такой урок нашёл?

Вот здесь Автор XMK

«Ну и жесть!» Сказал асфальтовый каток, оглянувшись назад на бывшую "копейку".

Nevada47.gif

Ссылка на комментарий
Куфзук: Ты хочешь сказать, что создание на одной локации двух объектов с одинаковым именем - чревато последствиями?

(немного оффтопика)

Непривычная для меня манера на АМК-форуме почти каждый вопрос сопровождать 'последствиями'.

Последствия всегда есть, когда что-то/где-то поисходит ... А вот 'чреватые' они или наоборот - все относительно. ;-)

Кто-то последствия, наступающие порой после сэйса, называет катастрофой, а кто-то ... счастливыми. ;-)

(к сути)

Я сказал всего лишь то, что хотел и посчитал нужным. Понятие 'чреватость' я не употреблял.

Имена могут быть и одинаковыми, к 'фатальным' последствиям это не приводит. Хотя создать такие объекты нужно тоже постараться, т.к. в том же all.spawn'e для одной локации нет причин это делать, самому модмейкеру сложнее разбираться что куда поставил. Простой скриптовой спавн назначает имя рандомно, добавляя суффиксом игровой идентификатор. Остается 'спавн по секции' ...

Так чем же все таки 'чревато'?

...

malandrinus, Похоже, что системное имя - рудимент от билдов. ... Да и нет нужды, поскольку и так есть уникальный id и назначаемый по желанию sid ...

А я бы не назвал рудиментом и не нужным. Собственно выше есть ответ (читаем #6075: "Как превратить ящик Сидорыча в квестовый тайник").

Поясню на этом примере: А что делать, если нет желания или возможности ковырять all.spawn или присваивать sid нет-пакетами? Да и sid'ов в игре может быть в 2-раза меньше чем игровый id и на все про все может и не хватить (учитывая аппетиты модмейкеров и рост новых локаций).

 

У меня в моде (Симбион) в этот ящик однократно спавнится книга. Сейчас ковыряюсь с новой схемой поведения неписей и в ящик у костра новичков (в деревне на Кордоне) захотелось заспавнить бутылку водки для проверки ... И все делается без ковыряния all.spawn'а и sid'ов а именно по имени и индексу локации.

Другой пример: В Баре заспавнены на столы водка, хлеб, ... Сейчас они имеют уникальные имена типа: "bar_vodka_0000". В игре и Меченый может выпить и закусить, и при схеме собирательства кто по столам пошмонать. Так и остаются после этого столы пустыми. Чтобы пополнить запасы опять же или sid'ы присваивать или проверять по координатам наличие на столах предметов ... Вот тут то уникальные имена для локации и годятся(!), облегчая поиск и проверку наличия именно того, что хочешь.

 

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

 

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

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

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

Вот что интересно есть обьект(нпс) с уникальным именем в алл спавне escape_lager ....

допустим новичек в гулаге escape_lager

и соответствуюшей кастом датой типа

escape_lager = true

 

так вот при его гибели (через некоторое время) сработает респаун или будет найден и назначен на

данную работу свободный нпс с работ с более низким приоритетом

 

 

Так вот параметр escape_lager = true сохрантся для него ?

и какие имена получают отреспауниные неписи?

 

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

AKKK1, ответ на поверхности:

 

Как создается объект в игре? Как работает функция спавна?

В топике " Скриптование и спаун" уже сегодня давал краткое пояснение, дополню:

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

Как спавнятся объекты скриптом, т.е. по функции (ре)спавна? Создается дефолтный объект в соответствии с его конфиг-секцией: create("section_name",...) и движек назначает объекту имя, всегда добавляя к имени суффиксом идентификатор созданного объекта. И только потом можно объекту что-то добавить/изменить, но(!) уже НЕ его имя (которое в недоступной для прямых правок секции нет-пакета 'cse_abstract').

 

Т.о. респавненный объект не получит имя 'escape_lager', а получит именем типа 'escape_lager23456' и, если работа завязана на конкретном имени объекта (а таких немало) - она (работа) уже до конца игры не будет задействована в случае гибели и исчезновения/удаления неписи. В этом случае только спавн по заведомо известной секции из all.spawn'а можно 'воссоздать' объект с нужным именем. Штатный респавн подобным не занимается.

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

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

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

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

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: ...ng\stalker-soc\gamedata\scripts\death_manager.script:147: attempt to index field '?' (a nil value)

 

 

Как я понял дело в death_manager но там я всё написал точно, перепроверил раз 10. Может кто знает в чём ошибка?

 

И да вылет происходит где-то через 2 секунды от начала игры.

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

С каждым днём, всё радостнее жить!

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

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

local game_vertexes={

l01_escape={0,251},

l02_garbage={252,415},

l03_agroprom={416,702},

l03u_agr_underground={703,810},

l04_darkvalley={811,1108},

l04u_labx18={1109,1167},

l05_bar={1168,1307},

l06_rostok={1308,1437},

l08_yantar={1438,1528},

l08u_brainlab={1529,1544},

l07_military={1545,1861},

l10_radar={1862,2116},

l11_pripyat={2117,2272},

l12_stancia={2273,2401},

l12u_sarcofag={2402,2466},

l12u_control_monolith={2467,2516},

l12_stancia_2={2517,2660},

l10u_bunker={2661,2791}

}

 

function get_invbox_by_level_and_name(level, name)

local jb = game_vertexes[level][1]

local ja = game_vertexes[level][2]

 

for z=1,65535 do

local obj = alife():object(z)

if obj then

if obj:clsid() == 83 then

if obj.m_game_vertex_id <= ja and obj.m_game_vertex_id >= jb then

if obj:name() == name then

amk.send_tip2(obj:name(), nil, 10)

return obj

end

end

end

end

end

end

 

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

=VENOV=,

для получения номера уровня по его вертексу лучше использовать класс CGameGraph. Тогда не надо знать точное количество и нумерацию на каждом уровне. Наверное, алгоритм твоей функции можно оставить как есть, но таблицу лучше инициализировать автоматически. В противном случае возникает привязка к конкретному набору скомпилированных локаций.

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

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...