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

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


Svoboда

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

Доброго времени суток! Ковыряю Лост Альфу, и тут с толкнулся с проблемой в виде непонимания работы скриптов. Короче суть в том, что хочу приколхозить скрипт оповещающий о гибели сталкеров. За основу взял наработку из этой темы, за авторством Сталкер Лом + ряд своих изменений под реалии Лост Альфы. Если кто сможет помочь заставить работать сие творение буду очень благодарен. Я в скриптах можно сказать 0. Буду рад любой помощи.

--Сообщение о гибели сталкеров



function necrolog(oVictim)
local level_name = {
["la01_escape"] = "Кордон",
["la02_garbage"] = "Свалка",
["la03_agroprom"] = "НИИ Агропром",
["la04_darkdolina"] = "Тёмная долина",
["la17u_labx7"] = "Лаборатория X-7",
["la05_bar_rostok"] = "Бар",
["la14_rostok_factory"] = "Завод Росток",
["la07_military"] = "Арм.склады",
["la06_yantar"] = "Янтарь",
["la16u_labx16"] = "Лаборатория X-16",
["la19_country"] = "Деревня",
["la10_radar"] = "Радар",
["la11_pripyat"] = "Припять",
["la12_stancia"] = "ЧАЭС",
["la10u_bunker"] = "Бункер Х-10",
["la12u_sarcofag"] = "Саркофаг",
["la13u_warlab"] = "Варлаб",
["la22_forest"] = "Лес",
["la08_deadcity"] = "Мертвый город",
["la09_swamp"] = "Большие болота",
["la13_generators"] = "Генераторы",
["la04u_darklab"] = "Лаборатория Х-18",
["la13u_oso"] = "Осознание",
["la14u_secret_lab"] = "Секретная лаборатория ЧАЭС",
["la15_darkscape"] = "Темная Лощина",
["la15u_mines"] = "Неизвестная територия",
["la16_lost_factory"] = "Цементный Завод",
["la18_damned"] = "Подземелье припяти",
["la20_forgotten"] = "Стройплощадка",
["la21_generators_2"] = "Генераторы 2"
["la17_outskirts"] = "Чернобыль"
["la20_test"] = "Тест",
["la20_final_test"] = "Тест финальный"
}

local death_komment = {
"Я знал, что он допрыгается...",
"[Вырезано цензурой]",
"Ещё один...",
"Таак...",
"Мдя, ни дня без этого.",
"Одним больше, одним меньше...",
"Все там будем",
"Помянуть надо бы...",
"Зона тебе пухом.",
"Как в воду глядел - скопытился!"
}

local community = {
["actor"] = "Сталкер",
["stalker"] = "Сталкер",
["monolith"] = "Монолит",
["army"] = "Военные",
["bandit"] = "Бандит",
["killer"] = "Наемник",
["ecolog"] = "Эколог",
["dolg"] = "Долг",
["freedom"] = "Свобода",
["dark_stalker"] = "Грех",
["arena_enemy"] = "Опонент",
["zombied"] = "Зомбированный"
}

--Сообщение о гибели сталкеров

local necrolog_text = "\\n%c[255,160,160,160]Погиб сталкер: %c[default]"..oVictim:character_name().."\\n%c[255,160,160,160]Группировка: %c[default]"..community[oVictim:character_community()].."\\n%c[255,160,160,160]Локация: %c[default]"..level_name[level.name()]..""
local shans = math.random(1,100)
local comment_text = death_komment[math.random(table.getn(death_komment))]

if oVictim and IsStalker(oVictim) and shans>27 then
db.actor:give_game_news(necrolog_text, "ui\\ui_iconstotal",Frect():set(83,470,83,47),3000,3000)
xr_sound.set_sound_play(db.actor:id(), "pda_tips")
if shans>70 then
db.actor:give_game_news(comment_text, "ui\\ui_iconstotal",Frect():set(83,470,83,47),3000,3000)
end
end
end
--Сообщение о гибели сталкеров

 

--[[-----------------------------------------------------------------------------------------------
File : xr_death.script
Description: Scheme shows, what's happen when NPC dies
Copyright : 2004 © GSC Game World
Author : GSC Game World
Last edit : 21.07.2013 [...]
--]]-----------------------------------------------------------------------------------------------

--/ -----------------------------------------------------------------
--/ VARIABLEs
--/ -----------------------------------------------------------------
local sModule = script_name()
--/ -----------------------------------------------------------------
local log = function(fmt,...) _G.log(sModule..":"..tostring(fmt),...) end
--/ -----------------------------------------------------------------
--/ CONSTRUCTION SCHEME
--/ -----------------------------------------------------------------------------------------------
--/ Action
--/ -----------------------------------------------------------------------------------------------
class "action_process_death"
--/ ---------------------------------------------
function action_process_death:__init(obj, st)
self.object = obj
self.st = st
self.log = st.log
end
--/------------------------------------------------------------------
--/ CALLBACK
--/------------------------------------------------------------------
function action_process_death:death_callback(oVictim, oWho)
news_death_stalker.necrolog(oVictim) -- Некролог в общий канал
if self.log then log("death_callback:NPC=[%s],Killer=[%s]:(%s)", oVictim and oVictim:name(), oWho and oWho:name(), ">") end --/#~#
if oWho then
-- log("death_callback:Victim=[%s],Id=[%s]<~killed_by=[%s]", oVictim:name(), oVictim:id(), oWho:name(), "") --/#~#
self.st.killer = oWho:id()
self.st.killer_name = oWho:name()

if self.st.killer == idActor then
xr_statistic.addKillCount(self.object)
end
--/ giving a small impulse forward.
local h = hit()
h.draftsman = self.object
h.type = hit.fire_wound
h.direction = oWho:position():sub(self.object:position())
h:bone("bip01_spine")
h.power = 1
h.impulse = 10
self.object:hit(h)
else
log("death_callback:Victim=[%s]<~killed_by=[unknown]:<%s>", oVictim and oVictim:name(), "Info!")
self.st.killer = -1
end

if self.st.info then
if self.log then log("death_callback:NPC=[%s],info=[%s]", self.object:name(), self.st.info, "") end --/#~#
xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.info)
end
if self.st.info2 then
if self.log then log("death_callback:NPC=[%s],info2=[%s]", self.object:name(), self.st.info2, "") end --/#~#
xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.info2)
end

--xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) --/#x#

smart_terrain.on_death( self.object:id() )
end
--/ -----------------------------------------------------------------------------------------------
--/ BINDER
--/ -----------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, st)
--log("add_to_binder:NPC=[%s],scheme=[%s],section=[%s]:(%s)", npc:name(), scheme, section, ">") --/#~#
st.action = this.action_process_death(npc, st)
end
--/------------------------------------------------------------------
--/ SET SCHEME
--/------------------------------------------------------------------
function set_scheme(npc, ini, scheme, section, gulag_name)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
--/ registration of action, for call of 'callback' and method 'reset_scheme' when changing scheme settings:
xr_logic.subscribe_action_for_events(npc, st, st.action)
--/ fot debug:
if st.log then log("set_scheme:NPC=[%s],scheme=[%s],section=[%s],gulag=[%s]", npc:name(), scheme, section, gulag_name, "") end --/#~#
end
--/------------------------------------------------------------------
--/ RESET SCHEME
--/------------------------------------------------------------------
function reset_scheme(npc, scheme, stor, section)
if stor.log then log("reset_death:NPC=[%s],scheme=[%s],section=[%s]:(%s)", npc and npc:name(), scheme, section, ">") end --/#~#
local scheme_section = Get_Cfg_String(stor.ini, stor.section_logic, "on_death")
if scheme_section and npc then
local info_section = Get_Cfg_String(stor.ini, scheme_section, "on_info")
if info_section then
stor.death.info = xr_logic.parse_condlist(npc, scheme_section, "death", info_section)
end
local info_section2 = Get_Cfg_String(stor.ini, scheme_section, "on_info2")
if info_section2 then
stor.death.info2 = xr_logic.parse_condlist(npc, scheme_section, "death", info_section2)
end
if stor.log then log("reset_death:NPC=[%s],on_death=[%s],on_info=[%s/%s]", npc and npc:name(), scheme_section, info_section, info_section2, "") end --/#~#
end
end
--/------------------------------------------------------------------
--/ REDIRECTs (for compatibility, later delete)
--/------------------------------------------------------------------
function set_death(...)
set_scheme(...)
end
function reset_death(...)
reset_scheme(...)
end
--/ -----------------------------------------------------------------------------------------------

 

Expression : fatal error
Function : CScriptEngine::lua_error
File : script_engine.cpp
Line : 75
Description :
Arguments : LUA error: ...\stalker lost alpha\gamedata\scripts\xr_death.script:31: attempt to index global 'news_death_stalker' (a nil value)

 

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


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

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

--Сообщение о гибели сталкеров


-- Некролог (На основе работы тов. Weanchester), Сталкер Лом. Правки Maksud, помощь Капрал Хикс

function necrolog(oVictim)
local level_name = {
["la01_escape"] = "Кордон",
["la02_garbage"] = "Свалка",
["la03_agroprom"] = "НИИ Агропром",
["la04_darkdolina"] = "Тёмная долина",
["la17u_labx7"] = "Лаборатория X-7",
["la05_bar_rostok"] = "Бар",
["la14_rostok_factory"] = "Завод Росток",
["la07_military"] = "Арм.склады",
["la06_yantar"] = "Янтарь",
["la16u_labx16"] = "Лаборатория X-16",
["la19_country"] = "Деревня",
["la10_radar"] = "Радар",
["la11_pripyat"] = "Припять",
["la12_stancia"] = "ЧАЭС",
["la10u_bunker"] = "Бункер Х-10",
["la12u_sarcofag"] = "Саркофаг",
["la13u_warlab"] = "Варлаб",
["la22_forest"] = "Лес",
["la08_deadcity"] = "Мертвый город",
["la09_swamp"] = "Большие болота",
["la13_generators"] = "Генераторы",
["la04u_darklab"] = "Лаборатория Х-18",
["la13u_oso"] = "Осознание",
["la14u_secret_lab"] = "Секретная лаборатория ЧАЭС",
["la15_darkscape"] = "Темная Лощина",
["la15u_mines"] = "Неизвестная територия",
["la16_lost_factory"] = "Цементный Завод",
["la18_damned"] = "Подземелье припяти",
["la20_forgotten"] = "Стройплощадка",
["la21_generators_2"] = "Генераторы 2",
["la17_outskirts"] = "Чернобыль",
["la20_test"] = "Тест",
["la20_final_test"] = "Тест финальный"
}

local death_komment = {
"Я знал, что он допрыгается...",
"[Вырезано цензурой]",
"Ещё один...",
"Таак...",
"Мдя, ни дня без этого.",
"Одним больше, одним меньше...",
"Все там будем",
"Помянуть надо бы...",
"Зона тебе пухом.",
"Как в воду глядел - скопытился!"
}

local community = {
["actor"] = "Сталкер",
["stalker"] = "Сталкер",
["monolith"] = "Монолит",
["army"] = "Военные",
["bandit"] = "Бандит",
["killer"] = "Наемник",
["ecolog"] = "Эколог",
["dolg"] = "Долг",
["freedom"] = "Свобода",
["dark_stalker"] = "Грех",
["arena_enemy"] = "Опонент",
["zombied"] = "Зомбированный"
}

-- Сообщение о гибели сталкеров

local necrolog_text = "\\n%c[255,160,160,160]Погиб сталкер: %c[default]"..oVictim:character_name().."\\n%c[255,160,160,160]Группировка: %c[default]"..community[oVictim:character_community()].."\\n%c[255,160,160,160]Локация: %c[default]"..level_name[level.name()]..""
local shans = math.random(1,100)
local comment_text = death_komment[math.random(table.getn(death_komment))]

if oVictim and IsStalker(oVictim) and shans>27 then
news_manager.send_tip(db.actor, necrolog_text , math.random(1,4), "necrolog", nil, nil)
-- xr_sound.set_sound_play(db.actor:id(), "Info")
if shans>70 then
news_manager.send_tip(db.actor, death_komment , math.random(1,4), "necrolog", nil, nil)
end
end
end
-- Сообщение о гибели сталкеров

 

--[[-----------------------------------------------------------------------------------------------
File : xr_death.script
Description: Scheme shows, what's happen when NPC dies
Copyright : 2004 © GSC Game World
Author : GSC Game World
Last edit : 21.07.2013 [...]
--]]-----------------------------------------------------------------------------------------------

--/ -----------------------------------------------------------------
--/ VARIABLEs
--/ -----------------------------------------------------------------
local sModule = script_name()
--/ -----------------------------------------------------------------
local log = function(fmt,...) _G.log(sModule..":"..tostring(fmt),...) end
--/ -----------------------------------------------------------------
--/ CONSTRUCTION SCHEME
--/ -----------------------------------------------------------------------------------------------
--/ Action
--/ -----------------------------------------------------------------------------------------------
class "action_process_death"
--/ ---------------------------------------------
function action_process_death:__init(obj, st)
self.object = obj
self.st = st
self.log = st.log
end
--/------------------------------------------------------------------
--/ CALLBACK
--/------------------------------------------------------------------
function action_process_death:death_callback(oVictim, oWho)
news_death_stalker.necrolog(oVictim, oWho) -- Некролог в общий канал
if self.log then log("death_callback:NPC=[%s],Killer=[%s]:(%s)", oVictim and oVictim:name(), oWho and oWho:name(), ">") end --/#~#
if oWho then
-- log("death_callback:Victim=[%s],Id=[%s]<~killed_by=[%s]", oVictim:name(), oVictim:id(), oWho:name(), "") --/#~#
self.st.killer = oWho:id()
self.st.killer_name = oWho:name()

if self.st.killer == idActor then
xr_statistic.addKillCount(self.object)
end
--/ giving a small impulse forward.
local h = hit()
h.draftsman = self.object
h.type = hit.fire_wound
h.direction = oWho:position():sub(self.object:position())
h:bone("bip01_spine")
h.power = 1
h.impulse = 10
self.object:hit(h)
else
log("death_callback:Victim=[%s]<~killed_by=[unknown]:<%s>", oVictim and oVictim:name(), "Info!")
self.st.killer = -1
end

if self.st.info then
if self.log then log("death_callback:NPC=[%s],info=[%s]", self.object:name(), self.st.info, "") end --/#~#
xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.info)
end
if self.st.info2 then
if self.log then log("death_callback:NPC=[%s],info2=[%s]", self.object:name(), self.st.info2, "") end --/#~#
xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.info2)
end

--xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) --/#x#

smart_terrain.on_death( self.object:id() )
end
--/ -----------------------------------------------------------------------------------------------
--/ BINDER
--/ -----------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, st)
--log("add_to_binder:NPC=[%s],scheme=[%s],section=[%s]:(%s)", npc:name(), scheme, section, ">") --/#~#
st.action = this.action_process_death(npc, st)
end
--/------------------------------------------------------------------
--/ SET SCHEME
--/------------------------------------------------------------------
function set_scheme(npc, ini, scheme, section, gulag_name)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
--/ registration of action, for call of 'callback' and method 'reset_scheme' when changing scheme settings:
xr_logic.subscribe_action_for_events(npc, st, st.action)
--/ fot debug:
if st.log then log("set_scheme:NPC=[%s],scheme=[%s],section=[%s],gulag=[%s]", npc:name(), scheme, section, gulag_name, "") end --/#~#
end
--/------------------------------------------------------------------
--/ RESET SCHEME
--/------------------------------------------------------------------
function reset_scheme(npc, scheme, stor, section)
if stor.log then log("reset_death:NPC=[%s],scheme=[%s],section=[%s]:(%s)", npc and npc:name(), scheme, section, ">") end --/#~#
local scheme_section = Get_Cfg_String(stor.ini, stor.section_logic, "on_death")
if scheme_section and npc then
local info_section = Get_Cfg_String(stor.ini, scheme_section, "on_info")
if info_section then
stor.death.info = xr_logic.parse_condlist(npc, scheme_section, "death", info_section)
end
local info_section2 = Get_Cfg_String(stor.ini, scheme_section, "on_info2")
if info_section2 then
stor.death.info2 = xr_logic.parse_condlist(npc, scheme_section, "death", info_section2)
end
if stor.log then log("reset_death:NPC=[%s],on_death=[%s],on_info=[%s/%s]", npc and npc:name(), scheme_section, info_section, info_section2, "") end --/#~#
end
end
--/------------------------------------------------------------------
--/ REDIRECTs (for compatibility, later delete)
--/------------------------------------------------------------------
function set_death(...)
set_scheme(...)
end
function reset_death(...)
reset_scheme(...)
end
--/ --------------------------------------------------------------------------------

 

Expression : fatal error
Function : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetByIndex
File : x:\stalker\xray-svn-trunk\xr_3da\xrgame\ini_id_loader.h
Line : 147
Description :
Arguments : item by index not found in section game_relations, line communities

 

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


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

naxac в xr_motivator нет совсем никаких callback. Скрипты ЛА очень сильно отличаются

--[[ ----------------------------------------------------------------------------------------------


File : xr_motivator.script
Description: Motivator binding
Copyright : 2004 © GSC Game World
Author : Didenko Ruslan (Stohe)
Editors : ...
Last edit : 15.06.2013 [...]
--]] ----------------------------------------------------------------------------------------------

--/ -----------------------------------------------------------------
--/ VARIABLEs
--/ -----------------------------------------------------------------
local sModule = script_name()
--/ -----------------------------------------------------------------
local log = function(fmt,...) _G.log(sModule..":"..tostring(fmt),...) end
--/ -----------------------------------------------------------------
--/ Conditions array (evaluators), which have highest priority, and, accordinly, interrupt other scripts/schemes.
--/ -------------------------
tMainProperties = {
[1] = { stalker_ids.property_alive, true }, --/ NPC alive
[2] = { stalker_ids.property_enemy, false}, --/ no enemies
[3] = { stalker_ids.property_danger, false}, --/ no danger
[4] = { stalker_ids.property_anomaly, false} --/ no anomalies
}
tCommonProperties = {
[1] = { xr_evaluators_id.sidor_wounded_base, false }, --/ not wounded
[2] = { xr_evaluators_id.chugai_heli_hunter_base, false }, --/ don't see helicopters
[3] = { xr_evaluators_id.abuse_base, false }, --/ not offended
[4] = { xr_evaluators_id.stohe_meet_base +1, false } --/ no talk
}
tDynamicProperties = {} --/#+#
--/------------------------------------------------------------------------------------------------
--/ Process
--/------------------------------------------------------------------------------------------------
function addCommonProperty( tProperty )
if type(tProperty) == 'table' then
table.insert( tCommonProperties, tProperty )
end
end

function addDynamicProperty( tProperty )
if type(tProperty) == 'table' then
table.insert( tDynamicProperties, tProperty )
end
end

--/ -----------------------------------
function addMainPrecondition( oAction )
for _,v in ipairs (tMainProperties) do
oAction:add_precondition( world_property(v[1],v[2]) )
end
end

function addCommonPrecondition( oAction )
for _,v in ipairs (tCommonProperties) do
oAction:add_precondition( world_property(v[1],v[2]) )
end
end

function addGeneralPrecondition( oAction )
addMainPrecondition( oAction )
addCommonPrecondition( oAction )
end

--/#+#
function addDynamicPrecondition( oAction )
for _,v in ipairs (tDynamicProperties) do
-- log("addDynamicPrecondition: %s idEv=[%s], flg=[%s]", oAction.object and oAction.object:name(), v[1], v[2], "") --/#~#
oAction:add_precondition( world_property(v[1],v[2]) )
end
end

function addAllPrecondition( oAction )
addMainPrecondition( oAction )
addCommonPrecondition( oAction )
addDynamicPrecondition( oAction )
end
--/ -----------------------------------------------------------------------------------------------

 

Мысль твоя мне понятна попробую отследить где еще можно сделать вызов функции

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


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

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