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

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

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

 

вот лог:

 

* Detected CPU: AuthenticAMD , F15/M15/S2, 2141.00 mhz, 5-clk 'rdtsc'

* CPU Features: RDTSC, MMX, 3DNow!, SSE, SSE2

 

Initializing File System...

using fs-ltx fsgame.ltx

--found external arch mp_military_2.xdb0

FS: 48143 files cached, 9227Kb memory used.

Init FileSystem 5.181684 sec

'xrCore' build 3312, Feb 27 2008

 

Initializing Engine...

Executing config-script "user.ltx"...

[f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\user.ltx] successfully loaded.

Starting INPUT device...

Loading DLL: xrRender_R2.dll

Loading DLL: xrGame.dll

* [win32]: free[1970228 K], reserved[52380 K], committed[74480 K]

* [ D3D ]: textures[0 K]

* [x-ray]: crt heap[11216 K], process heap[1706 K], game lua[0 K], engine lua[0 K], render[0 K]

* [x-ray]: economy: strings[1361 K], smem[0 K]

Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx"...

! cant convert dik_name for dik[144], prop=[

[f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx] successfully loaded.

Executing config-script "user.ltx"...

Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\rspec_high.ltx"...

! Unknown command: r__wallmark_ttl

! Unknown command: rs_skeleton_update

[f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\rspec_high.ltx] successfully loaded.

Executing config-script "f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx"...

[f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\config\default_controls.ltx] successfully loaded.

[f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\user.ltx] successfully loaded.

SOUND: OpenAL: enumerate devices...

SOUND: OpenAL: EnumerationExtension Present

devices Generic Hardware

SOUND: OpenAL: system default SndDevice name is Generic Hardware

SOUND: OpenAL: default SndDevice name set to Generic Software

SOUND: OpenAL: All available devices:

1. Generic Software, Spec Version 1.1 (default)

2. Generic Software, Spec Version 1.1 (default)

SOUND: OpenAL: SelectBestDevice is Generic Software 1.1

SOUND: OpenAL: Required device: Generic Software. Created device: Generic Software.

* sound: EAX 2.0 extension: absent

* sound: EAX 2.0 deferred: absent

* sound : cache: 65538 kb, 7609 lines, 8820 bpl

Starting RENDER device...

* GPU [vendor:1002]-[device:9586]: ATI Radeon HD 2600 XT AGP (Microsoft Corporation WDDM 1.1)

* GPU driver: 8.14.10.630

* CREATE: DeviceREF: 1

* Vertex Processor: PURE HARDWARE

* Texture memory: 739 M

* DDI-level: 9.0

* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)

* GPU vertex cache: unrecognized, 16

* DVB created: 1536K

* DIB created: 512K

! Version conflict in shader 'def_shaders\def_aref'

! Version conflict in shader 'def_shaders\def_aref_v'

! Version conflict in shader 'def_shaders\def_trans'

! Version conflict in shader 'def_shaders\def_trans_v'

! Version conflict in shader 'def_shaders\def_trans_v_tuchi'

! Version conflict in shader 'def_shaders\lod_old'

! Renderer doesn't support blender 'effects\shadow_world'

! Version conflict in shader 'effects\watertest-1'

! Version conflict in shader 'flora\leaf'

! Version conflict in shader 'flora\leaf_lm'

! Version conflict in shader 'flora\leaf_sux'

! Version conflict in shader 'flora\trunk_lm'

count of .thm files=14

load time=77 ms

* HWDST/PCF supported and used

- r__tf_aniso 16

- r2_tf_mipbias 0.

Starting engine...

Loading DLL: xrGameSpy.dll

! Invalid ogg-comment version, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\wasteland2_l.ogg

! Invalid ogg-comment version, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\wasteland2_r.ogg

* DVB created: 1536K

* DIB created: 512K

- r__tf_aniso 16

- r2_tf_mipbias 0.

* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)

* GPU vertex cache: unrecognized, 16

*** RESET [4781 ms]

"f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\bin\xr_3da.exe"

* phase time: 0 ms

* phase cmem: 123268 K

Кэширование объектов...

Loading objects...

Loading models...

! auto-generated bump map: act\act_darkstalker3_bump#

* [prefetch] time: 29323 ms

* [prefetch] memory: 91729Kb

* phase time: 29406 ms

* phase cmem: 209801 K

Сервер: Старт...

* phase time: 306 ms

* phase cmem: 210024 K

Сервер: Загрузка симуляции жизни...

* phase time: 41 ms

* phase cmem: 210024 K

Загрузка игры "Денис_quicksave.sav"...

* Loading spawn registry...

* 9158 spawn points are successfully loaded

* Loading objects...

* 18953 objects are successfully loaded

* Game Денис_quicksave is successfully loaded from file 'f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\savedgames\Денис_quicksave.sav' (5.423s)

* phase time: 5393 ms

* phase cmem: 243610 K

Сервер: Соединяемся...

MaxPlayers = 32

* phase time: 70 ms

* phase cmem: 243642 K

Клиент: Соединение с localhost...

# Player not found. New player created.

* client : connection accepted - <>

* phase time: 26 ms

* phase cmem: 243666 K

Открытие потока...

* phase time: 17 ms

* phase cmem: 243666 K

Загрузка формы объектов...

* phase time: 7901 ms

* phase cmem: 316334 K

Загрузка шейдеров...

* phase time: 877 ms

* phase cmem: 317494 K

Загрузка геометрии...

* [Loading VB] 65532 verts, 2047 Kb

* [Loading VB] 65525 verts, 2047 Kb

* [Loading VB] 65535 verts, 2047 Kb

* [Loading VB] 65466 verts, 2045 Kb

* [Loading VB] 17208 verts, 537 Kb

* [Loading VB] 65533 verts, 2047 Kb

* [Loading VB] 65534 verts, 2047 Kb

* [Loading VB] 65534 verts, 2047 Kb

* [Loading VB] 65531 verts, 2047 Kb

* [Loading VB] 65535 verts, 2047 Kb

* [Loading VB] 65535 verts, 2047 Kb

* [Loading VB] 46595 verts, 1456 Kb

* [Loading VB] 65534 verts, 2047 Kb

* [Loading VB] 65533 verts, 2047 Kb

* [Loading VB] 65535 verts, 2047 Kb

* [Loading VB] 65532 verts, 2047 Kb

* [Loading VB] 65533 verts, 2047 Kb

* [Loading VB] 65533 verts, 2047 Kb

* [Loading VB] 53181 verts, 1661 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 1048572 indices, 2047 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 228285 indices, 445 Kb

* [Loading VB] 65533 verts, 767 Kb

* [Loading VB] 65534 verts, 767 Kb

* [Loading VB] 65534 verts, 767 Kb

* [Loading VB] 65535 verts, 767 Kb

* [Loading VB] 65535 verts, 767 Kb

* [Loading VB] 65534 verts, 767 Kb

* [Loading VB] 65535 verts, 767 Kb

* [Loading VB] 14030 verts, 164 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 1048575 indices, 2047 Kb

* [Loading IB] 718302 indices, 1402 Kb

* phase time: 1047 ms

* phase cmem: 317885 K

Загрузка базы пространств...

* phase time: 3279 ms

* phase cmem: 322185 K

Загрузка детальных объектов...

* [DETAILS] VertexConsts(256), Batch(61)

* [DETAILS] 40687 v(20), 26352 p

* [DETAILS] Batch(61), VB(794K), IB(154K)

* phase time: 180 ms

* phase cmem: 322227 K

Загрузка секторов и порталов...

* Loading HOM: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\levels\l01_escape\level.hom

* phase time: 27 ms

* phase cmem: 322417 K

Загрузка ИИ объектов...

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\nature\new_flies1.ogg

- Loading music tracks from 'l01_escape_musics'...

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\amb01_l.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\music\amb01_r.ogg

* phase time: 174 ms

* phase cmem: 322454 K

Клиент: Создание...

- Game configuring : Started

- Game configuring : Finished

* phase time: 760 ms

* phase cmem: 334272 K

Загрузка текстур...

* t-report - base: 1501, 672616 K

* t-report - lmap: 7, 7168 K

* phase time: 11778 ms

* phase cmem: 334272 K

Загрузка Oblivion Lost...

* phase time: 138 ms

* phase cmem: 334288 K

* [win32]: free[557596 K], reserved[97668 K], committed[1441824 K]

* [ D3D ]: textures[679784 K]

* [x-ray]: crt heap[334288 K], process heap[6473 K], game lua[24907 K], engine lua[133 K], render[0 K]

* [x-ray]: economy: strings[4161 K], smem[64597 K]

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_draw.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_holster.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\binoculars_zoomin.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\binoculars_zoomout.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_empty.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\pm_draw.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\fort_shoot2.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_close.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\ak74_draw.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\fort_draw.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_1.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\crow\idle_2.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_1.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_idle_2.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_eat_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_1.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_attack_hit_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_take_damage_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_take_damage_1.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\monsters\zombie\zombie_die_0.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz_on.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\kamaz_off.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_old.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz_on.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\zaz_off.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_middle.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva_on.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\niva_off.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\car\gear_new.ogg

! Missing ogg-comment, file: f:\games\gsc world publishing\s.t.a.l.k.e.r. - Серебряное Издание\shoc\gamedata\sounds\weapons\generic_checkout.ogg

 

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: ...- Серебряное Издание\shoc\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

 

stack trace:

 

 

 

if (jit == nil) then

profiler.setup_hook ()

end

 

schemes = {} -- соответствие схем модулям

stypes = {} -- типы схем

 

-- Загружает схему из файла на диске и активирует в мотиваторе.

-- Здесь:

-- filename - имя файла, в котором реализована схема, без расширения

-- scheme - имя схемы

function load_scheme(filename, scheme, stype)

schemes[scheme] = filename

stypes[scheme] = stype

end

 

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

 

function printf(fmt,...)

log(string.format(fmt,...))

end

 

function dbglog(fmt,...)

local msg = string.format(fmt, ...)

local msg_no_ws = string.gsub(msg, "%s", "_")

get_console():execute("dbg:" .. msg_no_ws)

end

 

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

if nil == time_global then

time_global = function () return device():time_global() end

end

 

function wait_game(time_to_wait)

verify_if_thread_is_running()

if (time_to_wait == nil) then

coroutine.yield()

else

local time_to_stop = game.time() + time_to_wait

while game.time() <= time_to_stop do

coroutine.yield()

end

end

end

 

function wait(time_to_wait)

verify_if_thread_is_running()

if (time_to_wait == nil) then

coroutine.yield()

else

local time_to_stop = time_global() + time_to_wait

while time_global() <= time_to_stop do

coroutine.yield()

end

end

end

 

function action(obj,...)

local arg = {...}

local act = entity_action()

local i = 1

while true do

if (arg ~= nil) then

act:set_action(arg)

else

break

end

i = i + 1

end

if (obj ~= nil) then

obj:command(act,false)

end

return entity_action(act)

end

 

function action_first(obj,...)

local arg = {...}

local act = entity_action()

local i = 1

while true do

if (arg ~= nil) then

act:set_action(arg)

else

break

end

i = i + 1

end

if (obj ~= nil) then

obj:command(act,true)

end

return entity_action(act)

end

 

function round (value)

local min = math.floor (value)

local max = min + 1

if value - min > max - value then return max end

return min

end

 

function debug_get_level_object(obj_name)

local res = level.debug_object(obj_name)

while res == nil do

 

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// !!!!! НЕ ЗАКОММЕНТАРИВАЙТЕ, ИНАЧЕ НЕ БУДЕТ ВИДНО ОШИБОК ПРИ РАССТАНОВКЕ ОБЪЕКТОВ !!!!!

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

printf("get_level_object() is waiting for object \"%s\"", obj_name)

 

res = level.object(obj_name)

wait ()

end

return res

end

 

function debug_get_actor()

local res = level.debug_actor()

while res == nil do

res = level.debug_actor()

wait ()

end

return res

end

 

function distance_between(obj1, obj2)

return obj1:position():distance_to(obj2:position())

end

 

// Если один объект nil, например нет актера, то считаем, что он далеко

function distance_between_safe(obj1, obj2)

if(obj1 == nil or obj2 == nil) then return 100000 end

return obj1:position():distance_to(obj2:position())

end

 

 

--' Проверка на инфопоршны, даже если игрока не существует

function has_alife_info(info_id)

local aa = alife()

if aa == nil then

return false

end

return aa:has_info(0, info_id)

end

 

 

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

-- іласс LUA реализуі ий Finite State Machine

-- для управления персонажами

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

class 'FSM'

 

-- инициализация путем задания объекта Non-Player Character

function FSM:__init(script_name, npc_obj)

-- указатель на подконтрольнvй NPC

self.npc = npc_obj

-- строка - имя скрипта, которvй запускает игру

self.script_name = script_name

-- матрица, задаі ая граф переходов состояний

-- реализуется как двумерная таблица

self.transition_matrix = {[0] = {}}

-- номер теку его состояния

self.current_state = 0

 

-- флаг того, что машина вклічена

self.machine_running = true

 

printf("inialization FSM for NPC %s", self.npc:name())

end

 

function FSM:is_running()

return self.machine_running

end

 

function FSM:start()

printf("starting FSM for %s", self.npc:name())

self.machine_running = true

end

 

function FSM:stop()

printf("stoping FSM for %s", self.npc:name())

self.machine_running = false

self:reset_script_control()

end

 

 

-- добавление указателя на булеву

-- функциі условия перехода

function FSM:set_transition(from_state_num, to_state_num, cond_func)

printf("in setting transition %d, %d ", from_state_num, to_state_num)

 

if self.transition_matrix[from_state_num] == nil then

self.transition_matrix[from_state_num] = {[to_state_num] = cond_func}

else

self.transition_matrix[from_state_num][to_state_num] = cond_func

end

end

 

-- единичная проверка FSM

function FSM:run()

local transition_vector = self.transition_matrix[self.current_state]

table.foreach(transition_vector,

function(to_state_num, cond_func)

if cond_func(self.npc, self) == true then

printf("transition from %d to %d", self.current_state, to_state_num)

 

if to_state_num == 0 then

self:reset_script_control()

end

 

--if self.current_state == 0 then

-- self:set_script_control()

--end

 

self.current_state = to_state_num

return true

end

return nil

end)

end

 

 

-- запуск бесконечного цикла FSM

function FSM:run_loop()

printf("running FSM loop for NPC %s", self.npc:name())

 

while self:is_running() do

local transition_vector = self.transition_matrix[self.current_state]

table.foreach(transition_vector,

function(to_state_num, cond_func)

if cond_func(self.npc, self) == true then

printf("transition from %d to %d", self.current_state, to_state_num)

 

if to_state_num == 0 then

self:reset_script_control()

end

 

--if self.current_state == 0 then

-- self:set_script_control()

--end

 

self.current_state = to_state_num

return true

end

return nil

end)

if self.npc:alive () == false then

self.npc:script (false, self.script_name)

return

end

wait()

end

end

 

-- взятие под контроль скрипта NPC (переход из нулевого состояния)

function FSM:set_script_control()

printf("set script control for FSM of NPC %s", self.npc:name())

self.npc:script(true, self.script_name)

end

 

-- отпускание из под контроля скрипта NPC (переход в нулевое состояние)

function FSM:reset_script_control()

printf("reset script control for FSM of NPC %s", self.npc:name())

self.npc:script(false, self.script_name)

end

 

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

-- end of class 'FSM'

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

 

function reset_action (npc, script_name)

if npc:get_script () then

npc:script (false, script_name)

end

npc:script (true, script_name)

end

 

class "script_object"

 

function script_object.__init(self,name,script,...)

self.action = action(nil,...)

self.object_name = name

self.script_name = script

self.object = nil

end

 

function script_object:update()

local obj = self.object

self.object = level.object(self.object_name)

if ((obj == nil) and (self.object ~= nil)) then

self.object:script (true,self.script_name)

self.object:command (self.action,false)

end

end

 

--

-- іередача персонажу информации

--

 

function GiveInfoViaPda(obj_receiver, obj_sender, info_number)

obj_receiver:give_info_portion_via_pda(info_number, obj_sender)

end

 

 

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

-- Functions and variables added by Zmey

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

 

-- іонстанта, которуі использовать в местах, где нужно задать неограниченное время действия

time_infinite = 100000000

 

-- =азвание скрипта, которvй в даннvй момент находится в отладке

-- (в этом скрипте будут срабатvвать вvзовv функции debug_log)

debug_script_name = ""

 

-- Tvводит в лог строчку, если script_name == debug_script_name

-- Lспользуется для отрадки сценариев

function debug_log(script_name, fmt, ...)

if debug_script_name == script_name then

log(string.format(fmt, ...))

end

end

 

-- +сли в даннvй момент вvполняется какое-то действие, прерvвает его и отклічает скриптовvй режим

function interrupt_action(who, script_name)

if who:get_script() then

who:script(false, script_name)

end

end

 

function random_choice(...)

local arg = {...}

local r = math.random(1, table.getn(arg))

return arg[r]

end

 

function new_action(...)

local arg = {...}

local act = entity_action()

for i = 1, table.getn(arg) do

act:set_action(arg)

end

return act;

end

 

obj_last_actions = {};

 

function perform_action(obj, action_name, action)

if (obj ~= nil) then

obj_last_actions[obj] = action_name

obj:command(act, false)

end

end

 

function last_action(obj)

return obj_last_actions[obj]

end

 

function if_then_else(cond, if_true, if_false)

if cond then

return if_true

end

return if_false

end

 

function update_action (npc, script, ...)

local arg = {...}

if npc == nil then return end

local act = npc:action ()

if arg.n == 0 then return end

 

if act == nil then act = entity_action () end

 

for a = 1, arg.n, 1 do

if arg[a] ~= nil then act:set_action (arg[a]) end

end

reset_action (npc, script)

npc:command (act, false)

 

end

 

 

function set_current_time (hour, min, sec)

local current_time_factor = level.get_time_factor ()

 

printf ("Need time : %d:%d:%d", hour, min, sec)

 

local current_time = game.time ()

local c_day = math.floor (current_time / 86400000)

local c_time = current_time - c_day * 86400000

local n_time = (sec + min * 60 + hour * 3600) * 1000

 

if c_time > n_time then c_day = c_day + 1 end

n_time = n_time + c_day * 86400000

 

level.set_time_factor (10000)

while game.time () < n_time do wait () end

 

level.set_time_factor (current_time_factor)

end

 

 

 

if (editor() == false) then

class "pp_effector" (effector)

 

function pp_effector:__init(effector_type,start_time,dest_power,life_time) super(effector_type,start_time)

self.start_time = start_time

self.stop_time = start_time + life_time

self.max_power = dest_power

end

 

function pp_effector:process(pp)

effector.process(self,pp)

 

local curr_time = time_global()

local d = 0.0

 

if curr_time < self.start_time then

d = 0.0

else

if curr_time < self.stop_time then

d = (curr_time - self.start_time) / (self.stop_time - self.start_time)

else

self.info = self.max_power

return true

end

end

 

local dual = duality()

local noise = noise()

local base = color()

local gray = color()

local add = color()

 

dual.h = self.max_power.dual.h * d

dual.v = self.max_power.dual.v * d

 

noise.grain = self.max_power.noise.grain * d

noise.intensity = self.max_power.noise.intensity * d

noise.fps = self.max_power.noise.fps * d

 

base.r = self.max_power.color_base.r * d

base.g = self.max_power.color_base.g * d

base.b = self.max_power.color_base.b * d

 

gray.r = self.max_power.color_gray.r * d

gray.g = self.max_power.color_gray.g * d

gray.b = self.max_power.color_gray.b * d

 

add.r = self.max_power.color_add.r * d

add.g = self.max_power.color_add.g * d

add.b = self.max_power.color_add.b * d

 

pp.gray = self.max_power.gray * d

pp.blur = self.max_power.blur * d

 

pp.dual = dual

pp.noise = noise

pp.color_base = base

pp.color_gray = gray

pp.color_add = add

 

self.info = pp

 

return true

end

 

function pp_effector:finished()

return self.stop_time < time_global()

end

 

--

-- postprocess for rainbow

--

class "pp_linear_lerp" (effector)

 

function pp_linear_lerp:__init(effector_type,start_time,life_time,start_power,dest_power) super(effector_type,start_time)

self.start_time = start_time

self.stop_time = start_time + life_time

self.min_power = start_power

self.max_power = dest_power

end

 

function pp_linear_lerp:process(pp)

effector.process(self,pp)

 

local curr_time = time_global()

local d = 0.0

 

if curr_time < self.start_time then

d = 0.0

else

if curr_time < self.stop_time then

d = (curr_time - self.start_time) / (self.stop_time - self.start_time)

else

self.info = self.max_power

return true

end

end

 

local dual = duality()

local noise = noise()

local base = color()

local gray = color()

local add = color()

 

dual.h = self.min_power.dual.h + (self.max_power.dual.h - self.min_power.dual.h ) * d

dual.v = self.min_power.dual.v + (self.max_power.dual.v - self.min_power.dual.v ) * d

 

noise.grain = self.min_power.noise.grain + (self.max_power.noise.grain - self.min_power.noise.grain ) * d

noise.intensity = self.min_power.noise.intensity + (self.max_power.noise.intensity - self.min_power.noise.intensity) * d

noise.fps = self.min_power.noise.fps + (self.max_power.noise.fps - self.min_power.noise.fps ) * d

 

base.r = self.min_power.color_base.r + (self.max_power.color_base.r - self.min_power.color_base.r ) * d

base.g = self.min_power.color_base.g + (self.max_power.color_base.g - self.min_power.color_base.g ) * d

base.b = self.min_power.color_base.b + (self.max_power.color_base.b - self.min_power.color_base.b ) * d

 

gray.r = self.min_power.color_gray.r + (self.max_power.color_gray.r - self.min_power.color_gray.r ) * d

gray.g = self.min_power.color_gray.g + (self.max_power.color_gray.g - self.min_power.color_gray.g ) * d

gray.b = self.min_power.color_gray.b + (self.max_power.color_gray.b - self.min_power.color_gray.b ) * d

 

add.r = self.min_power.color_add.r + (self.max_power.color_add.r - self.min_power.color_add.r ) * d

add.g = self.min_power.color_add.g + (self.max_power.color_add.g - self.min_power.color_add.g ) * d

add.b = self.min_power.color_add.b + (self.max_power.color_add.b - self.min_power.color_add.b ) * d

 

pp.gray = self.min_power.gray + (self.max_power.gray - self.min_power.gray ) * d

pp.blur = self.min_power.blur + (self.max_power.blur - self.min_power.blur ) * d

 

pp.dual = dual

pp.noise = noise

pp.color_base = base

pp.color_gray = gray

pp.color_add = add

 

self.info = pp

 

return true

end

 

function pp_linear_lerp:finished()

return self.stop_time < time_global()

end

--

-- end of postprocess for rainbow

--

 

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

-- Evaluators

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

-- зарезервированv id с номерами от 0 до 256 для создания стандартнvх эвалуаторов.

 

--Constant evaluator

class "const_evaluator" (property_evaluator)

 

function const_evaluator:__init (name, value) super (nil, name)

self.value = value

end

 

function const_evaluator:evaluate()

return self.value

end

 

--Wait evaluator

class "wait_evaluator" (property_evaluator)

 

function wait_evaluator:__init (wait_time) super ()

self.wait_time = wait_time

self.first_call = true

self.current_time = 0

end

 

function wait_evaluator:evaluate ()

if self.first_call == true then

self.first_call = false

self.current_time = device ():time_global ()

return false

end

 

local t = device():time_global () - self.current_time;

if t > self.wait_time then return true end

return false

end

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

class "enabled_evaluator" (property_evaluator)

 

function enabled_evaluator:__init (name, storage) super ()

self.a = storage

end

 

function enabled_evaluator:evaluate()

return self.a.enabled

end

 

end -- end of editor() == false

 

 

function str_split (str)

 

local strlen = string.len (str)

 

local parts = {{}, {}, {}, {}}

local cpart = 1

 

for a = 1, strlen, 1 do

local char = string.byte (str, a)

if char ~= 95 then

table.insert (parts[cpart], char)

else

cpart = cpart + 1

if cpart > 4 then break end

end

end

 

if cpart ~= 4 then return "unknown", "stalker", 0, 0 end

 

local str1 = string.char ()

local str2 = string.char ()

local str3 = string.char ()

local str4 = string.char ()

 

local ref = parts[1]

for a = 1, table.getn (ref), 1 do

str1 = string.format ("%s%c", str1, ref[a])

end

 

ref = parts[2]

for a = 1, table.getn (ref), 1 do

str2 = string.format ("%s%c", str2, ref[a])

end

 

ref = parts[3]

for a = 1, table.getn (ref), 1 do

str3 = string.format ("%s%c", str3, ref[a])

end

 

ref = parts[4]

for a = 1, table.getn (ref), 1 do

str4 = string.format ("%s%c", str4, ref[a])

end

 

printf ("%s %s %d %d", str1, str2, str3, str4)

return str1, str2, (str3 + 1) - 1, (str4 + 1) - 1

end

 

function random_number (min_value, max_value)

math.randomseed (device ():time_global ())

if min_value == nil and max_value == nil then

return math.random ()

else

return math.random (min_value, max_value)

end

end

 

-- ‚६п бгв®Є ў ¬б

-- —гЈ ©

local ms_per_day = 24 * 60 * 60 * 1000

function day_time()

return math.mod( game.time(), ms_per_day )

end

 

--Time in hours

function local_hours()

return math.floor( math.mod( game.time()/1000, 86400 )/ 3600 )

end

 

-- Ї абЁв бва®Єг ўЁ¤ " , ЎЎЎ, ўўў..." ў в Ў«Ёжг { " ", "ЎЎЎ", "ўўў", ... }

-- —гЈ ©

function parse_names( s )

local t = {}

for name in string.gfind( s, "([%w_\\]+)%p*" ) do

--for name in string.gfind( s, "%s*([^%,]+)%s*" ) do

table.insert( t, name )

end

 

return t

end

 

 

function parse_key_value( s )

local t = {}

if s == nil then

return nil

end

local key, nam = nil, nil

for name in string.gfind( s, "([%w_\\]+)%p*" ) do

if key == nil then

key = name

else

t[key] = name

key = nil

end

end

return t

end

 

 

-- Ї абЁв бва®Єг ўЁ¤ "n1, n2, n3..." ў в Ў«Ёжг { n1, n2, n3, ... } Ј¤Ґ n1, n2, n3... - жҐ«лҐ зЁб«

-- —гЈ ©

--[[function parse_nums( s )

local t = {}

 

for entry in string.gfind( s, "([%w_\\]+)%p*" ) do

table.insert( t, tonumber( entry ) )

end

 

return t

end]]

 

-- Ї абЁв бва®Єг ўЁ¤ "n1, n2, n3..." ў в Ў«Ёжг { n1, n2, n3, ... } Ј¤Ґ n1, n2, n3... - ¤а®ЎлҐ зЁб«

function parse_nums( s )

local t = {}

 

for entry in string.gfind( s, "([%d%.]+)%,*" ) do

table.insert( t, tonumber( entry ) )

end

 

return t

end

 

-- Їа®ўҐапҐв, Ґбвм «Ё ®ЎкҐЄв ў ®« ©Ґ

function is_object_online(obj_id)

return level.object_by_id(obj_id) ~= nil

end

 

function get_clsid(npc)

if npc == nil then return nil end

 

return npc:clsid()

 

-- if is_object_online(npc:id()) then

-- return npc:clsid()

-- else

-- return nil

-- end

end

 

-- Їа®ўҐапҐв ®аг¦ЁҐ «Ё нв® (ЇҐаҐ¤ ў вм game_object)

function isWeapon(object)

local id = get_clsid(object)

if id == nil then return false end

 

if id == clsid.wpn_vintorez_s then return true

elseif id == clsid.wpn_ak74_s then return true

elseif id == clsid.wpn_lr300_s then return true

elseif id == clsid.wpn_hpsa_s then return true

elseif id == clsid.wpn_pm_s then return true

elseif id == clsid.wpn_shotgun_s then return true

elseif id == clsid.wpn_bm16_s then return true

elseif id == clsid.wpn_svd_s then return true

elseif id == clsid.wpn_svu_s then return true

elseif id == clsid.wpn_rpg7_s then return true

elseif id == clsid.wpn_val_s then return true

elseif id == clsid.wpn_walther_s then return true

elseif id == clsid.wpn_usp45_s then return true

elseif id == clsid.wpn_groza_s then return true

elseif id == clsid.wpn_knife_s then return true

elseif id == clsid.wpn_grenade_launcher then return true

elseif id == clsid.wpn_grenade_f1 then return true

elseif id == clsid.wpn_grenade_rpg7 then return true

elseif id == clsid.wpn_grenade_rgd5 then return true

elseif id == clsid.wpn_grenade_fake then return true

else return false end

end

 

--Tvчисляет yaw в радианах

function yaw( v1, v2 )

return math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) )

end

 

function yaw_degree( v1, v2 )

return (math.acos( ( (v1.x*v2.x) + (v1.z*v2.z ) ) / ( math.sqrt(v1.x*v1.x + v1.z*v1.z ) * math.sqrt(v2.x*v2.x + v2.z*v2.z ) ) ) * 57.2957)

end

function yaw_degree3d( v1, v2 )

return (math.acos((v1.x*v2.x + v1.y*v2.y + v1.z*v2.z)/(math.sqrt(v1.x*v1.x + v1.y*v1.y + v1.z*v1.z )*math.sqrt(v2.x*v2.x + v2.y*v2.y + v2.z*v2.z)))*57.2957)

end

 

function vector_cross (v1, v2)

return vector ():set (v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - v1.y * v2.x)

end

 

//Вращает вектор вокруг оси y против часовой стрелки

 

function vector_rotate_y (v, angle)

angle = angle * 0.017453292519943295769236907684886

local c = math.cos (angle)

local s = math.sin (angle)

return vector ():set (v.x * c - v.z * s, v.y, v.x * s + v.z * c)

end

 

-- очистка таблицы

function clear_table (t)

while table.getn (t) > 0 do

table.remove (t, table.getn (t))

end

end

 

--?бЇ®«м§гҐв ¤«п ¬®бва®ў. ‚лЎ®а в®зЄЁ, Єг¤ Ё¤вЁ ў ҐЄ®в®а®¬ а ¤ЁгᥠЁ зв®Ў в®зЄ Ўл« ¤ «миҐ а ббв®пЁЁ

-- min_radius ®в ⥪г饩 Ї®§ЁжЁЁ(Ґб«Ё нв® Ї®«гзЁвбп). center_id - жҐва Ї®§ЁжЁЁ, ў®ЄагЈ Є®в®а®© ¦ЁўҐ¬,

-- position_id - вгЄгй п Ї®§ЁжЁп, radius - ў Є Є®¬ а ¤ЁгᥠўлЎЁа вм в®зЄг, min_radius - ¬ЁЁ¬ «м®Ґ а ббв®пЁҐ, ®в ⥪г饩 Ї®§ЁжЁЁ ¤® ®ў®© в®зЄЁ.

function new_point(center_id, position_id,radius, min_radius)

local dir = vector():set(math.random(-1000, 1000)/1000.0, 0.0001, math.random(-1000, 1000)/1000.0)

local pos = level.vertex_in_direction(center_id, dir, radius)

local i = 1

 

while(level.vertex_position(position_id):distance_to(level.vertex_position(pos) ) < min_radius and i < 20) do

dir = vector():set(math.random(-1000, 1000)/1000.0, 0.0001, math.random(-1000, 1000)/1000.0)

pos = level.vertex_in_direction(center_id, dir, radius)

i = i + 1

end

 

return (level.vertex_position(pos))

end

 

function stop_play_sound(obj)

if obj:alive() == true then

obj:set_sound_mask(-1)

obj:set_sound_mask(0)

end

end

 

function object_type(obj)

local otype = get_clsid(obj)

local type

 

if otype == clsid.actor or

otype == clsid.script_stalker or

otype == clsid.script_trader

then

type = "stalker"

elseif otype == clsid.crow or

otype == clsid.zombie or

otype == clsid.flesh or

otype == clsid.controller or

otype == clsid.bloodsucker or

otype == clsid.burer or

otype == clsid.chimera or

otype == clsid.boar or

otype == clsid.flesh_group or

otype == clsid.dog_red or

otype == clsid.dog_black or

otype == clsid.pseudo_gigant

then

type = "monstr"

elseif otype == clsid.wpn_fn2000 or

otype == clsid.wpn_ak74 or

otype == clsid.wpn_lr300 or

otype == clsid.wpn_hpsa or

otype == clsid.wpn_pm or

otype == clsid.wpn_fort or

otype == clsid.wpn_binocular or

otype == clsid.wpn_shotgun or

otype == clsid.wpn_svd or

otype == clsid.wpn_svu or

otype == clsid.wpn_rpg7 or

otype == clsid.wpn_val or

otype == clsid.wpn_vintorez or

otype == clsid.wpn_walther or

otype == clsid.wpn_usp45 or

otype == clsid.wpn_groza or

otype == clsid.wpn_knife or

otype == clsid.wpn_scope or

otype == clsid.wpn_silencer or

otype == clsid.wpn_grenade_launcher or

otype == clsid.obj_physic or

otype == clsid.obj_breakable or

otype == clsid.device_pda or

otype == clsid.device_torch or

otype == clsid.device_detector_simple or

otype == clsid.obj_bolt or

otype == clsid.obj_medkit or

otype == clsid.obj_food or

otype == clsid.obj_bottle or

otype == clsid.obj_antirad or

otype == clsid.obj_explosive or

otype == clsid.obj_document or

otype == clsid.obj_attachable or

otype == clsid.wpn_grenade_f1 or

otype == clsid.wpn_grenade_rpg7 or

otype == clsid.wpn_grenade_rgd5 or

otype == clsid.wpn_grenade_fake or

otype == clsid.equ_scientific or

otype == clsid.equ_stalker or

otype == clsid.equ_military or

otype == clsid.equ_exo or

otype == clsid.wpn_ammo or

otype == clsid.wpn_ammo_vog25 or

otype == clsid.wpn_ammo_og7b or

otype == clsid.wpn_ammo_m209

then

type = "item"

else

type = "none"

end

 

-- Їа®ўҐа塞 Ґ вагЇ «Ё нв®

if type == "stalker" or

type == "monstr" then

if obj:alive() == false then

type = "corpse"

end

end

 

return type

end

 

 

// Является ли оbj монстром

function is_object_monster(obj)

local otype = get_clsid(obj)

if(otype == clsid.crow or

otype == clsid.cat or

otype == clsid.zombie or

otype == clsid.flesh or

otype == clsid.controller or

otype == clsid.bloodsucker or

otype == clsid.burer or

otype == clsid.chimera or

otype == clsid.boar or

otype == clsid.dog_red or

otype == clsid.dog_black or

otype == clsid.poltergeist or

otype == clsid.pseudo_gigant )

then

return true

end

 

return false

end

 

--ў®§ўа й Ґв Їа®Ё§ў®«мго в®зЄг ЇгвЁ г Є®в®а®© гбв ®ў«Ґ ЎЁв

function point_with_bit(patrol_path, bit, old_point) -- old_point - Ё¤ҐЄб в®зЄЁ, Є®в®аго Ґ ¤® ўлЎЁа вм,

local points = {} -- Ї а ¬Ґва Ґ ®Ўп§ ⥫мл©( ЇаЁ¬Ґа ⥪г饩 в®зЄЁ )

 

for i = 0, patrol_path:count()-1 do

--„®Ў®ў«пҐ¬ ў в Ў«Ёжг в®зЄЁ б г¦л¬ ЎЁв®¬

if( patrol_path:flag(i, bit)) then

--„®Ў ў«пҐ¬ в®зЄг Ґб«Ё old_point == nil Ё«Ё ®ў п в®зЄ Ґ б®ўЇ ¤ Ґв б old_point

if(old_point == nil) then

table.insert(points, patrol_path:point(i))

elseif(old_point ~= i) then

table.insert(points, patrol_path:point(i))

end

end

end

 

local number_point = table.getn(points)

 

if(number_point == 0) then

return nil

elseif(number_point == 1) then

return points[1]

else

return points[math.random(1, number_point)]

end

end

 

--ў®§ўа й Ґв Їа®Ё§ў®«мго в®зЄг ЇгвЁ г Є®в®а®© гбв ®ў«Ґ ЎЁв

function point_with_bit_id(patrol_path, bit, old_point) -- old_point - Ё¤ҐЄб в®зЄЁ, Є®в®аго Ґ ¤® ўлЎЁа вм,

local points = {} -- Ї а ¬Ґва Ґ ®Ўп§ ⥫мл©( ЇаЁ¬Ґа ⥪г饩 в®зЄЁ )

 

for i = 0, patrol_path:count()-1 do

--„®Ў®ў«пҐ¬ ў в Ў«Ёжг в®зЄЁ б г¦л¬ ЎЁв®¬

if( patrol_path:flag(i, bit)) then

--„®Ў ў«пҐ¬ в®зЄг Ґб«Ё old_point == nil Ё«Ё ®ў п в®зЄ Ґ б®ўЇ ¤ Ґв б old_point

if(old_point == nil) then

table.insert(points, i)

elseif(old_point ~= i) then

table.insert(points, i)

end

end

end

 

local number_point = table.getn(points)

 

if(number_point == 0) then

return nil

elseif(number_point == 1) then

return patrol_path:level_vertex_id(points[1])

else

return patrol_path:level_vertex_id(points[math.random(1, number_point)])

end

end

 

--‚®§ўа й Ґв Ё¤ҐЄб б ¬®© Ў«Ё¦Ґ© в®зЄЁ ЇгвЁ б § ¤ л¬ ЎЁв®¬, ®в ⥪г饩 в®зЄЁ

function near_point_with_bit(point, patrol_path, bit)

local new_point = nil

local index = nil

local dist = 1000.0

 

for i = 0, patrol_path:count()-1 do

if( patrol_path:flag(i, bit) ) then

if(new_point == nil or patrol_path:point(i):distance_to(point) < dist) then

--…б«Ё нв в®зЄ ЇҐаў п Ё§ 襤иЁебп, «ЁЎ® ®в ҐҐ Їгвм Ў«Ё¦Ґ, в® § Ї®¬Ё Ґ¬ ҐҐ

new_point = patrol_path:point(i)

index = i

dist = new_point:distance_to(point)

end

end

end

 

return index

end

 

-- ђҐЄгабЁў п а бЇҐз вЄ в Ў«Ёжл

function print_table(table, subs)

local sub

if subs ~= nil then

sub = subs

else

sub = ""

end

for k,v in pairs(table) do

if type(v) == "table" then

printf(sub.."%s:", tostring(k))

print_table(v, sub.." ")

elseif type(v) == "function" then

printf(sub.."%s:function", tostring(k))

elseif type(v) == "userdata" then

printf(sub.."%s:userdata", tostring(k))

elseif type(v) == "boolean" then

if v == true then

printf(sub.."%s:true", tostring(k))

else

printf(sub.."%s:false", tostring(k))

end

else

if v ~= nil then

printf(sub.."%s:%s", tostring(k),v)

else

printf(sub.."%s:nil", tostring(k),v)

end

end

end

end

 

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

function switch_online (id)

if id == -1 then return end

local sim = alife ()

if sim ~= nil then

sim:set_switch_online (id, true)

sim:set_switch_offline (id, false)

end

end

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

function switch_offline (npc)

if npc == nil or npc:alive () == false then return end

local sim = alife ()

if sim ~= nil then

sim:set_switch_online (npc:id (), false)

sim:set_switch_offline (npc:id (), true)

end

end

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

function get_actor_id()

if(level.actor() == nil) then return -1 end

return level.actor():id()

end

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

function IsMonster (object, class_id)

local id = class_id or get_clsid (object)

if id == clsid.boar_s or

id == clsid.bloodsucker_s or

id == clsid.dog_s or

id == clsid.flesh_s or

id == clsid.pseudodog_s or

id == clsid.psy_dog_s or

id == clsid.burer_s or

id == clsid.cat_s or

id == clsid.chimera_s or

id == clsid.controller_s or

id == clsid.fracture_s or

id == clsid.poltergeist_s or

id == clsid.gigant_s or

id == clsid.zombie_s or

id == clsid.tushkano_s or

id == clsid.snork_s

then

return true

end

return false

end

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

function IsStalker (object, class_id)

local id = class_id or get_clsid (object)

if id == clsid.actor or id == clsid.script_stalker then

return true

end

return false

end

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

function IsHelicopter (object, class_id)

local id = class_id or get_clsid (object)

if id == clsid.script_heli then

return true

end

return false

end

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

function IsCar (object, class_id)

local id = class_id or get_clsid (object)

if id == clsid.car_s then

return true

end

return false

end

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

function level_object_by_sid( sid )

local sim = alife()

 

if sim then

local se_obj = sim:story_object( sid )

if se_obj then

return level.object_by_id( se_obj.id )

end

end

 

return nil

end

 

function id_by_sid( sid )

local sim = alife()

 

if sim then

local se_obj = sim:story_object( sid )

if se_obj then

return se_obj.id

end

end

 

return nil

end

 

-- Крешнуть игру (после вывода сообщения об ошибке в лог)

function abort(fmt, ...)

dbglog("!-!-!- Принудительный Вылет -!-!-!")

local reason = string.format(fmt, ...)

assert("ERROR: " .. reason)

printf("ERROR: " .. reason)

printf("%s")

end

 

function set_postprocess(name_ini_file)

bind_stalker.post_process = postprocess.PostProcess(ini_file(name_ini_file))

end

function remove_postprocess()

bind_stalker.post_process = nil

end

 

function set_inactivate_input_time(delta)

db.storage[db.actor:id()].disable_input_time = game.get_game_time()

db.storage[db.actor:id()].disable_input_idle = delta

level.disable_input()

end

-- Принимает: позицию положения, позицию куда смотреть, время сна в минутах.

function set_sleep_relocate(point, look, timeout)

db.storage[db.actor:id()].sleep_relocate_time = game.get_game_time()

db.storage[db.actor:id()].sleep_relocate_idle = timeout*60

db.storage[db.actor:id()].sleep_relocate_point = point

db.storage[db.actor:id()].sleep_relocate_look = look

 

--set_inactivate_input_time(timeout*60)

--db.actor:actor_sleep(0, timeout)

end

 

-- проверяет целую часть числа на нечётность

function odd( x )

return math.floor( x * 0.5 ) * 2 == math.floor( x )

end

 

--' Усталость

function on_actor_critical_power()

if has_alife_info("esc_trader_newbie") then

game.start_tutorial("part_11_weakness")

end

if not has_alife_info("encyclopedy_tutorial_weakness") then

db.actor:give_info_portion("encyclopedy_tutorial_weakness")

end

end

 

function on_actor_critical_max_power()

end

 

--' Кровотечение

function on_actor_bleeding()

if has_alife_info("esc_trader_newbie") then

game.start_tutorial("part_8_wound")

end

if not has_alife_info("encyclopedy_tutorial_wound") then

db.actor:give_info_portion("encyclopedy_tutorial_wound")

end

end

 

function on_actor_satiety()

end

 

--' Радиация

function on_actor_radiation()

if has_alife_info("esc_trader_newbie") then

game.start_tutorial("part_6_radiation")

end

if not has_alife_info("encyclopedy_tutorial_radiation") then

db.actor:give_info_portion("encyclopedy_tutorial_radiation")

end

end

 

--' Заклинило оружие

function on_actor_weapon_jammed()

if has_alife_info("esc_trader_newbie") then

game.start_tutorial("part_9_weapon")

end

if not has_alife_info("encyclopedy_tutorial_weapon") then

db.actor:give_info_portion("encyclopedy_tutorial_weapon")

end

end

 

--' не может ходить изза веса

function on_actor_cant_walk_weight()

if has_alife_info("esc_trader_newbie") then

game.start_tutorial("part_14_overload")

end

if not has_alife_info("encyclopedy_tutorial_overload") then

db.actor:give_info_portion("encyclopedy_tutorial_overload")

end

end

 

--' пси воздействие

function on_actor_psy()

end

 

function set_actor_rank(rank)

if rank == "novice" then

db.actor:set_character_rank(0)

elseif rank == "stalker" then

db.actor:set_character_rank(300)

elseif rank == "veteran" then

db.actor:set_character_rank(600)

elseif rank == "master" then

db.actor:set_character_rank(900)

end

end

 

function get_texture_info(id_name, id_default)

if id_default == nil then id_default = id_name end

 

local task_info = GetTextureInfo(id_name, id_default)

local r = task_info:get_rect()

 

r.x2 = r.x2 - r.x1

r.y2 = r.y2 - r.y1

return task_info:get_file_name(), r

end

 

function start_game_callback()

printf ("start_game_callback called")

task_manager.clear_task_manager()

treasure_manager.clear_treasure_manager()

xr_sound.clear_all_sound_object()

dialog_manager.fill_phrase_table()

mod_man.init()

end

 

ammo_section = {}

ammo_section["ammo_9x18_fmj"] = true

ammo_section["ammo_9x18_pbp"] = true

ammo_section["ammo_9x18_pmm"] = true

ammo_section["ammo_9x19_fmj"] = true

ammo_section["ammo_9x19_pbp"] = true

ammo_section["ammo_5.45x39_fmj"] = true

ammo_section["ammo_5.45x39_ap"] = true

ammo_section["ammo_5.56x45_ss190"] = true

ammo_section["ammo_5.56x45_ap"] = true

ammo_section["ammo_5.7x28_fmj"] = true

ammo_section["ammo_5.7x28_ap"] = true

ammo_section["ammo_7.62x54_7h1"] = true

ammo_section["ammo_7.62x54_ap"] = true

ammo_section["ammo_7.62x54_7h14"] = true

ammo_section["ammo_9x39_pab9"] = true

ammo_section["ammo_gauss"] = true

ammo_section["ammo_9x39_ap"] = true

ammo_section["ammo_9x39_sp5"] = true

ammo_section["ammo_11.43x23_fmj"] = true

ammo_section["ammo_11.43x23_hydro"] = true

ammo_section["ammo_12x70_buck"] = true

ammo_section["ammo_12x76_dart"] = true

ammo_section["ammo_12x76_zhekan"] = true

 

quest_section = {}

quest_section["gunslinger_flash"] = true

quest_section["af_blood_tutorial"] = true

quest_section["esc_wounded_flash"] = true

quest_section["quest_case_02"] = true

quest_section["dar_document1"] = true

quest_section["dar_document2"] = true

quest_section["dar_document3"] = true

quest_section["dar_document4"] = true

quest_section["dar_document5"] = true

quest_section["kruglov_flash"] = true

quest_section["lab_x16_documents"] = true

quest_section["good_psy_helmet"] = true

quest_section["bad_psy_helmet"] = true

quest_section["decoder"] = true

quest_section["dynamite"] = true

quest_section["quest_case_01"] = true

quest_section["quest_case_03"] = true

quest_section["hunters_toz"] = true

quest_section["bar_ecolog_flash"] = true

quest_section["bar_tiran_pda"] = true

quest_section["bar_lucky_pda"] = true

quest_section["agr_deserter_pda"] = true

quest_section["borov_flash"] = true

quest_section["val_key_to_underground"] = true

quest_section["dolg_arhive_documents"] = true

quest_section["bar_decoding_documents"] = true

quest_section["dolg_pda"] = true

quest_section["crazy_flash"] = true

quest_section["mil_svoboda_leader_pda"] = true

quest_section["svoboda_pda"] = true

quest_section["bar_sniper_pda"] = true

quest_section["bar_key_to_val_underground"] = true

quest_section["pri_lom_ak74"] = true

quest_section["rad_jaw_zam_pda"] = true

quest_section["detector_advances_tutorial"] = true

quest_section["wpn_deserteagle_coll"] = true

quest_section["wpn_vintorez_coll"] = true

-- quest_section["outfit_monolith_m1"] = true --Убрать (Р.М.А.)

quest_section["cit_doctors_key"] = true

quest_section["war_final_door_key1"] = true

quest_section["war_final_door_key2"] = true

quest_section["war_final_door_key3"] = true

quest_section["cit_leader_killer_pda"] = true

quest_section["cit_killers_documents"] = true

quest_section["cit_deadcity_maps"] = true

quest_section["cit_vp_pda"] = true

 

 

 

плиз, подскажите, как проблему решить!

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

Хантер,

Если у тебя 20 строчка именно вот это log(string.format(fmt,...)) , то попробуй заменить функцию printf на ее аналог из Зенобиан мода:

function printf(fmt,...)
    local arg = {...}
        if arg  == nil then
        get_console():execute("Error_printf:_Arg_=_nil_value")
    else
        for a=1, table.getn(arg), 1 do
                if arg[a] == nil then
               get_console():execute(string.format("Error_printf:_Arg_#%d_=_nil_value",a))        
                    end
               end
       end    
end

Возможно ошибка исчезнет. Из-за дефолтной printf бывают ошибки по той причине, что метод string.format() не понимает nil, и когда в printf передается аргумент со значением nil или вообще ничего - то и получаем string expected, got no value.

Хотя причина вылета может быть и не здесь зарыта :-)

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

Garry_Galler, ну, скорее всего дело не в самом printf, а в том кто именно передает ему nil. :)

 

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

 

P.S. Ваш лог не о чем не говорит, да и _g скорее всего не виноват. Хотя бы расскажите что ковыряли перед появлением ошибки, иначе удалю Ваш вопрос как повторный.

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

Garry_Galler, большое спасибо, вылет исправлен! :D

 

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

блин! ещё один вылет обнаружил! не поймёшь, когда вылетает. но вроде, если долго не сохранялся, а потом решил обыскать труп.

 

 

FATAL ERROR

 

[error]Expression : assertion failed

[error]Function : xrServer::Process_event_reject

[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp

[error]Line : 12

[error]Description : e_parent && e_entity

 

 

stack trace:

 

 

 

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

Хантер,

А ты в консоль заглядывал? Или в сам лог?

Загляни ради интереса - что именно там пишется из тех строк, что есть в новой printf.

Вылета нет потому, что в данном варианте printf стоит ловушка на nil, но сама ошибка может идти как с оригинала, так и из мода либо твоя.

И тебе было бы желательно разобраться в этом - чтобы не поиметь ошибок в будущем.

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

Насчет второго лога - e_parent && e_entity - похоже на баг оригинала.

Но более конкретно не скажу.

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

Garry_Galler, эта ошибка ( которую сейчас увидел) была у меня давно, когда добавил себе мод лутмани. япросто про неё забыл. а когда добавил функцию из зенобиана, долго тестил, и вылетов не было. потом загрузился, немного поиграл, и после обыска очередного трупа - вылет :(

может быть, я что-то неправильно в лутмани сделал, как думаешь?

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

А можно ли заспавнить партикль через all.spawn чтобы он как статичный был.

Ежели можно то как. :russian_ru:


Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

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

Господа скриптологи помогите пожалоста. Лог по вашей теме. Ето спавн вертольота.

Как написал мне на амк форуме один товарищ.... Цытирую

 

Надо дописать функцию в xr_effects.script, какую я не знаю, сам не делал.

 

 

 

 

! Unknown command: ERROR:object

* Log file has been saved successfully!

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

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

djslavikoz

Не думаю что в xr_effects.script надо что то дописывать. Этот файл в твоем случае вообще не причем(если ты его не трогал или не пытался вызывать из логики функцию, которой в нем нет - но тогда и лог был бы другой). Лог с указанием на _g.script:20 как правило говорит о том, что в твоих скриптах есть либо синтаксическая ошибка(где именно - тебе лучше знать, а в лог в данном случае это не передается), либо вызвана дефолтная функция abort для креша игры(вследствие серьезной ошибки в скриптах - об этом может быть как раз и говорит строчка ERROR:object), либо в функцию printf передается (из оригинальных скриптов) некорректный аргумент или некорректное число аргументов (так вот недальновидно разрабы написали эту функцию.)

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

ЗЫ:И прочитай мой пост на прошлых страницах: можешь заменить дефолтную функцию printf из файла _g.script на

ту, что в моем посте. От твоих ошибок она не спасет. Но от ошибочных вызовов оригинала лечит.

ЗЫЫ: Советую пользоваться дебаговым функционалом из модов - тестовый вывод в лог(и консоль) результатов работы своего скрипта еще никому не мешал.

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

Garry_Galler, Ти понимаеш какая ситуация. Скрипт рабочий на стандартной игре, спавн получается без вопросов . С недавна я в СДК сделал новую локацию, подключил, заселил чуваками, бтрами ну всё прочее, и через алл спавн и через скрипты, дошло дело до вертоля ну не вкакую я его и так я его сяк, Мля.... Ето .... терпения нехватает сколько сделал не бросать же а без вертоля нельзя всё таки военная база.

Строгое предупреждение от администратора n6260
Пишите грамотно. И без всяких "мля". Это относится к завуалированному мату. На первый раз - сутки чтения.
Ссылка на комментарий

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

1) Если в логике нпс прописать но_смарт то он сразуже после ухода в оффлайн замерает и некуда не идет,поправте если это не так. Ну а теперь вопрос,меня интересует как можно нпс с но_смартом заставить двигатся по левел и гайм графам в оффлайне? Лично я пришел к выводу что нужно написать скрипт сканирования окружения на графы и перемещения в сторону любого из них.

Ну а вот как написать этот скрипт я незнаю) помогите пожалуйста)

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

Добрый день!

Возможно ли в логике отдельно взятого НПС запретить ему обыскивать трупы, когда они встречаются на его пути, чтобы он четко шел по своему маршруту, не отвлекаясь на это? Может быть, это нужно делать и не в логике, а в глобальном профиле персонажей, в файлах типа m_stalker.ltx?

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

Здравствуйте, столкнулся я с проблемой, кто знает что делать-прошу помочь.

Делаю свой мод, соответственно собрал свой ACDC, кладу туда спавн-разбираю(_unpack), появляются файлы.

Ну я, допустим, правлю что мне нужно, собираю назад(_pack), когда сборка почти уже закончена появляется сообщение ошибки:

importing ways...

dublicate section "pri_a17_mon_amb_4_look" at stkutils/ini_file.pm line 63, <GEN72> line 4064

 

Ошибка говорит о повторе секции, такой секции нигде нет вообще! Что делать?

 

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

Люди помогите, я задался проблемой создания.....

А ты в Alife попробуй поставить число, в котором идет жизнь относительно ГГ очень большим(там вроде всего на 150 метров от ГГ режим онлайн)

Но сам понимаешь что оперативной памяти это будет убивать очень и очень много.

 

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

antreg

invulnerable = true - бессмертие

gather_items_enabled = false - подбирать предметы(пушки)

help_wounded_enabled = false - помогать раненым

corpse_detection_enabled = false - обыскивать трупы

 

Аномальный, вариант с двойным спавном может возникнуть, если помимо нормального

спавна эксклюзива (олл.спавн, старт_позишн в симуляции, ф-ция create_squad в логике)

воткнуть его сквад в респавн.

Вообще не стоит увлекаться респавном без нужды, если внимательно посмотреть оригинальные

файлы игры, респавн сталкеров прописан с определенным условием в spawn_num = {.....}X, 0 ,

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

Нельзя респавнить эксклюзивные сквады с определенной target_smart - доходит до того,

что в один анимпоинт садятся по двое, как-бы один в другом.

С валкером вожможно проблема с точками пути - если твой смарт называется gen_bestilia_baza

то в way_xxx.ltx (all.spawn) имя точки должно быть gen_bestilia_baza_gen_bestilia_kamp4_walk(look) ,

а в файле логики сокращенно без имени смарта gen_bestilia_kamp4_walk(look)

 

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

antreg,

вот такое можно соорудить - что к чему - разберёшься.

ignore_distance = 0

ignore_distance_grenade = 0

ignore_distance_corpse = 0

ignore_distance_danger_hit = 0

ignore_distance_sound = 0

danger_inertion_time_grenade = 0

danger_inertion_time_corpse = 0

danger_inertion_time_hit = 0

danger_inertion_time_sound = 0

 

есть и вот такое

no_loot = true

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

=Strel()K=,

Взять нормальный ACDC и добавлять в него то, что требуется - но по мере необходимости. Чем меньше, тем лучше.

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

Люди, наставте на путь истиный :D . Пытаюсь по статьям сделать смарт терейны на локациях в паке локаций для оригинала теней 1.0004. Но такая проблема - там файлы скриптов смартов тока оригинальных лок. Пробовал сделать все в файле одной йз лок(в gulag_military.script и соответствуюшем ему файле сонфигов). Но не получилось. Неписи уходият в неведомые дали. Танцую с бубном вокруг юпитера из пака. :dash3:

Короч не получается у меня. И точки и указания все на смарт названы правильно. В логике неписей тоже прописан именно мой смарт.

Как заставить работать?

Как ваще на новые локи без sdk ставить рабочие гулаги?

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

gruber спасибо большое за совет.

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

Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

Ссылка на комментарий
Gektor, Научится бы с помощью СДК гулаги делать -вот это круто,а через алл спавн - там все просто.Если все сделал правильно,то возможно забыл разрешить респавн группировки гулага для данной локации(файл конфиг /микс смарт террейн пресест-обрати внимание на ранги если ранг нпс выше разрешенного для данной локи -под смарт не пойдет)И еще список работ гулага (файл гулаг ЖЖЖ скриптс )нужно регестрировать в хр_гулаг скриптс
Ссылка на комментарий

Не подскажете параметр, чтобы непись перестал реагировать на выброс? danger = danger_ignore не работает (в плане выброса).

Мне "Винторез" - единственный друг, надежда, опора и сила.
Уродов сегодня так много вокруг, патронов бы только хватило. (с)

Официальный Discord-сервер по NS OGSR. 
Неофициальный филиал "У Костра", но тоже Discord-сервер.

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

Подскажите пожалуйста скрипт, убивающий сталкера.

Изменено пользователем stalker.odinochka

Срочно ищу опытного скриптёра и модельера, нужна помощь в создании мода.

Готовность мода Новый мир 85%.

Мод Огнемёт для ЗП v1.0 Скачать

 

 

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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