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

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


Svoboда

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

Сталкеры, а есть скрипт, который отлавливает из консоли строчку(текст)?

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


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

Товарищи Сталкеры!

Нужна помощь по такому поводу:

Необходимо сделать проверку на предмет в определённом радиусе(по x,y,z,gvid,lvid) в онлайне(не инвентаре).

И необходимо, что бы предмет был всегда в онли, даже если ты перешёл на другую локацию(такое возможно?).

Может сделать что то вроде этого:

function check()
if прдмет в онли? then
if item(предмет в зоне сферы?) then
звук воспроизводится(s_play)
else 
....

 

И ещё, код: this читает функцию из из самого файла, в котором она запускается?

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


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

Товарищи!

Возможно ли с помощью скрипта заменять текстуру?

Например:

Диалог--->xrTexture.smena()

Сам скрипт:

function smena();

wpn\wpn_gauss1--->wpn\wpn_gauss2(Старая текстура--->Новая текстура)

Нужно сделать скрипт.

 

Сообщение от модератора n6260
Можно скриптом подменить на модель с нужной текстурой (или конфигом), как у Кирага в "ночных прицелах".
Изменено пользователем n6260

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


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

Понятно, просто хочу сделать смену времён года. Придётся через протоптанный путь. А вот ещё:

Играл в сборку: AMK+NLC+HC3.

И там было задание:

По моему:

Доставить на армейские склады рессивер от экологов на водонапорную башню в деревеньке.

Насколько я понял, там есть скрипт на проверку установлен ли предмет?

Только вот найти его не могу.

Хочу сделать что то вроде этого:

Отнёс предмет на нужное место, скрипт заработал, иначе не будет работать.

Сообщение от модератора n6260
Это Сяковский квест. Спроси у него.
Изменено пользователем n6260

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


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

Товарищи Сталкеры!

У меня проблема.

Нужно совместить два скриптовых файла state_mgr.script

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

-- Менеджер изменения состояния тела

-- автор: Диденко Руслан (Stohe)

-- TODO:

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

function printf()

end

 

aim_ratio = 1000/50

min_ratio = 1500

 

--' Эвалуатор, который синхронизирует менеджер.

--' Мы уже в безраличном состоянии idle или нет

class "evaluator_state_mgr_idle" (property_evaluator)

function evaluator_state_mgr_idle:__init(name, state_manager) super (nil, name)

self.st = state_manager

self.mgr = nil

end

function evaluator_state_mgr_idle:evaluate()

if db.Dead2 == 0 then

local t = self.st.target_state == "idle" and

--not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and

self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animation"]):evaluate()

 

if t == true then

 

if self.mgr == nil then

self.mgr = self.object:motivation_action_manager()

end

if self.mgr:initialized() and self.mgr:current_action_id() == xr_actions_id.state_mgr + 1 then

self.st.combat = true

end

end

 

if self.st.combat == true then return true end

 

return false

end

 

class "evaluator_state_mgr_idle_off" (property_evaluator)

function evaluator_state_mgr_idle_off:__init(name, state_manager) super (nil, name)

self.st = state_manager

self.mgr = nil

end

function evaluator_state_mgr_idle_off:evaluate()

local t = self.st.target_state == "idle" and

self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animation"]):evaluate() and

self.st.planner:evaluator(self.st.properties["bodystate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["weapon"]):evaluate() and

self.st.planner:evaluator(self.st.properties["mental"]):evaluate() -- and

-- self.st.planner:evaluator(self.st.properties["direction"]):evaluate()

-- amk.mylog("Checking idleoff for "..self.object:name().." = "..tostring(t))

return t

end

 

--' Мы уже в безраличном состоянии idle или нет ()учет с проверкой alife

class "evaluator_state_mgr_idle_alife" (property_evaluator)

function evaluator_state_mgr_idle_alife:__init(name, state_manager) super (nil, name)

self.st = state_manager

self.t = nil

end

function evaluator_state_mgr_idle_alife:evaluate()

if not self.object:alive() then

return true

end

-- апдейт менеджера анимаций

-- раньше он был тут, сейчас он вынесен из эвалуатора

 

-- printf("SECTION %s", utils.to_str(db.storage[self.st.npc:id()].active_section))

mgr = self.object:motivation_action_manager()

self.t = nil

if mgr:initialized() then

self.t = mgr:current_action_id()

--printf("ACTION %s", utils.to_str(self.t))

if self.t ~= xr_actions_id.alife then

self.st.alife = false

end

end

 

if db.storage[self.st.npc:id()].active_section == nil then

if xr_meet.is_meet(self.object) == false then

local t = self.st.target_state == "idle" and

not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and

self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animation"]):evaluate()

 

-- printf("%s", utils.to_str(self.st.target_state))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["locked"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["movement"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation"]):evaluate()))

 

if t == true then self.st.alife = true end

if self.st.alife == true then

return true

end

return t

else

return false

end

end

return true

end

 

 

--' Переход в idle

class "act_state_mgr_to_idle" (action_base)

function act_state_mgr_to_idle:__init(name,state_manager) super (nil, name)

self.st = state_manager

end

function act_state_mgr_to_idle:initialize()

action_base.initialize(self)

self.object:movement_enabled(true)

if self.object:best_enemy() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

xr_sound.set_sound(self.object, nil)

stop_play_sound(self.object)

return

end

if self.object:best_danger() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

xr_sound.set_sound(self.object, nil)

stop_play_sound(self.object)

return

end

self.st:set_state("idle")

end

function act_state_mgr_to_idle:execute()

action_base.execute(self)

if self.object:best_enemy() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

return

end

if self.object:best_danger() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

return

end

self.st:set_state("idle")

end

function act_state_mgr_to_idle:finalize()

-- По завершению перехода нужно записать -1 в указатель "на кого смотреть",

-- чтобы при возврате было понятно что его нужно переинициализировать.

 

self.st.current_object = -1

 

action_base.finalize(self)

end

 

--' Переход в idle

class "act_state_mgr_to_off" (action_base)

function act_state_mgr_to_off:__init(name,state_manager) super (nil, name)

self.st = state_manager

end

 

function act_state_mgr_to_off:initialize()

action_base.initialize(self)

self.st:set_state("idle", nil, nil, nil, {animation = true})

xr_sound.set_sound(self.object, nil)

stop_play_sound(self.object)

-- amk.mylog("stmt for "..self.object:name().." is going off","stmt")

end

 

function act_state_mgr_to_off:execute()

action_base.execute(self)

-- self.st:set_state("idle", nil, nil, nil, {animation = true})

end

 

function act_state_mgr_to_off:finalize()

-- По завершению перехода нужно записать -1 в указатель "на кого смотреть",

-- чтобы при возврате было понятно что его нужно переинициализировать.

 

self.st.current_object = -1

self.object:movement_enabled(true)

-- ui_rad.mylog("stmt for "..self.object:name().." has gone off","stmt")

action_base.finalize(self)

end

 

 

--'-------------------------------------------------------------------------------------

--' Эвалуаторы и экшены менеджера

--'-------------------------------------------------------------------------------------

--' Закончил ли менеджер свою работу

class "eva_state_mgr_end" (property_evaluator)

function eva_state_mgr_end:__init(name, st) super (nil, name)

self.st = st

self.mgr = nil

end

function eva_state_mgr_end:evaluate()

if self.mgr == nil then

self.mgr = self.object:motivation_action_manager()

end

 

if not self.mgr:initialized() then

return false

end

 

local current_action_id = self.mgr:current_action_id()

if current_action_id ~= stalker_ids.action_combat_planner and

current_action_id ~= stalker_ids.action_danger_planner and

current_action_id ~= stalker_ids.action_anomaly_planner

then

self.st.combat = false

end

 

return false

end

 

--' Залочен ли менеджер

class "eva_state_mgr_locked" (property_evaluator)

function eva_state_mgr_locked:__init(name, st) super (nil, name)

self.st = st

end

function eva_state_mgr_locked:evaluate()

--printf("npc %s", self.object:name())

--printf("weapon locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate()))

--printf("direction locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate()))

--printf("animstate locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate()))

--printf("animation locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate()))

 

--printf("combat[%s] alife[%s]", tostring(self.st.combat), tostring(self.st.alife))

if self.st.combat or self.st.alife then

return true

end

 

return self.st.planner:initialized() and (

self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate())

end

 

--' Идловый экшн менеджера

class "act_state_mgr_end" (action_base)

function act_state_mgr_end:__init(name, st) super (nil, name)

self.st = st

end

function act_state_mgr_end:initialize()

action_base.initialize(self)

end

function act_state_mgr_end:execute()

action_base.execute(self)

 

-- if not self.st.planner:evaluator(self.st.properties["movement_stand_now"]):evaluate() then

-- state_mgr_direction.update_movement_direction(self.object, self.st)

-- end

local wm = rx_wmgr and rx_wmgr.get_wm(self.object)

local wpn = (wm and wm:get_weapon()) or self.object:best_weapon()

if not wpn then

return

end

local t = state_lib.states[self.st.target_state].weapon

if t == "fire" or t == "sniper_fire" then

--printf("[%s] shooting", self.object:name())

local sniper_aim = 3000

if self.st.look_object ~= nil then

local look_object = level.object_by_id(self.st.look_object)

if look_object == nil then

self.st.look_object = nil

return

end

if self.object:see(look_object) and

(not IsStalker(look_object) or

self.object:relation(look_object) == game_object.enemy) and

look_object:alive() == true

then

if t == "sniper_fire" then

sniper_aim = self.object:position():distance_to(look_object:position())*aim_ratio

if sniper_aim <= min_ratio then

self.object:set_item(object.fire1, wpn, 1, min_ratio)

return

end

self.object:set_item(object.fire1, wpn, 1, sniper_aim)

else

self.object:set_item(object.fire1, wpn, state_mgr_weapon.get_queue_params(self.object, look_object))

end

return

else

self.object:set_item(object.idle, wpn)

return

end

end

 

if self.st.look_position ~= nil and

self.st.look_object == nil

then

if t == "sniper_fire" then

self.object:set_item(object.fire1, wpn, 1, sniper_aim)

else

self.object:set_item(object.fire1, wpn, state_mgr_weapon.get_queue_params(self.object, nil))

end

return

else

if self.st.target_state == "psy_shoot" then

self.object:set_item(object.fire1, wpn)

return

end

self.object:set_item(object.idle, wpn)

return

end

return

elseif t == "unstrapped" then

--printf("[%s] not shooting", self.object:name())

self.object:set_item(state_mgr_weapon.get_idle_state(self.st.target_state), wpn)

end

end

function act_state_mgr_end:finalize()

action_base.finalize(self)

end

 

--' Лок менеджера

class "act_state_mgr_locked" (action_base)

function act_state_mgr_locked:__init(name, st) super (nil, name)

self.st = st

end

function act_state_mgr_locked:initialize()

action_base.initialize(self)

end

function act_state_mgr_locked:execute()

action_base.execute(self)

end

function act_state_mgr_locked:finalize()

action_base.finalize(self)

end

 

 

animation_reset_denied = {

wounded = true,

wounded_heavy = true,

wounded_heavy_2 = true,

wounded_heavy_3 = true,

wounded_zombie = true

}

 

--' Сам менеджер

class "state_manager"

function state_manager:__init(npc)

state_mgr_goap.goap_graph(self, npc)

 

self.target_state = "idle"

self.current_direction = nil

self.target_position = nil

self.current_object = nil

self.combat = false

self.alife = true

self.emerg = {}

self.synsound = nil

self.yaw_delta = nil

self.subanim = 0

self.need_reweapon = false

end

function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys)

printf("Set State called: for %s State: %s", self.npc:name(), state_name)

 

if state_lib.states[state_name] == nil then

abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name())

end

if target then

if target.look_position then

printf("look position: %s %s %s", target.look_position.x,

target.look_position.y,

target.look_position.z)

else

printf("look position: NIL")

end

if target.look_object then

printf("look object: %s", target.look_object:name())

else

printf("look object: NIL")

end

else

printf("look target NIL")

end

 

--сперва устанавливаем цели

if target ~= nil then

self.look_position = target.look_position

if target.look_object ~= nil then

self.look_object = target.look_object:id()

else

self.look_object = nil

end

else

self.look_position = nil

self.look_object = nil

end

-- меняем угол точности.

if extrakeys and extrakeys.yaw_delta ~= nil then

self.yaw_delta = extrakeys.yaw_delta

else

self.yaw_delta = 5

end

-- меняем глубину рекурсивности анимации.

if extrakeys and extrakeys.subanim ~= nil then

self.subanim = extrakeys.subanim

else

self.subanim = 0

end

 

local switched = false

local last_state = self.target_state

if self.target_state ~= state_name then

 

--' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу

if (state_lib.states[self.target_state].weapon == "fire" or

state_lib.states[self.target_state].weapon == "sniper_fire") and

(state_lib.states[state_name].weapon ~= "fire" and

state_lib.states[state_name].weapon ~= "sniper_fire")

then

self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name))

--printf("[%s] stop shooting", self.npc:name())

end

 

 

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

if state_lib.states[self.target_state].movement ~= move.stand and

state_lib.states[state_name].movement == move.stand

then

self.npc:movement_enabled(false)

end

 

 

self.target_state = state_name

self.current_object = nil

switched = true

end

 

if state_lib.states[state_name].reset == true then

self.reset_state = true

else

self.reset_state = false

end

 

 

if switched and emerg ~= nil then

if animation_reset_denied[last_state] ~= true then

self.emerg.animation = emerg.animation

self.emerg.animation_nout = emerg.animation_nout

end

end

 

self.synsound = synsound

 

 

self.callback = callback

if timeout ~= nil and

timeout >= 0

then

self.callback.timeout = timeout

self.callback.begin = nil

else

if self.callback then

self.callback.func = nil

self.callback.timeout = nil

end

end

 

-- if switched == true then

-- self:update()

-- end

end

else

 

printf("Set State called: for %s State: %s", self.npc:name(), state_name)

 

if state_lib.states[state_name] == nil then

abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name())

end

if target then

if target.look_position then

printf("look position: %s %s %s", target.look_position.x,

target.look_position.y,

target.look_position.z)

else

printf("look position: NIL")

end

if target.look_object then

printf("look object: %s", target.look_object:name())

else

printf("look object: NIL")

end

else

printf("look target NIL")

end

 

--сперва устанавливаем цели

if target ~= nil then

self.look_position = target.look_position

if target.look_object ~= nil then

self.look_object = target.look_object:id()

else

self.look_object = nil

end

else

self.look_position = nil

self.look_object = nil

end

-- меняем угол точности.

if extrakeys and extrakeys.yaw_delta ~= nil then

self.yaw_delta = extrakeys.yaw_delta

else

self.yaw_delta = 5

end

-- меняем глубину рекурсивности анимации.

if extrakeys and extrakeys.subanim ~= nil then

self.subanim = extrakeys.subanim

else

self.subanim = 0

end

 

local switched = false

local last_state = self.target_state

if self.target_state ~= state_name then

 

--' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу

if (state_lib.states[self.target_state].weapon == "fire" or

state_lib.states[self.target_state].weapon == "sniper_fire") and

(state_lib.states[state_name].weapon ~= "fire" and

state_lib.states[state_name].weapon ~= "sniper_fire")

then

self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name))

--printf("[%s] stop shooting", self.npc:name())

end

 

 

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

if state_lib.states[self.target_state].movement ~= move.stand and

state_lib.states[state_name].movement == move.stand

then

self.npc:movement_enabled(false)

end

 

 

self.target_state = state_name

self.current_object = nil

switched = true

end

 

if state_lib.states[state_name].reset == true then

self.reset_state = true

else

self.reset_state = false

end

 

 

if switched and emerg ~= nil then

if animation_reset_denied[last_state] ~= true then

self.emerg.animation = emerg.animation

self.emerg.animation_nout = emerg.animation_nout

end

end

 

self.synsound = synsound

 

 

self.callback = callback

if timeout ~= nil and

timeout >= 0

then

self.callback.timeout = timeout

self.callback.begin = nil

else

if self.callback then

self.callback.func = nil

self.callback.timeout = nil

end

end

 

-- if switched == true then

-- self:update()

-- end

end

end

function state_manager:get_state()

return self.target_state

end

function state_manager:update()

--printf("Update called")

self.animstate:update()

self.animation:update()

self.planner:update()

--self.planner:show("")

end

 

 

 

 

 

function set_state(npc, state_name, callback, timeout, target, emerg, synsound, extrakeys)

if db.storage[npc:id()].state_mgr then

db.storage[npc:id()].state_mgr:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys)

end

end

function get_state(npc)

if db.storage[npc:id()].state_mgr then

return db.storage[npc:id()].state_mgr:get_state()

end

return nil

end

 

 

 

 

 

 

 

 

 

function bind_manager(object)

local manager = object:motivation_action_manager()

 

 

local properties = {}

properties["state_mgr_idle_combat"] = xr_evaluators_id.state_mgr + 1

properties["state_mgr_idle_alife"] = xr_evaluators_id.state_mgr + 2

properties["state_mgr_idle_off"] = xr_evaluators_id.state_mgr + 3

 

local operators = {}

operators["state_mgr_to_idle_combat"] = xr_actions_id.state_mgr + 1

operators["state_mgr_to_idle_alife"] = xr_actions_id.state_mgr + 2

operators["state_mgr_to_idle_off"] = xr_actions_id.state_mgr + 3

 

local state_manager = state_mgr.state_manager(object)

 

manager:add_evaluator(properties["state_mgr_idle_combat"], evaluator_state_mgr_idle("state_mgr_idle_combat", state_manager))

manager:add_evaluator(properties["state_mgr_idle_alife"], evaluator_state_mgr_idle_alife("state_mgr_idle_alife", state_manager))

manager:add_evaluator(properties["state_mgr_idle_off"], evaluator_state_mgr_idle_off("state_mgr_idle_off", state_manager))

 

local action = this.act_state_mgr_to_idle("state_mgr_to_idle_combat", state_manager)

action:add_precondition (world_property(properties["state_mgr_idle_combat"], false))

action:add_effect (world_property(properties["state_mgr_idle_combat"], true))

manager:add_action(operators["state_mgr_to_idle_combat"], action)

 

-- Добавим ещё один тип отключения этого безобразия

action = this.act_state_mgr_to_off("state_mgr_to_off", state_manager)

action:add_precondition (world_property(properties["state_mgr_idle_off"], false))

action:add_effect (world_property(properties["state_mgr_idle_off"], true))

manager:add_action(operators["state_mgr_to_idle_off"], action)

 

action = this.act_state_mgr_to_idle("state_mgr_to_idle_alife", state_manager)

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(properties["state_mgr_idle_alife"], false))

action:add_effect (world_property(properties["state_mgr_idle_alife"], true))

manager:add_action(operators["state_mgr_to_idle_alife"], action)

 

action = manager:action(xr_actions_id.alife)

action:add_precondition(world_property(properties["state_mgr_idle_alife"],true))

 

action = manager:action(stalker_ids.action_combat_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_anomaly_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_danger_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_gather_items)

action:add_precondition(world_property(properties["state_mgr_idle_alife"],true))

 

return state_manager

end

 

 

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

-- Менеджер изменения состояния тела

-- автор: Диденко Руслан (Stohe)

-- TODO:

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

function printf()

end

 

aim_ratio = 1000/50

min_ratio = 1500

 

--' Эвалуатор, который синхронизирует менеджер.

--' Мы уже в безраличном состоянии idle или нет

class "evaluator_state_mgr_idle" (property_evaluator)

function evaluator_state_mgr_idle:__init(name, state_manager) super (nil, name)

self.st = state_manager

self.mgr = nil

end

function evaluator_state_mgr_idle:evaluate()

if db.Dead2 == 0 then

 

local t = self.st.target_state == "idle" and

--not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and

self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animation"]):evaluate()

 

if t == true then

 

if self.mgr == nil then

self.mgr = self.object:motivation_action_manager()

end

if self.mgr:initialized() and self.mgr:current_action_id() == xr_actions_id.state_mgr + 1 then

self.st.combat = true

end

end

 

if self.st.combat == true then return true end

return false

end

end

--' Мы уже в безраличном состоянии idle или нет ()учет с проверкой alife

class "evaluator_state_mgr_idle_alife" (property_evaluator)

function evaluator_state_mgr_idle_alife:__init(name, state_manager) super (nil, name)

self.st = state_manager

self.t = nil

end

function evaluator_state_mgr_idle_alife:evaluate()

 

 

if not self.object:alive() then

return true

end

-- апдейт менеджера анимаций

-- раньше он был тут, сейчас он вынесен из эвалуатора

 

-- printf("SECTION %s", utils.to_str(db.storage[self.st.npc:id()].active_section))

mgr = self.object:motivation_action_manager()

self.t = nil

if mgr:initialized() then

self.t = mgr:current_action_id()

--printf("ACTION %s", utils.to_str(self.t))

if self.t ~= xr_actions_id.alife then

self.st.alife = false

end

end

 

if db.storage[self.st.npc:id()].active_section == nil then

if xr_meet.is_meet(self.object) == false then

local t = self.st.target_state == "idle" and

not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and

self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and

self.st.planner:evaluator(self.st.properties["animation"]):evaluate()

 

-- printf("%s", utils.to_str(self.st.target_state))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["locked"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["movement"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate"]):evaluate()))

-- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation"]):evaluate()))

 

if t == true then self.st.alife = true end

if self.st.alife == true then

return true

end

return t

else

return false

end

end

return true

end

 

 

--' Переход в idle

class "act_state_mgr_to_idle" (action_base)

function act_state_mgr_to_idle:__init(name,state_manager) super (nil, name)

self.st = state_manager

end

function act_state_mgr_to_idle:initialize()

 

action_base.initialize(self)

self.object:movement_enabled(true)

if self.object:best_enemy() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

xr_sound.set_sound(self.object, nil)

stop_play_sound(self.object)

return

end

if self.object:best_danger() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

xr_sound.set_sound(self.object, nil)

stop_play_sound(self.object)

return

end

self.st:set_state("idle")

end

function act_state_mgr_to_idle:execute()

 

action_base.execute(self)

if self.object:best_enemy() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

return

end

if self.object:best_danger() then

self.st:set_state("idle", nil, nil, nil, {animation = true})

return

end

self.st:set_state("idle")

end

function act_state_mgr_to_idle:finalize()

-- По завершению перехода нужно записать -1 в указатель "на кого смотреть",

-- чтобы при возврате было понятно что его нужно переинициализировать.

 

self.st.current_object = -1

 

action_base.finalize(self)

end

 

 

--'-------------------------------------------------------------------------------------

--' Эвалуаторы и экшены менеджера

--'-------------------------------------------------------------------------------------

--' Закончил ли менеджер свою работу

class "eva_state_mgr_end" (property_evaluator)

function eva_state_mgr_end:__init(name, st) super (nil, name)

self.st = st

self.mgr = nil

end

function eva_state_mgr_end:evaluate()

if self.mgr == nil then

self.mgr = self.object:motivation_action_manager()

end

 

if not self.mgr:initialized() then

return false

end

 

local current_action_id = self.mgr:current_action_id()

if current_action_id ~= stalker_ids.action_combat_planner and

current_action_id ~= stalker_ids.action_danger_planner and

current_action_id ~= stalker_ids.action_anomaly_planner

then

self.st.combat = false

end

 

return false

end

 

--' Залочен ли менеджер

class "eva_state_mgr_locked" (property_evaluator)

function eva_state_mgr_locked:__init(name, st) super (nil, name)

self.st = st

end

function eva_state_mgr_locked:evaluate()

--printf("npc %s", self.object:name())

--printf("weapon locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate()))

--printf("direction locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate()))

--printf("animstate locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate()))

--printf("animation locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate()))

 

--printf("combat[%s] alife[%s]", tostring(self.st.combat), tostring(self.st.alife))

if self.st.combat or self.st.alife then

return true

end

 

return self.st.planner:initialized() and (

self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate() or

self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate())

end

 

--' Идловый экшн менеджера

class "act_state_mgr_end" (action_base)

function act_state_mgr_end:__init(name, st) super (nil, name)

self.st = st

end

function act_state_mgr_end:initialize()

action_base.initialize(self)

end

function act_state_mgr_end:execute()

action_base.execute(self)

 

-- if not self.st.planner:evaluator(self.st.properties["movement_stand_now"]):evaluate() then

-- state_mgr_direction.update_movement_direction(self.object, self.st)

-- end

local t = state_lib.states[self.st.target_state].weapon

local w = isWeapon(self.object:best_weapon())

 

if not w then

return

end

if t == "fire" or t == "sniper_fire" then

--printf("[%s] shooting", self.object:name())

local sniper_aim = 3000

if self.st.look_object ~= nil then

local look_object = level.object_by_id(self.st.look_object)

if look_object == nil then

self.st.look_object = nil

return

end

if self.object:see(look_object) ~= nil and

(not IsStalker(look_object) or

self.object:relation(look_object) == game_object.enemy) and

look_object:alive() == true

then

if t == "sniper_fire" then

sniper_aim = self.object:position():distance_to(look_object:position())*aim_ratio

if sniper_aim <= min_ratio then

self.object:set_item(object.fire1, self.object:best_weapon(), 1, min_ratio)

return

end

self.object:set_item(object.fire1, self.object:best_weapon(), 1, sniper_aim)

else

self.object:set_item(object.fire1, self.object:best_weapon(), state_mgr_weapon.get_queue_params(self.object, look_object))

end

return

else

self.object:set_item(object.idle, self.object:best_weapon())

return

end

end

 

if self.st.look_position ~= nil and

self.st.look_object == nil

then

if t == "sniper_fire" then

self.object:set_item(object.fire1, self.object:best_weapon(), 1, sniper_aim)

else

self.object:set_item(object.fire1, self.object:best_weapon(), state_mgr_weapon.get_queue_params(self.object, nil))

end

return

else

if self.st.target_state == "psy_shoot" then

self.object:set_item(object.fire1, self.object:best_weapon())

return

end

self.object:set_item(object.idle, self.object:best_weapon())

return

end

return

elseif t == "unstrapped" then

--printf("[%s] not shooting", self.object:name())

self.object:set_item(state_mgr_weapon.get_idle_state(self.st.target_state), self.object:best_weapon())

end

end

function act_state_mgr_end:finalize()

action_base.finalize(self)

end

 

--' Лок менеджера

class "act_state_mgr_locked" (action_base)

function act_state_mgr_locked:__init(name, st) super (nil, name)

self.st = st

end

function act_state_mgr_locked:initialize()

action_base.initialize(self)

end

function act_state_mgr_locked:execute()

action_base.execute(self)

end

function act_state_mgr_locked:finalize()

action_base.finalize(self)

end

 

 

animation_reset_denied = {

wounded = true,

wounded_heavy = true,

wounded_heavy_2 = true,

wounded_heavy_3 = true,

wounded_zombie = true

}

 

--' Сам менеджер

class "state_manager"

function state_manager:__init(npc)

state_mgr_goap.goap_graph(self, npc)

 

self.target_state = "idle"

self.current_direction = nil

self.target_position = nil

self.current_object = nil

self.combat = false

self.alife = true

self.emerg = {}

self.synsound = nil

self.yaw_delta = nil

self.subanim = 0

self.need_reweapon = false

end

function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys)

local is_zombied = self.npc:section()

 

if is_zombied ~= "stalker_zombied" and db.Dead2 == 1 and Psy.Return_Q2NPC(self.npc,"l05_bar",123,140,18,30,-6,0) == 0 and Psy.Return_Q2NPC(self.npc,"l08_yantar",26,40,-279,-269,-16,0) == 0 then

 

if state_name == state_name then

if state_name ~= db.DState and state_name ~= "wounded_heavy_2" then

state_name = db.DState

end

printf("Set State called: for %s State: %s", self.npc:name(), state_name)

 

if state_lib.states[state_name] == nil then

abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name())

end

if target then

if target.look_position then

printf("look position: %s %s %s", target.look_position.x,

target.look_position.y,

target.look_position.z)

else

printf("look position: NIL")

end

if target.look_object then

printf("look object: %s", target.look_object:name())

else

printf("look object: NIL")

end

else

printf("look target NIL")

end

 

--сперва устанавливаем цели

if target ~= nil then

self.look_position = target.look_position

if target.look_object ~= nil then

self.look_object = target.look_object:id()

else

self.look_object = nil

end

else

self.look_position = nil

self.look_object = nil

end

-- меняем угол точности.

if extrakeys and extrakeys.yaw_delta ~= nil then

self.yaw_delta = extrakeys.yaw_delta

else

self.yaw_delta = 5

end

-- меняем глубину рекурсивности анимации.

if extrakeys and extrakeys.subanim ~= nil then

self.subanim = extrakeys.subanim

else

self.subanim = 0

end

 

local switched = false

local last_state = self.target_state

if self.target_state ~= state_name then

 

--' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу

if (state_lib.states[self.target_state].weapon == "fire" or

state_lib.states[self.target_state].weapon == "sniper_fire") and

(state_lib.states[state_name].weapon ~= "fire" and

state_lib.states[state_name].weapon ~= "sniper_fire")

then

self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name))

--printf("[%s] stop shooting", self.npc:name())

end

 

 

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

if state_lib.states[self.target_state].movement ~= move.stand and

state_lib.states[state_name].movement == move.stand

then

self.npc:movement_enabled(false)

end

 

 

self.target_state = state_name

self.current_object = nil

switched = true

end

 

if state_lib.states[state_name].reset == true then

self.reset_state = true

else

self.reset_state = false

end

 

 

if switched and emerg ~= nil then

if animation_reset_denied[last_state] ~= true then

self.emerg.animation = emerg.animation

self.emerg.animation_nout = emerg.animation_nout

end

end

 

self.synsound = synsound

 

 

self.callback = callback

if timeout ~= nil and

timeout >= 0

then

self.callback.timeout = timeout

self.callback.begin = nil

else

if self.callback then

self.callback.func = nil

self.callback.timeout = nil

end

end

 

-- if switched == true then

-- self:update()

-- end

end

 

else

 

printf("Set State called: for %s State: %s", self.npc:name(), state_name)

 

if state_lib.states[state_name] == nil then

abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name())

end

if target then

if target.look_position then

printf("look position: %s %s %s", target.look_position.x,

target.look_position.y,

target.look_position.z)

else

printf("look position: NIL")

end

if target.look_object then

printf("look object: %s", target.look_object:name())

else

printf("look object: NIL")

end

else

printf("look target NIL")

end

 

--сперва устанавливаем цели

if target ~= nil then

self.look_position = target.look_position

if target.look_object ~= nil then

self.look_object = target.look_object:id()

else

self.look_object = nil

end

else

self.look_position = nil

self.look_object = nil

end

-- меняем угол точности.

if extrakeys and extrakeys.yaw_delta ~= nil then

self.yaw_delta = extrakeys.yaw_delta

else

self.yaw_delta = 5

end

-- меняем глубину рекурсивности анимации.

if extrakeys and extrakeys.subanim ~= nil then

self.subanim = extrakeys.subanim

else

self.subanim = 0

end

 

local switched = false

local last_state = self.target_state

if self.target_state ~= state_name then

 

--' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу

if (state_lib.states[self.target_state].weapon == "fire" or

state_lib.states[self.target_state].weapon == "sniper_fire") and

(state_lib.states[state_name].weapon ~= "fire" and

state_lib.states[state_name].weapon ~= "sniper_fire")

then

self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name))

--printf("[%s] stop shooting", self.npc:name())

end

 

 

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

if state_lib.states[self.target_state].movement ~= move.stand and

state_lib.states[state_name].movement == move.stand

then

self.npc:movement_enabled(false)

end

 

 

self.target_state = state_name

self.current_object = nil

switched = true

end

 

if state_lib.states[state_name].reset == true then

self.reset_state = true

else

self.reset_state = false

end

 

 

if switched and emerg ~= nil then

if animation_reset_denied[last_state] ~= true then

self.emerg.animation = emerg.animation

self.emerg.animation_nout = emerg.animation_nout

end

end

 

self.synsound = synsound

 

 

self.callback = callback

if timeout ~= nil and

timeout >= 0

then

self.callback.timeout = timeout

self.callback.begin = nil

else

if self.callback then

self.callback.func = nil

self.callback.timeout = nil

end

end

 

-- if switched == true then

-- self:update()

-- end

end

end

function state_manager:get_state()

return self.target_state

end

function state_manager:update()

--printf("Update called")

self.animstate:update()

self.animation:update()

self.planner:update()

--self.planner:show("")

end

 

 

 

 

 

function set_state(npc, state_name, callback, timeout, target, emerg, synsound, extrakeys)

if db.storage[npc:id()].state_mgr then

db.storage[npc:id()].state_mgr:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys)

end

end

function get_state(npc)

if db.storage[npc:id()].state_mgr then

return db.storage[npc:id()].state_mgr:get_state()

end

return nil

end

 

 

 

 

 

 

 

 

 

function bind_manager(object)

local manager = object:motivation_action_manager()

 

 

local properties = {}

properties["state_mgr_idle_combat"] = xr_evaluators_id.state_mgr + 1

properties["state_mgr_idle_alife"] = xr_evaluators_id.state_mgr + 2

 

local operators = {}

operators["state_mgr_to_idle_combat"] = xr_actions_id.state_mgr + 1

operators["state_mgr_to_idle_alife"] = xr_actions_id.state_mgr + 2

 

local state_manager = state_mgr.state_manager(object)

 

manager:add_evaluator(properties["state_mgr_idle_combat"], evaluator_state_mgr_idle("state_mgr_idle_combat", state_manager))

manager:add_evaluator(properties["state_mgr_idle_alife"], evaluator_state_mgr_idle_alife("state_mgr_idle_alife", state_manager))

 

local action = this.act_state_mgr_to_idle("state_mgr_to_idle_combat", state_manager)

action:add_precondition (world_property(properties["state_mgr_idle_combat"], false))

action:add_effect (world_property(properties["state_mgr_idle_combat"], true))

manager:add_action(operators["state_mgr_to_idle_combat"], action)

 

action = this.act_state_mgr_to_idle("state_mgr_to_idle_alife", state_manager)

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(properties["state_mgr_idle_alife"], false))

action:add_effect (world_property(properties["state_mgr_idle_alife"], true))

manager:add_action(operators["state_mgr_to_idle_alife"], action)

 

action = manager:action(xr_actions_id.alife)

action:add_precondition(world_property(properties["state_mgr_idle_alife"],true))

 

action = manager:action(stalker_ids.action_combat_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_anomaly_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_danger_planner)

action:add_precondition(world_property(properties["state_mgr_idle_combat"],true))

 

action = manager:action(stalker_ids.action_gather_items)

action:add_precondition(world_property(properties["state_mgr_idle_alife"],true))

 

return state_manager

end

 

 

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

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


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

lekzd, это надо адаптировать PsyZones and Emission к AI паку.

 

Вот ещё:

Делаю проверку на броню:

function check_armor()
local wpn,arm
local armor = db.actor:item_in_slot(6)
local weapon = db.actor:item_in_slot(2)

if weapon then
wpn = weapon:section()
else
wpn = "no_weapon"
end

if armor then
arm = armor:section()
else
arm = "no_armor"
end

if string:find(wpn,"wpn_pm") or string:find(wpn,"wpn_bm16") or string:find(wpn,"wpn_ak74") then -- через 'or' пиши сколько нужно стволов
if (not string.find(arm, "exo" )) then
db.actor:drop_item(weapon)
local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),d
b.actor:id())
db.actor:transfer_item(weapon,db.actor)
alife():release(temp)
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
end
end
end
end

 

 

Скрипт из темы рядом.

Всё это в скрипте DiVaresCheckArmor.script

Апдейт в bind_stalker.script

 

Но возникает ошибка:

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: ...k.e.r.chernobyl\gamedata\scripts\bind_stalker.script:250: attempt to index global 'DiVaresCheckArmor' (a nil value)

 

 

stack trace:

 

 

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

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


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

lekzd. Sorry, the file you requested is not available.

Вот что пишет.

 

А всё, скачал с другого.

 

Вот что он у меня нашёл:

Checking D:\S.T.A.L.K.E.R.Chernobyl\gamedata\scripts\DiVaresCheckArmor.script:
DiVaresCheckArmor.script (22): mismatched input 'b' expecting ')'
DiVaresCheckArmor.script (22): mismatched input ')' expecting 'end'
Found 2 errors.

 

Оказалось, проблема была в табуляции.

Было так:

local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),d
b.actor:id())

А надо так:

local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())

 

Но даже после этого та же ошибка.

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

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


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

Сталкеры!

Вот у меня есть код:

function intr()
   local htime = level.get_time_hours()
if htime == 12 and level.get_weather("default") then
    local sactor = alife():actor() 
    local cactor = level.object_by_id(sactor.id) 
    cactor:give_game_news(
        "%c[255,255,1,1]Система\\n%c[255,1,255,1]Тест",   
        "ui\\ui_iconstotal",        
        Frect():set(498,141,83,47),  
        math.random(1000, 3000),     
        50000                         
        )
end
end

Я её забиндил.

Теперь в 12 часов выходит сообщение.

Но! Это сообщение приходит целый час.

То есть целая куча. Пробовал вместо 12 писать 12:00:00 но выходит ошибка.

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

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


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

кровоSTALKER.

А зачем if lck3_auto then ?

Надо просто:

function actor_binder:update(delta)
...
chimera_mod.vvod_antirada()

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


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

Товарищи!

Как сделать одиночное выполнение функции?

Функция спавна. Засунут в биндер.

 

И ещё:

Enable = 1

function test()
if Enable == 1 then
   local dtime = level.get_time_days()
   local htime = level.get_time_hours()
   local mtime = level.get_time_minutes()

if dtime == 1 and htime == 0 and mtime == 0 then
функция спавна...
end
end
end

Как правильно записать дату?

Пишу например: dtime == 1.02.2012, но происходит вылет.

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

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


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

А есть ли функция, что то вроде этой:

function test()

if дистанция между двумя графпойнтами (game_grpah_1 и game_grpah_2) == 1000 метров(или 1 км) then

моя функция...

end

end

Дак вот, надо написать это:

дистанция между двумя графпойнтами (game_grpah_1 и game_grpah_2) == 1000 метров(или 1 км)

в виде Lua, но как? Может у кого есть предложения?

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


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

RvP.

А vid1 и vid2 это названия грфпойнотов?

return game_graph():vertex(vid1):game_point():distance_to(game_graph():vertex(vid2):gam

e_point()) Это сравнение?

И как сделать константу дистанции?

Типа:

if distance == 1000 then

...

end

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

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


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

И ещё вопросец, как можно скриптом заглушить звук?

Знаю, что есть скрипт воспроизведения, остановки, а заглушения есть?

И как будет дистанция между графпойнтом и актором?

Так: game_graph():vertex(vid1):game_point():distance_to(db:actor())?

Расстояние в метрах?

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

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


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

8push5, RvP, спасибо вам огромное!

 

Вот ещё:

function outfit_hud()
local outfit = db.actor:item_in_slot(6)
if outfit ~= nil then
local hudoutfit = outfit:section()
if hudoutfit=="exo_div_outfit" then
    local hud = get_hud()
    hud:AddCustomStatic("hud_cop_static", true)
elseif hudoutfit==nil then
    local hud = get_hud()
    hud:RemoveCustomStatic("hud_cop_static", false)
end
end
end
end

Нужно выполнить проверку надетого костюма.

А если костюм тот, который нужен, то вывести на худ текстуру.

А если костюм не тот, то удалить с худа текстуру.

Вроде сделал, но не так работает.

Надел костюм, появилась текстура на худе.

Снял костюм, текстура осталась, хотя должна была скрыться.

Одел другой костюм, исчезла.

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

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

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


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

8push5, спасибо! Заработало!

 

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

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


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

Это опять я))

Каким методом можно узнать состояние предмета?

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


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

Каким методом, скриптом добавить диалог нпс?

Что бы, вроде:

local push = true

local item = db.actor:object("wpn_pm")

function test()

if item and push then

добавить диалог...

Выдать мессагу...

push = false

end

end

 

Мессагу знаю как сделать. Но как про диалог?

И не подскажете чтение ini файла и запись, посредством Lua?

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

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


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

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

function test()
local obj = "scaner_anm"
if obj:position():distance_to(db.actor:position()) == 10 then
    level.add_pp_effector ("proba.ppe", 1974, false)
end
end

Где ошибка? А то вылет получаю.

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


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

А как получить объект?

Это типа: if obj ~= nil then ...?

Вот лог:

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: ....l.k.e.r.chernobyl\gamedata\scripts\divaresix.script:56: attempt to call method 'position' (a nil value)

 

 

stack trace:

 

 

Lua.script нет. Есть lua_help.script

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

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


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

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