Пользователей: 1
Гостей: 1440
Всего: 1441

» Подробно
» Сегодня

Привет, гость!









Автор Сообщение
Darkscape
    
Посты: 692
Откуда: Якутск
Возраст: 27
14-11-2010 03:47 GMT3 час. #1382767   
СидырыЧЪ
Я в этом файле ничего не правил.Правил только конфиги и пару текстур.


Alex-San
    
Посты: 1015
Откуда:
Возраст: 51
14-11-2010 03:54 GMT3 час. #1382769   

# Artos :
... Вначале чешем затылок, потом читаем/учим азбуки...


Где ты видел эти азбукИ по Сталкеру!?
Единственная Сталкер-ВИКИ с Гейминатора, и та хромает на все четыре лапы.


СидырыЧЪ
    
Посты: 208
Откуда:
Возраст: 30
14-11-2010 09:52 GMT3 час. #1382810   
Darkscape
Напиши, что ты именно правил в конфигах может дело вообще в одной запятой или еще в чем нибудь.


Horrible area mod Видео в журнале
--------------------------------------------------------------------
Важнейшая задача цивилизации - научить человека мыслить
Struck
    
Посты: 1946
Откуда:
Возраст:
14-11-2010 12:01 GMT3 час. #1382892   
Леня_Агитатор это был сарказм, читайте туторы - и смотрите инвентари других модов, научитесь...возможно

TheDoktor я конечно с амк ни в каких случаях не связываюсь, но ты точно поставил вызовы "as is" в самой фенечке?

Alex-San хромает не азбука - а мозги, я там научился многому:dry:...в своё время(уж банально править конфиги и писать квесты - точно), а там ещё не было той информации что есть сейчас...

Если вы не учите основы луа(вызовы скриптов, операции самого языка) то никто в этом не виноват(кстати если на lua.ru сидите, то читайте только первые 2 пункта, в сталкере кастрированный луа)

СидырыЧЪ включи мозг и догадайся:-)...вот наглядный пример кормления с ложечки, даже файлы для редактирования подбирать просят...попытайтесь что-то сделать сами!

Artos а точнее не "цитатки", а коды в которых они как-бы шарят...вот из таких туторных кодов и получаются новые псевдоуникальные глобалки...


Снова в строю.

l
СидырыЧЪ
    
Посты: 208
Откуда:
Возраст: 30
14-11-2010 15:38 GMT3 час. #1383046   
Struck
Я пробовал, но текстуры друг на друга накладываются. Где то я напортачил, ща посмотрю.


Horrible area mod Видео в журнале
--------------------------------------------------------------------
Важнейшая задача цивилизации - научить человека мыслить
Artos
    
Посты: 4176
Откуда:
Возраст: 65
14-11-2010 16:13 GMT3 час. #1383074   
Alex-San
Нельзя же так буквально навешивать себе же шоры! 'Затылки' тоже как-то не фигурируют в тематике Сталкера. :-G
В моих словах ни слова ни намека на именно 'Сталкер'.
Тебе может быть было бы понятнее иной смысловой синоним 'RTF'ы иль 'мануалы' по программированию, но в данном контексте я употребил именно этот.
Если кодоковырялкин допускает ошибки в синтаксисе языка программирования, то не в статьях иль ФАК'ах по Сталкеру следует искать правила употребления простейших операторов и пр. , а именно в 'азбуках' (мануалах по LUA и ему подобным языкам).

Леня_Агитатор
В словах Struck'а основные смысловые это: 'активная область'.
Если сразу не смог понять сказанного, попробуй взглянуть пошире ...
У тебя на рабочем столе вероятно немало иконок. Что происходит, когда курсор мышки попадает в ... область какой-то иконки? Она и цвет может поменяеть, и некий квадратик фоном выделяется, и кликнув по иконке ты можешь запустить некую програмку. Т.о. область иконки активна, т.е. при попадании в некую ограниченную область иконки курсора от мышки, эта область активизируется и происходят некие действия.
Можешь другой пример взять, например с активными ссылками. Они тоже подчеркиваются/подцвечиваются при наведении на них мышки и кликнув по ней, что-то происходит.
А теперь подумай, что произойдет, если область той же иконки ограничена, например, квадратиком 48х48, а ты нарисовал иконку 48х96? Если ОС не ужмет твою иконку в выделенный квадрат (активную область!) то твой 'хвостик' вылезет за пределы квадратика. Будет ли при попадании мышки на твой 'хвостик' реагировать на что-то 'активная область иконки'?

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


Struck
Под 'цитатами' и подразумевал 'куски кодов из туторов' ...
Как то уже писал о том, что попытки псевдо-мододелов писать свои 'романы/рассказы', используя в основном только кем-то написанные статьи/туторы/... ни к чему кроме аля "Ма-ма мы-ла ра-му" не приводят.

отредактировал(а) Artos: 14-11-2010 17:00 GMT3 час.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
14-11-2010 16:33 GMT3 час. #1383087   

# Struck :
...читайте только первые 2 пункта, в сталкере кастрированный луа


Тут как сказать.
В своё время, после изучения Luа-модулей, у меня отпал вопрос о том, как работают файлы в папке script. Почему вызовы строятся по принципу файл.функция()
Конечно это работа toLuа или подобного биндера, не суть важно. Главное что понимание всё-таки приходит.
А ведь сам видишь сколько людей попадаются на вызовах функций из файлов.
Р.S.
Кстати такие вызовы мне не нравятся.
В своих проектах использую метатаблицы с соответствующими методами, и обвязываю модули для прямого доступа к функциям.


Не стань номинантом премии Дарвина.
monohrom
    
Посты: 19
Откуда: Ульяновск
Возраст: 29
14-11-2010 16:38 GMT3 час. #1383089   
Кто знает где можно взять мод для Сталкера Тени Чернобыля в котором будет очень много зомби и мутантов ( пишите название мода,очень надо мне)


У Сталкера жизнь вечна,в Зоне,но без зоны ему хана.
Artos
    
Посты: 4176
Откуда:
Возраст: 65
14-11-2010 16:48 GMT3 час. #1383094   
monohrom
Тебе сюда: <Поиск модификаций и модмейкерских утилит>


Gun12: В своих проектах использую метатаблицы с соответствующими методами, и обвязываю модули для прямого доступа к функциям
Ну наверное комбинация и прямых и косвенных вызовов для уже имеющегося в игре контента все же для многих более удобна. :-)
Но не суть.
Тут темка как раз касательно прямых вызовов/доступов похоже наклюнулась.
Похоже, что не все просто с папкой 'script' (и даже $game_scripts$) и использования метfатаблиц.
При использовании в модах папки 'mods' с паками *.xdb* я, например, натолкнулся на невозможность добавлять/менять уже в процессе игры в метатаблицы скриптов из этих паков.
Т.е. попытка через 'setfenv(module["my_func"],module)' ни к чему не приводит, если 'module' имеется в паке '\mods\*.xdb*'. Хотя если 'module' только в распакованной 'gamedata', то все работает как дОлжно.

отредактировал(а) Artos: 14-11-2010 16:58 GMT3 час.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Mr House
    
Посты: 23
Откуда:
Возраст:
14-11-2010 17:29 GMT3 час. #1383110   
Люди вопрос - а в ТЧ тушканы вырезанны?


Набор в команду Big-Bang Team. Связаться со мной можно по асе 603426130 или пм на сайте.
win win
    
Посты: 258
Откуда: о_О
Возраст: 12
14-11-2010 17:56 GMT3 час. #1383135   
Mr House нет


Мои модельки NEW!
TheDoktor
    
Посты: 3814
Откуда: Керчь
Возраст: 37
14-11-2010 17:57 GMT3 час. #1383137   
Всё, не могу! Я упёрся в тупик! Никак не могу сделать что бы заработало это оживление трупов. В описании написано

в файл bind_stalker.script :
после строки : amk_utils.actor_item_drop(obj)
добавляем : tag_spb.refresh_zombie_team (self.object,obj)

Но у меня совершенно другой bind_stalker.script , в нём нет стро**500140b7e12bf63c3891**on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
amk.on_item_drop(obj)
inventory.on_item_drop(obj)

tag_spb.refresh_zombie_team (self.object,obj)

end[/code]
Я уже со вчерашнего вечера шаманю, подскажите куда прописать эту строку tag_spb.refresh_zombie_team (self.object,obj) Если нужен мой bind_stalker.script , см. под спойлер.
[code]function show_time()
local hud = get_hud()

hud:AddCustomStatic("hud_time_tex", true)

hud:AddCustomStatic("hud_show_time", true)
local cs = hud:GetCustomStatic("hud_show_time"):wnd()
cs:SetText("Время:")

local time_h = sr_timer.time2str(level.get_time_hours())
local time_m = sr_timer.time2str(level.get_time_minutes())
hud:AddCustomStatic("hud_timer_text1", true)
cs = hud:GetCustomStatic("hud_timer_text1"):wnd()
cs:SetText(time_h.." "..time_m)

hud:AddCustomStatic("hud_timer_text2", true)
cs = hud:GetCustomStatic("hud_timer_text2"):wnd()
cs:SetText(":")
end

function init (obj)
xr_motivator.AddToMotivator(obj)
end

function actor_init (npc)
npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}

lasthealth = 0
lasttime = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.WeatherManager()
self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
printf("actor net spawn")

level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
return false
end

db.add_actor(self.object)

if self.st.disable_input_time == nil then
level.enable_input()
end

self.weather_manager:reset()
-- game_stats.initialize ()

if(actor_stats.add_to_ranking~=nil)then
actor_stats.add_to_ranking(self.object:id())
end

--' Загружаем настройки дропа
death_manager.init_drop_settings()

amk.on_game_load()

if xrs_ai then xrs_ai.actor_net_spawn(self) end

return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
-- game_stats.shutdown ()
db.del_actor(self.object)

sr_light.clean_up ()

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
--self.object:set_callback(callback.actor_sleep, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)

if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end

xr_sound.stop_all_sound_object()

object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
object_binder.reinit(self)

local npc_id = self.object:id()

db.storage[npc_id] = { }

self.st = db.storage[npc_id]
self.st.pstor = nil

self.next_restrictors_update_time = -10000

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
local story_id = box:story_id()
if story_id == nil then
return
end

treasure_manager.take_item_from_box(box, story_id)
--[[
local respawner = se_respawn.get_respawner_by_parent(story_id)
if respawner == nil then
return
end

--' Необходимо уменьшить счетчик в респавнере
respawner:remove_spawned(item:id())

local smart_terrain = db.strn_by_respawn[respawner:name()]
if smart_terrain == nil then
return
end

local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
if npc ~= nil then
xr_sound.set_sound_play(npc, "reac_box")
xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)
end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
level_tasks.process_info_portion(info_id)
inventory.on_inventory_info(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
if sell_bye == true then
game_stats.money_trade_update (money)
else
game_stats.money_trade_update (-money)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name, article_type)
--printf("article_callback [%s][%s]", group, name)
if device().precache_frame >1 then return end

if group == "Diary" then
news_manager.send_encyclopedy("diary", group)
amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7)
elseif group == "Mutants" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Заметка о мутантах:", nil, 7)
elseif group == "Social" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Информация о группировке:", nil, 7)
elseif group == "Artifacts" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Заметка об артефактах:", nil, 7)
elseif group == "Anomalies" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Заметка об аномалиях:", nil, 7)
elseif group == "Locations" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Информация о локации:", nil, 7)
elseif group == "Zone-story" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "История Зоны:", nil, 7)
elseif group == "Stories" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Местный фольклор:", nil, 7)
elseif group == "memuars" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Личная заметка:", nil, 7)
elseif group == "Found_PDA" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Скачаны данные:", nil, 7)
elseif group == "st_operation_agroprom" or group == "LabX18_information" or group == "aes_military_task" then
news_manager.send_encyclopedy("encyclopedy", group)
amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
level_tasks.proceed(self.object)
--game_stats.update_take_item (obj, self.object)
if xrs_ai then xrs_ai.actor_item_take(obj) end
if obj:clsid() == clsid.wpn_ammo then
dunin_ammo.on_take(obj)
end
inventory.on_item_take(obj)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
amk.on_item_drop(obj)
inventory.on_item_drop(obj)

end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
if _objective:get_idx() == 0 then
if _state == task.fail then
news_manager.send_task(db.actor, "fail", _task, _objective)
elseif _state == task.completed then
task_manager.reward_by_task(_task)
news_manager.send_task(db.actor, "complete", _task, _objective)
else
news_manager.send_task(db.actor, "new", _task, _objective)
end
else
if _task:get_objective(0):get_state() == task.in_progress then
news_manager.send_task(db.actor, "update", _task, _objective)
end
end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
if (false==app_ready()) or (device().precache_frame>1) then return end
--'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
object_binder.update(self, delta)

-- DEBUG slowdown
-- slowdown.update()

local time = time_global()

game_stats.update (delta, self.object)

-- Обновление сна
if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then
xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update")
end

-- апдейт погоды
self.weather_manager:update()

-- апдейт схемы детектора
self.actor_detector:update()

-- апдейт звуковой схемы актера
xr_sound.update_actor()

--' Проверка потери жизни
--[[
if self.object.health - lasthealth > 0.001 or
self.object.health - lasthealth < -0.001 then
printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
lasthealth = self.object.health
lasttime = game.time()
end
]]
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end
-- Обновление сна с переносом чувака в указанную позицию
if self.st.sleep_relocate_time ~= nil and
game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle
then
self.object:set_actor_position(self.st.sleep_relocate_point)
local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
self.object:set_actor_direction(dir:getH())
self.st.sleep_relocate_time = nil
end

-- Апдейт прятание оружия игрока во время диалога
if weapon_hide == true or self.object:is_talking() then
if self.weapon_hide == false then
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
self.object:restore_weapon()
self.weapon_hide = false
end
end

-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
if self.next_restrictors_update_time < time then
bind_restrictor.actor_update(delta)

self.next_restrictors_update_time = time + 200

task_manager.actor_update()
end

-- обновление постпроцессов
if post_process ~= 0 then
if post_process:update () == true then
post_process = 0
end
end

-- обновление пси-антенны
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end

-- Обновление инвентаря
inventory.update()

--' Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static == nil then
hud:AddCustomStatic("cs_radiation_danger", true)
hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_radiation_danger")
if custom_static ~= nil then
hud:RemoveCustomStatic("cs_radiation_danger")
end
end

-- Обновление шкалы радиации
if (ui_rad and self.object) then
ui_rad.update(self.object)
end

-- Запускаем затычку от возможной потери содержимого тайников
treasure_manager.get_treasure_manager():loss_workaround()


if self.bCheckStart then
printf("SET DEFAULT INFOS")

if not has_alife_info("storyline_actor_start") and
(level.name() == "l01_escape")
then
self.object:give_info_portion("storyline_actor_start")
_G.g_start_avi = true
printf("*AVI* RUN START AVI")
end

-- if not has_alife_info("encyclopedy") then
-- self.object:give_info_portion("encyclopedy")
-- end

if not has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end

if not has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end

level_tasks.add_lchanger_location()

self.bCheckStart = false
end

-- Обновление актора
amk.on_actor_update()

-- Обновление АИ-пака
if xrs_ai then xrs_ai.actor_update(delta) end

-- Обновление упаковщика патронов
if not self.object:is_talking() then
dunin_ammo.on_update()
end

-- Обновление биодетектора
if biodetector then biodetector.update() end

-- Отображение времени
show_time()

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
local pk1 = fake_net_packet.fake_net_packet()
self:save_old(pk1)
--get_console():execute("Packet_size_is_"..pk1:w_tell())
if pk1:w_tell()>7500 then
ogsm_debug.clean_pstor()
end
self:save_old(packet)
end

function actor_binder:save_old(packet)


local save_treasure_manager = true

printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
object_binder.save(self, packet)

--' Сохраняем уровень сложности
if save_treasure_manager == true then
packet:w_u8(level.get_game_difficulty() + 128)
else
packet:w_u8(level.get_game_difficulty())
end


--' Сохраняем данные об отключенном вводе
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packer:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end

xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)

sr_psy_antenna.save( packet )

if save_treasure_manager == true then
treasure_manager.save(packet)
end

task_manager.save(packet)
self.actor_detector:save(packet)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
object_binder.load(self, reader)
printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

--' Загружаем уровень сложности
local game_difficulty = reader:r_u8()

local load_treasure_manager = false
if game_difficulty >= 128 then
game_difficulty = game_difficulty - 128
load_treasure_manager = true
end


get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

if reader:r_eof() then
abort("SAVE FILE IS CORRUPT")
end

local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end

xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)

sr_psy_antenna.load(reader)

if load_treasure_manager == true then
treasure_manager.load(reader)
end


task_manager.load(reader)
self.actor_detector:load(reader)
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
-- sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
weapon_hide = true
end
function restore_weapon()
weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
printf ("file : %s",file_name)
printf ("section : %s",section_name)

local file = ini_file(file_name)
local n = file:line_count(section_name)
printf ("lines : %d",n)

local id, value = "", "", result
for i=0,n-1 do
result, id, value = file:r_line(section_name,i,"","")
printf ("line %d : %s = %s",i,id,value)
end
end

test_section_iteration("system.ltx","space_restrictor")
/**/[/code]



Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.

Artos
    
Посты: 4176
Откуда:
Возраст: 65
14-11-2010 18:22 GMT3 час. #1383161   
TheDoktor
Ты бы лучше не куски своих недопонималок показывал бы, а дал бы ссылку на 'где почитать' иль всю readme про то, что хочешь добавить иль сам доп.мод (т.е. его коды).

Вот это: 'tag_spb.refresh_zombie_team (self.object,obj)' - нав


"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
TheDoktor
    
Посты: 3814
Откуда: Керчь
Возраст: 37
14-11-2010 18:54 GMT3 час. #1383181   
Artos Это мод "фенечка" с амк форума, оживляет трупы после выброса. Вот описание:

1. gamedata\scripts\amk.script, amk_mod.script и новый tag_spb.script :
часть трупов NPC преобразуется (с нек.вероятностью) в зомби. При этом:
* выбрасывается весь хабар трупа
* зомби пытаются выглядеть так,как выглядел NPC-оригинал
* "оживают" только Respawn-NPC, квестовые NPC не оживают
* в подземельях, на Кордоне и Свалке трупы не оживают

А вот как вставлять в другие моды:

в файл : amk_mod.script
после строки 1001 : amk.del_variable("blowout")
добавляем : tag_spb.zombie_team()

в файл bind_stalker.script :
после строки : amk_utils.actor_item_drop(obj)
добавляем : tag_spb.refresh_zombie_team (self.object,obj)
и добавлены строки 369-387 (еда от радиации)

в файл amk.script :
после строки : --user area
добавляем :
if select_string=="tag_trup_to_zombie" then
tag_spb.trup_to_zombie(params_string)
end

в файле xr_wounded.script испр.строка 514 :
if npc_id and db.storage[npc_id].wounded ~= nil then

Первые два действа я сделал, на третьем, как видишь споткнулся, а четвёртый пункт... я такой строки не нашёл даже в конфиге "фенечки", правда он там один в один как у меня.


Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.

Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
14-11-2010 19:28 GMT3 час. #1383213   

# Artos :'setfenv(module["my_func"],module)'


Что-то не понял этой конструкции.
Зачем для функции my_func, уже находящейся в

отредактировал(а) Gun12: 15-11-2010 14:21 GMT3 час.

Не стань номинантом премии Дарвина.
Mr House
    
Посты: 23
Откуда:
Возраст:
14-11-2010 20:17 GMT3 час. #1383263   
Люди может мне кто нибудь дать ссылочку на болота из билда 1935?? очень надо. Заранее спасибо всем!


Набор в команду Big-Bang Team. Связаться со мной можно по асе 603426130 или пм на сайте.
Artos
    
Посты: 4176
Откуда:
Возраст: 65
14-11-2010 21:06 GMT3 час. #1383301   
Gun12
Конструкция уже довольно стара, применяется до сих пор в модах н

отредактировал(а) Artos: 14-11-2010 21:31 GMT3 час.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
14-11-2010 21:48 GMT3 час. #1383333   
Вот и нашлось =)
local(!!!) module...
На телефоне плохо читать, поэтому придется попотеть с "осознаванием". Хотя я бы не стал называть переменную именем глобальной функции.
Вроде и не имеет значения, но ...
Всё, разбираю код.


Не стань номинантом премии Дарвина.
Artos
    
Посты: 4176
Откуда:
Возраст: 65
14-11-2010 21:57 GMT3 час. #1383338   
Gun12
'module' - это рудиментарное ...
Тоже стараюсь избегать и переименовываю по мере ...
В ори**500140b7e12bf63c3891**1, _G)
for k,v in pairs(tFuncG) do
_G[k] = v
setfenv(_G[k], _G)
end
[/code] - не меняет того, о чем выше писал.


"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
14-11-2010 22:08 GMT3 час. #1383344   
Это понятно что не меняет.
Просто сначала не совсем ясно было с этим module.
Теперь, когда вижу код, всё становится на свои места.
Разбираю дальше.


Не стань номинантом премии Дарвина.
Вовка карп
    
Посты: 807
Откуда: Пятигорск
Возраст: 28
14-11-2010 23:28 GMT3 час. #1383396   
Народ скажите как в тч сделать чтобы при начале новой игры появлялось окошко в котором игрок мог-бы вводить любое имя персонажа.


Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
15-11-2010 00:23 GMT3 час. #1383429   
Artos
Интересно, а что возвращает getfenv?
Если поставить тестовую функцию и в ней установить окружение и по уровню стека (setfenv(1, this)) и по имени функции (setfenv(имя тестовой функции, this)). И посмотреть на результат getfenv с аргументами 1 и именем тестовой функции.
Подозреваю что для распакованной и запакованной gamedata первый уровень будет разный.
Может по имени найдет нужный уровень.
Или по другому номеру уровня.
???

отредактировал(а) Gun12: 15-11-2010 00:32 GMT3 час.

Не стань номинантом премии Дарвина.
Artos
    
Посты: 4176
Откуда:
Возраст: 65
15-11-2010 00:51 GMT3 час. #1383437   
Gun12
Не смогу пока уточнить. Только завтра к вечеру.
Столкнулся этой непоняткой в такой, например, ситуации:
Уже немало появилось модов, где используются мод-паки типа *.xdb*.
Потребовалось взглянуть на некоторые подробности 'изнутри', то бишь вывести в лог техн.инфу.
Как "принято" в моде выводы в лог кастрированы. Дабы не нарушать исходных файлов, подцепил небольшой фиксик с функцией пополнения _g.script удобным выводом в лог.
Так вот все нормально получилось на распаке. А вот запаковав - получил облом.
Сильно не стал пока углубляться ...
Вот эту фразу непонял:

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


"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
15-11-2010 01:11 GMT3 час. #1383444   
Я имел в виду, что (предполагаю) для запакованных файлов на пути между стеком и (например) функцией стоит (опять же например) распаковщик
Пока за неимением лучших версий буду предполагать хоть что-нибудь.
Может методом исключений и получится добраться до чего-то более вразумительного.
...
Второй твой описанный случай добавил почву для размышлений.
Уточни пожалуйста.
1.(банально звучит, но тем не менее) Из пака был взят отдельный скрипт файл, и в нём изменена функция?
2. Был создан новый скрипт файл с этой единственной функцией?
3. Как то ещё?

отредактировал(а) Gun12: 15-11-2010 01:29 GMT3 час.

Не стань номинантом премии Дарвина.
Artos
    
Посты: 4176
Откуда:
Возраст: 65
15-11-2010 01:23 GMT3 час. #1383447   
Gun12
Если бы не тот факт, что распаковка по-идее должна происходить при первом же обращении к файлу/модулю и далее этот модуль попадает в метатаблицы и более не переписывается из распаковки, то все было бы понятно. Но ... в том то и дело, что как писал выше, такое впечатление что и далее это модуль постоянно берется из пака, а не из 'уже общего ресурса'.
Просто ты про папку скриптов и метатаблицы помянул в своем посте, вот и подумал, а не наталкивался ли на данную особенность и ... может даже обошел ее?! :-)
(Завтра, уже сегодня продолжу изыскания. Может добавится информации.)

P.S.
- Из пака брался 'bind_stalker.script'.
- в нем уже имеется функция (например 'function new_update(...)' ).
- Эта функция подменялась на другую, с тем же самым именем. По сути просто в функцию добавлялась еще одна строка. Функция не в 'классе'.

отредактировал(а) Artos: 15-11-2010 01:36 GMT3 час.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
Gun12
    
Посты: 773
Откуда: СССР
Возраст: 52
15-11-2010 01:31 GMT3 час. #1383449   
Теперь из принципа буду пробовать.
Если что получится - сообщу.


Не стань номинантом премии Дарвина.
TheDoktor
    
Посты: 3814
Откуда: Керчь
Возраст: 37
15-11-2010 01:34 GMT3 час. #1383451   
Artos я обратил внимание на твою подсказку и таки добился (вроде бы) вызова tag_spb.refresh_zombie_team (self.object,obj) в**500140b7e12bf63c3891** tag_spb.refresh_zombie_team (self.object,obj)
g_start_timer("bl6",0,0,5)
end[/code]
Вызвать, вызвал, но в качестве бонуса получил выкидыш, вот:
[code]Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...publishing\s.t.a.l.k.e.r\gamedata\scripts\amk.script:290: attempt to index global 'self' (a nil value)[/code]
Выкидывает в аккурат посреди выброса.


Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.

Artos
    
Посты: 4176
Откуда:
Возраст: 65
15-11-2010 01:39 GMT3 час. #1383453   
TheDoktor
Опять тебя подводит плохое понимание/чтение логов.
Тебе же лог говорит, что 'self' не определен.
Т.е. вот это: tag_spb.refresh_zombie_team (self.object,obj) и причина твоих проблем.

Хм. Это что ж у тебя за amk.script, в котором и выброс, да еще и 'ogsm_surge.g_R_Vibros:Run()'? Сей код мне неведом и по куску судить невозможно.

Однозначно ты что-то перепутал.
Я так понимаю, что тот, кто писал инструкцию по подключению своего мода ориентировался на AMK'шный код/файл, а не на солянку в этом файле.
Извини, но погадалками в потемках не занимаюсь.
Линк на первоисточник или я пас.

отредактировал(а) Artos: 15-11-2010 01:55 GMT3 час.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..." ©Машина времени
TheDoktor
    
Посты: 3814
Откуда: Керчь
Возраст: 37
15-11-2010 02:02 GMT3 час. #1383462   
Artos вот мой amk.script, он OGSM'овский, а в мини моде, как ты правильно сказал АМК'ашный. Как ты сам понимаешь, из АМК в OGSM хрен что перетянешь, вот я и ломаю голову.
------------------- Библиотека служебных скриптов для OGSM 2.x ----------------

---------------------- Copyright 2007-2008 xStream & DEXXX --------------------


local npc_spawner={}
local timers={}
local g_timers={}
local markers={}
local x_objs={}
local timer_trigger=nil
wthr = level.get_weather()
local wfx1 = "p_surge_day_"..tostring(level.get_time_hours())
local wfx2 = "surge_day_"..tostring(level.get_time_hours())

-- Переменные для типсов
pda_news = xr_sound.get_safe_sound_object([[device\pda\pda_news]])
pda_tips = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])
pda_task = xr_sound.get_safe_sound_object([[device\pda\pda_objective]])

tips_icons = {
default = { 82, 282},
trader = { 332, 893},
dolg = { 0, 658},
freedom = { 0, 658},
ecolog = { 498, 0},
arena = { 332, 141},
stalker = { 0, 658},
krot = { 332, 47},
barman = { 332, 235},
wolf = { 332, 940},
o_soznanie = { 498, 893},
monolith = { 0, 658},
saharov = { 332, 470},
prizrak = { 0, 658},
killer = { 0, 658},
death = { 0, 752}
}


-- Лог данных
local bufferedmessages={}
function mylog(msg)
if msg==nil then
return
end
if db and db.actor then
if bufferedmessages then
for k,v in ipairs(bufferedmessages) do
db.actor:give_game_news(v, "ui\\ui_iconsTotal", Frect():set(0,658,83,47), 0, 15000)
end
bufferedmessages=nil
end
db.actor:give_game_news(msg, "ui\\ui_iconsTotal", Frect():set(0,658,83,47), 0, 15000)
else
if bufferedmessages then
table.insert(bufferedmessages,msg)
end
end
if get_console() then
-- get_console():execute("load "..msg)
-- get_console():execute("flush")
end
end


-- Показ типса
function send_tip(news_text, header, timeout, showtime, sender, sound)
if news_text==nil then return end
if header==nil then header=game.translate_string("st_tip") end
if timeout == nil then timeout = 0 end
if showtime == nil then showtime = 5 end

local player
if sound=="news" then
player=pda_news
elseif sound=="task" then
player=pda_task
else
player=pda_tips
end

--' Играем дефолтный звук
player:play(db.actor, timeout, sound_object.s2d)

if sender == nil then
sender = "default"
end
local x = tips_icons[sender][1]
local y = tips_icons[sender][2]

local news_text = "%c[255,160,160,160]"..header.."\\n".."%c[default]"..news_text
db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(x,y,83,47), timeout*1000, showtime*1000)
return true
end


-- Старт таймера в реальном времени
function start_timer(name,delay,action)
if not delay then
return false
end

if not action then
action = ""
end

local time = game.time() --time in seconds since 1970
local a=1
while db.storage[db.actor:id()].pstor["rt"..a] do
a=a+1
if a>100 then
return false
end
end

save_variable("rt"..a, name)
save_variable("rt"..a.."d", time+delay*10000)
save_variable("rt"..a.."p", action)

return true
end


-- Старт таймера в игровом времени
function g_start_timer(name,delay_d,delay_h,delay_m,action)
local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes() --time in game minutes
if delay_d==nil or delay_h==nil or delay_m==nil then
return false
end

if action==nil then
action = ""
end

local a=1
while db.storage[db.actor:id()].pstor["gt"..a] do
a=a+1
if a>100 then
return false
end
end

save_variable("gt"..a, name)
save_variable("gt"..a.."d", time+delay_d*60*24+delay_h*60+delay_m)
save_variable("gt"..a.."p", action)

return true
end


-- Проверка таймеров, использует 3 следующие за ним функции для выбора действия
function check_timers()
local tmp
for a=1,100,1 do
tmp=load_variable("rt"..a,nil)
if tmp~=nil then
__timer_found(a)
end
end

for a=1,100,1 do
tmp=load_variable("gt"..a,nil)
if tmp~=nil then
__g_timer_found(a)
end
end
end
function __timer_found(idx)
local time = game.time() --time in seconds since 1970
local name,params
if load_variable("rt"..idx.."d", nil)<=time then
name=load_variable("rt"..idx, nil)
params=load_variable("rt"..idx.."p", nil)
del_variable("rt"..idx)
del_variable("rt"..idx.."d")
del_variable("rt"..idx.."p")
__do_timer_action(name,params)
return true
end
return false
end
function __g_timer_found(idx)
local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes() --time in game minutes
local name,params
if load_variable("gt"..idx.."d", nil)<=gtime then
name=load_variable("gt"..idx, nil)
params=load_variable("gt"..idx.."p", nil)
del_variable("gt"..idx)
del_variable("gt"..idx.."d")
del_variable("gt"..idx.."p")
__do_timer_action(name,params)
return true
end
return false
end
function __do_timer_action(select_string,params_string)

local a

if select_string=="slp" then
sleep_manager.test_for_need_sleep()
end
if select_string=="nrg" then
sleep_manager.test_for_need_sleep_nrg(params_string)
end
if select_string=="mtr" then
sleep_manager.test_for_need_sleep_matras(params_string)
end
if select_string=="men" then
del_variable("smn")
end
if select_string=="rfx" then
ogsm_debug.radar_fix()
end

if select_string=="otf" then
a = level.object_by_id(tonumber(params_string))
if a ~= nil then a:set_condition((math.random(25)+40)/100) end
end

if select_string=="rsp" then
ogsm_respawn.level_spawn()
g_start_timer("rsp",0, vars.t_spawn+math.random(-1,1), 0)
end

-- Начало алгоритма выброса --

-- 1. Настало время выброса.
if select_string=="bl1" then
if ogsm_surge then
if (level.name() ~= "l03u_agr_underground") and (level.name() ~= "l08u_brainlab") and (level.name() ~= "l10u_bunker") and (level.name() ~= "l04u_labx18") and (level.name() ~= "l12u_sarcofag") and (level.name() ~= "l12u_control_monolith") and (level.name() ~= "l12_stancia") and (level.name() ~= "l12_stancia_2") then
if sleep_manager.is_sleep_active() then sleep_manager.stopper() end
start_timer("bl2",1)
else
g_start_timer("bl1",0,1,0)
end
else
g_start_timer("bl1",0,10,0)
end
end

-- 2. Сирена, первые визуальные признаки выброса
if select_string=="bl2" then
db.Flag2 = 1
save_variable("blt", 1)
level.set_weather("stancia")
wfx1 = "p_surge_day_"..tostring(level.get_time_hours())
level.set_weather_fx(wfx1)
level.add_pp_effector("vibros_p.ppe", 1974, false)
local snd_obj = xr_sound.get_safe_sound_object([[anomaly\dezodor]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
g_start_timer("bl3",0,0,8)
end

-- 3. Проигрываем промежуточные эффекты
if select_string=="bl3" then
level.set_weather("stancia")
level.set_weather_fx(wfx1)
g_start_timer("bl4",0,0,5)
end

-- 4. Спустя 5 минут затишья начинаем выброс
if select_string=="bl4" then
xr_sound.set_actor_sound("")
level.set_weather("stancia")
local snd_obj = xr_sound.get_safe_sound_object([[ambient\earthquake]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
level.add_cam_effector("camera_effects\\earthquake.anm", 1974, true, "")
wfx2 = "surge_day_"..tostring(level.get_time_hours())
level.set_weather_fx(wfx2)
level.add_pp_effector ("vibros.ppe", 1974, false)
local snd_obj = xr_sound.get_safe_sound_object([[anomaly\blowout]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
ogsm_surge.play_sounds()
g_start_timer("bl5",0,0,4)
end

-- 5. Начинаем расколбас
if select_string=="bl5" then
save_variable("blt", 2)
level.remove_cam_effector(1974)
db.Dead2 = 1
if db.FlagEsc == 0 then
local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
level.add_cam_effector("camera_effects\\head_shot.anm", 1975, false, "")
ogsm_surge.g_R_Vibros:Run()
end
tag_spb.refresh_zombie_team (self.object,obj)
g_start_timer("bl6",0,0,5)
end


-- 6. Выброс близится к концу
if select_string=="bl6" then
level.set_weather_fx(wfx1)
g_start_timer("bl7",0,0,5)
end

-- 7. Завершаем выброс, устанавливаем время следующего
if select_string=="bl7" then
ogsm_surge.g_R_Vibros:Stop()
if db.FlagEsc == 0 then
level.add_cam_effector("camera_effects\\shell_shock.anm", 1974, false, "")
local snd_obj = xr_sound.get_safe_sound_object([[actor\breath_1]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
end
level.add_pp_effector ("teleport.ppe", 2009, false)
local snd_obj2 = xr_sound.get_safe_sound_object([[ambient\earthquake]])
snd_obj2:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
if has_alife_info("freeplay") and (level.name()=="l11_pripyat" or level.name()=="l10_radar") then
level.set_weather("default")
else
level.set_weather(wthr)
end
del_variable("blt")
g_start_timer("bl1",0, vars.t_surge+math.random(-4,4), 0)
ogsm_anomaly.add_anom()
ogsm_surge.spawn_arts()
ogsm_respawn.level_spawn()
if ogsm_psyzones then ogsm_psyzones.spawn_psy() end
db.Dead2 = 0
db.Flag2 = 0
if not has_alife_info("first_blowout") then db.actor:give_info_portion("first_blowout") end
end


-- Конец алгоритма выброса --


if select_string=="vdk" then
ogsm_quests.use_vodka(params_string)
end

if select_string=="hrm" then
ogsm_quests.use_harmonica(params_string)
end

if select_string=="rad" then
ogsm_quests.use_radio(params_string)
end

if select_string=="spw" then
if params_string == "rad" then spawn_item_in_inv("hand_radio_f")
elseif params_string == "hrm" then spawn_item_in_inv("harmonica_f") end
end

if select_string=="scr" then
ogsm_quests.spawn_fn2000()
db.actor:give_info_portion("secret_talk")
end

if select_string=="fpl" then
level_tasks.set_task_state(task.completed, "sar_warlab", 0)
level_tasks.set_task_state(task.completed, "sar_warlab", 1)
end

if select_string=="oso" then
level.add_pp_effector("deadcity_wake.ppe", 2008, false)
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")
db.actor:set_actor_position(point:point(0))
local dir = look:point(0):sub(point:point(0))
db.actor:set_actor_direction(-dir:getH())
end

if select_string=="vd1" then
local p = particles_object("anomaly2\\teleport_out_00")
p:play_at_pos(params_string)
local s = sound_object("anomaly\\teleport_incoming")
s:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 1.0)
start_timer("vd2", 2)
end

if select_string=="vd2" then
level.add_pp_effector("teleport.ppe", 2009, false)
local s = sound_object("anomaly\\teleport_work_2")
s:play_at_pos(db.actor, vector():set(0, 0, 0), 0, sound_object.s2d)
db.actor:give_info_portion("pri_trader_vanish")
start_timer("vd3", 2)
end

if select_string=="vd3" then
local s = sound_object("x18_laugh")
s:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 1.0)
level.enable_input()
db.actor:restore_weapon()
end

end


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



-- Спавним объекты на карту
-- Для спавна неписей смотрим config\creatures\spawn_sections.ltx
-- Там написаны имена секций для разных типов неписей
function spawn_item(spawn_item, pos)
return alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())
end


-- Спавним объекты в инвентарь
function spawn_item_in_inv(spawn_item,npc)
if npc==nil then
npc=db.actor
end
return alife():create(spawn_item,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id())
end


-- Спавним патроны в инвентарь
function spawn_ammo_in_inv(spawn_item,number,npc)
if npc==nil then
npc=db.actor
end
if number > 0 then
return se_respawn.create_ammo(spawn_item,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id(),
number)
end
end


-- Удаляем объект из игры
function remove_item(remove_item)
if remove_item~=nil then
alife():release(alife():object(remove_item:id()), true)
return true
end
return false
end


-- Выбрасываем объект из инвентаря, применимо к ГГ
function drop_item(npc,item)
if item~=nil then
npc:mark_item_dropped(item)
end
end


-- Убиваем непися
function make_suicide(npc)
npc:kill(npc)
end


-- Узнаем отношение одного непися к другому
function get_npc_relation(obj,target)
local rel = obj:relation(target)
local relation
if rel==game_object.neutral then
relation="neutral"
elseif rel==game_object.friend then
relation="friend"
elseif rel==game_object.enemy then
relation="enemy"
else
return false
end
return relation
end


-- Задаем отношение одного непися к другому
function set_npc_relation(obj,target,relation)
local rel
if relation=="neutral" then
rel=game_object.neutral
elseif relation=="friend" then
rel=game_object.friend
elseif relation=="enemy" then
rel=game_object.enemy
else
return false
end
obj:set_relation(rel,target)
return true
end


-- Узнаем группировку непися, применимо к ГГ
function get_npc_community(npc)
return npc:community()
end


-- Выставляем группировку непися, можно ГГ
function set_npc_community(npc,community_string)
--значения для community_string можно узнать в config\creatures\game_relations.ltx
return npc:set_character_community(community_string, 0, 0)
end


-- Удаляем предмет из инвентаря
function remove_item_from_inventory_by_name(remove_item_name,npc)
return remove_item_from_inventory(npc:object(remove_item_name),npc)
end
function remove_item_from_inventory(remove_item,npc)
if npc==nil then npc=db.actor end
if remove_item~=nil then
npc:mark_item_dropped(remove_item)
alife():release(alife():object(remove_item:id()), true)
return true
end
return false
end


-- Создаем "ожидатели" для неписей нужно для корректной работы с объектами, созданными внутри скрипта
function create_waiter_for_npc(npc,select_string)
npc_spawner[npc.id]=select_string
end


-- Очищаем инвентарь непися, можно ГГ, использует следующую фунцию для удаления предмета
function clear_npc_inventory(npc)
npc:iterate_inventory(__del_item, npc)
end
function __del_item(npc, item)
local section = item:section()

if section == "bolt" or section == "device_torch" then
return
end
npc:mark_item_dropped(item)
alife():release(alife():object(item:id()), true)
end


-- Проверка, запущена ли игра
function check_game()
if level.present() and (db.actor ~= nil) and db.actor:alive() then
return true
end
return false
end

-- Записываем переменную
function save_variable(variable_name, value)
xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load_variable(variable_name, value_if_not_found)
return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del_variable(variable_name)
if db.storage[db.actor:id()].pstor[variable_name] then
db.storage[db.actor:id()].pstor[variable_name] = nil
end
end


-- Определяем находится ли ГГ в определенной зоне
function check_npc_in_box(npc, p1,p2)
local pos=npc:position()
if is_point_inside_interval(pos.x,p1.x,p2.x) and
is_point_inside_interval(pos.y,p1.y,p2.y) and
is_point_inside_interval(pos.z,p1.z,p2.z) then
return true
else
return false
end
end
function is_point_inside_interval(x,p1,p2)
if p1>p2 then
p1,p2 = p2,p1
end

if x>p1 and x return true
else
return false
end
end


-- Получаем инвентарное название объекта
function get_inv_name(section)
return system_ini():r_string(section,"inv_name")
end


-- Колбэк на потерю предмета из инвентаря ГГ
function on_item_drop(obj)
sleep_manager.check_sleep_item(obj)
ogsm_quests.check_use_vodka(obj)
ogsm_quests.check_use_harmonica(obj)
ogsm_quests.check_use_radio(obj)
end

-- Колбэк на апдейт ГГ
function on_actor_update(obj)

-- Очищаем уровни от трупов во фриплее
ogsm_debug.clean_level()

-- Обновление арены
aem_manager.get_aem():update()

-- Обновление таймеров
if not timer_trigger then
timer_trigger=game.time()
end
if timer_trigger<=game.time() then
timer_trigger=game.time()+5000
check_timers()
end

-- Багфикс радара
ogsm_debug.check_radar_off()

-- Обновление шкалы радиации при использовании бинокля
ogsm_debug.check_binoc()

-- Обновление статистики
-- ogsm_debug.hud_stats()

-- Обновление менеджера выброса и аномалий
if ogsm_surge then
ogsm_surge.update_surge()
ogsm_anomaly.anom_update()
end

-- Проверка, пьян ли актор
ogsm_quests.check_drunk()

-- Проверка, ранен ли актор
ogsm_quests.wounded_pp()

end


-- Загружаем все переменные, которые нужно, вызывается загрузке игры автоматически
function on_game_load()

-- Восстанавливаем солнце
wthr = level.get_weather()
level.set_weather("ogsm",true)
game.start_tutorial("restore_sun")

-- Создаем хранилище актора
if db.storage[db.actor:id()].pstor == nil then
db.storage[db.actor:id()].pstor = {}
end

-- Первый запуск мода
if load_variable("frn",true) then
g_start_timer("slp",0,0,6)
g_start_timer("bl1",0, 9+math.random(-1,1), 0)
g_start_timer("rsp",0, 5+math.random(-1,1), 0)
spawn_item_in_inv("matras")
spawn_item_in_inv("harmonica_f")
ogsm_respawn.first_run()
save_variable("frn",false)
end

-- Проверяем сонность
sleep_manager.test_sleep_pp()

-- Получаем список всех монстров и укрытий
ogsm_respawn.get_level_mobs()

-- Спавним, если надо, пси-зоны
if ogsm_psyzones then ogsm_psyzones.spawn_on_load() end

-- Отмечаем на карте новые точки перехода
ogsm_freeplay.mark_lc()

end


-- Парсинг ини-файла в массив
function parse_ini_section_to_array(ini,section)
local tmp={}
if ini:section_exist(section) then
local result, id, value = nil, nil, nil
for a=0,ini:line_count(section)-1 do
result, id, value = ini:r_line(section,a,"","")
if id~=nil and trim(id)~="" and trim(id)~=nil then
tmp[trim(id)]=trim(value)
end
end
end
return tmp
end
function trim (s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end


-- Туториал на пси-воздействие
function on_my_psy()
if not has_alife_info("encyclopedy_tutorial_psy") then
game.start_tutorial("part_7_psy")
db.actor:give_info_portion("encyclopedy_tutorial_psy")
end
end


-- Восстановление солнца и погоды, вызывается из туториала
function restore_sun()

if load_variable("blt",0) == 1 then
level.set_weather("stancia")
db.Flag2 = 1
elseif load_variable("blt",0) == 2 then
level.set_weather("stancia")
db.Flag2 = 1
db.Dead2 = 1
else
if has_alife_info("freeplay") and (level.name()=="l12_stancia" or level.name()=="l12_stancia_2" or level.name()=="l11_pripyat" or level.name()=="l10_radar") then
level.set_weather("default")
else
level.set_weather(wthr)
end
end

end


------------------- Библиотека служебных скриптов для OGSM 2.x ----------------

---------------------- Copyright 2007-2008 xStream & DEXXX --------------------

--[[

If you're going to use the whole of this script or its parts in your own creative
developments for the S.T.A.L.K.E.R. game, please don't become such a goddamn
motherfucker like the notorious author of the ABC Mod - Carbrobro. Leave the
copyrights, note the real author(s) and don't claim others' ideas and their
realization to be your own ones. It's just simple Modmakers' Ethics. Thank you!

Если вы собираетесь использовать данный скрипт целиком или частично в своих
разработках по игре S.T.A.L.K.E.R., пожалуйста не опускайтесь до уровня печально
известного автора ABC мода - Carbrobro. Не удаляйте копирайты, указывайте настоящего
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Ведь это элементарная
этика модостроителей! Спасибо за понимание.

]]--


Вот источник<<< так называемой "фенечки".


Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.

Artos
    
Посты: 4176
Откуда:
Возраст: 65
15-11-2010 02:32 GMT3 час. #1383469   
TheDoktor
Помогаю подобным образом в последний раз!!!
Автор фенечки (Татуков А.Г. aka tag) разжевал практически до пюре, а ты ... проглотить не можешь. :-(

1. Про 'tag_spb.refresh_zombie_team (self.object,obj)' в 'bind_stalker.script' можешь забыть. Это всего лишь чит-вызов, для быстрой проверки спавна зомбиков не дожидаясь выброса. Съел ГГ аптечку - полезли зомбики оживляться ... Выше я тебе указал как и куда это бы нужно прицеплять, ты же тужишься зачем-то это в выброс засовывать вместо**500140b7e12bf63c3891**n
save_variable("blt", 2)
level.remove_cam_effector(1974)
db.Dead2 = 1
if db.FlagEsc == 0 then
local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
level.add_cam_effector("camera_effects\\head_shot.anm", 1975, false, "")
ogsm_surge.g_R_Vibros:Run()
end
tag_spb.zombie_team() --/ старт оживления зомбиков!
g_start_timer("bl6",0,0,5)
end
...
[/code]
3. Т.к. обработчик таймера у тебя в 'сборном' amk скрипте (как и у АМК), то ищем его и ... оказывается кто-то додумался встроить весь выброс именно в этот обработчик ... Хм, хозяин - барин, плюем на это и пристраиваем в подходящем месте, например пониже:
[code]-- Конец алгоритма выброса --
if select_string == "tag_trup_to_zombie" then
tag_spb.trup_to_zombie(params_string)
end
[/code]
4. Последняя правка в xr_wounded.script просто устраняет возможную ошибку и с сутью фенечки малосвязана. Там сам разберешься куда добавить 'npc_id and', тем более расписано до строки и сам файл приложен...
Обижайся иль нет - но ... тот, кто не может встроить простейший модик из одного файла с расписанной 'что и как' инструкцией, НЕ модмейкер, а в лучшем случае конфигер. Садись как за LUA и погрызи скриптовые азы!


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


Форумы Архив » Свалка Вопросы и ответы (ТЧ по 18.11.2010)


Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для
просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.

Использование материалов сайта возможно с разрешения администрации. Все права защищены. © 2004–2025 «Stalker-Portal.ru»