как сделать чтобы у тебя был четвероногий дружок который всегда будет с тобой?
(наверняка все кто играли в зов припяти видели сталкера по кличке ной у которого
была собака.Я бы хотел реализовать эту идею и в ТЧ)
Адаптировал abc sleep с freeplayerstart, работает без вылетов, но есть баг, после успешного использования он начинает открывать окно выбора времени сна, при закрытии через пол секунды сново открывает окно и размножается в сумке, если нажать esc, то он прекращает надоедать, но спальник больше не работал, просто пропадал из сумки, может я в bind_stalker что-то не написал?
function init (obj)
xr_motivator.AddToMotivator(obj)
end
function actor_init (npc)
npc:bind_object(actor_binder(npc))
end
-- setup xiani freeplay
if has_alife_info("freeplay_actor_setup") then
if has_alife_info("freeplay_actor_setup2") then
ogsm.on_game_load() -- for sun restoring
sak_off_corpses.off_corpses()
else
self.object:give_info_portion("freeplay_actor_setup2")
xiani.freeplay_start_cleanup()
end
end
abc_sleep.uptabc("load")
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)
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)
-- dbglog("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
level_tasks.process_info_portion(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)
--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)
else
news_manager.send_encyclopedy("encyclopedy", group)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
if obj:clsid() ~= clsid.wpn_ammo then
level_tasks.proceed(self.object)
end
--game_stats.update_take_item (obj, self.object)
_z.on_item_take(obj, self.object) abc_sleep.uptabc(obj)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
if obj:clsid() ~= clsid.wpn_ammo then
level_tasks.proceed(self.object)
end
--game_stats.update_drop_item (obj, self.object)
_z.on_item_drop(obj, self.object)
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)
--' Проверка потери жизни
--[[
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
--' Вывод сообщения о большой радиации
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 self.object.health <= 0.3 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_health_danger")
if custom_static == nil then
hud:AddCustomStatic("cs_health_danger", true)
hud:GetCustomStatic("cs_health_danger"):wnd():SetTextST("st_health_danger")
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic("cs_health_danger")
if custom_static ~= nil then
hud:RemoveCustomStatic("cs_health_danger")
end
end
if nv_need_update then
nv_need_update = false
_z.do_update(self.object)
end
-- UI Radiation Mod additions
if xiani_config.ui_show_rad then
if (ui_rad and self.object) then
ui_rad.update(self.object)
end
end
-- UI Radiation Mod additions
-- UI Clock Mod
if xiani_config.ui_show_time then
ui_clock.show_time()
end
-- UI Clock Mod -
if self.bCheckStart then
printf("SET DEFAULT INFOS")
if not has_alife_info("freeplay_actor_start")
then
xiani.first_start(self);
self.object:give_info_portion("freeplay_actor_start")
end
-- 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
--if not self.particle then
-- self.particle = particles_object([[weather\water]])
-- self.particle:play_at_pos(self.object:position())
--else
--self.particle:move_to(self.object:position():add(vector():set(0,1,0)),vector():set(0,0,0))
--end
abc_sleep.uptabc("abc")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
--' Сохраняем уровень сложности
game_difficulty = level.get_game_difficulty()
if save_treasure_manager == true then
packet:w_u8(bit_or(game_difficulty, 128))
else
packet:w_u8(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
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 bit_and(game_difficulty, 128) ~= 0 then
game_difficulty = bit_and(game_difficulty, 127)
load_treasure_manager = true
end
-- get_console():execute("debug:difficulty:" .. tostring(game_difficulty))
if game_difficulty > 3 then game_difficulty = 3 end
if game_difficulty < 0 then game_difficulty = 0 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
if load_treasure_manager == true then
treasure_manager.load(reader)
end
task_manager.load(reader)
self.actor_detector:load(reader)
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
Категорически поддерживаю ход твоих мыслей.
Вообще то аффтар мода думал, что нужно ставить вызов функции abc_sleep.uptabc(obj) на drop.
Но тебе наверно виднее - раз на take прописал. :-)
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Парни спосайте, как сделать новому НПС квесты. Чтобы када с
ним разговариваеш был такой диалог:
-Мне нужна работа.Есть что на примете?
-Есть кое-что:
И потом поевлялся список доступных зоданий.
1200345
Можно переустановить игру(только должна быть в установщике 4 версия), можно воспользоваться специаллной прогой для перехода на 4 патч. 1200345
Самому лень в интернете найти?Юзай поисковики.
отредактировал(а) Stalk15: 23-11-2010 16:29 GMT3 час. Новые фишки для сталкера(см. журнал)
Люди,мне надо чтобы когда ГГ брал предмет,то через пять минут он сдох.Я все знаю как сделать,тока вот пять минут не получаеца.Скачал мод гниение трупов,там посмотрел как сделано время,попробывал вставить...не получилось.Точнее получилось,но когда беру предмет сразу дохну.Надо наверное сделать отсчет времени после взятия предмета,только как?
У меня нет ошибки.И нет вылета.Ты меня не понял.Я просто не могу сделать чтобы ГГ дох через 5 мин а не сразу.
-------
Сори,это я ступил)
-------
вот что в скрипте написал:
local time = time_global() + 30000
function opasnost()
if db.actor:object("opasn") and
if time<=time_global() then
db.actor:kill
end
end
end
Потом поставил функцию в xr_motivator.script(Так сделано в гниении трупов) в function motivator_binder:update(delta)
Получилось:
function motivator_binder:update(delta)
mod.opasnost()
object_binder.update(self, delta)
Вот.Ну покупаю у сидора мой opasn и сразу дохну!А не через 30 сек(30000 это ведь 30 сек?)
отредактировал(а) RENTGEN_4444: 23-11-2010 21:39 GMT3 час.
Кстати у меня тоже иногда вылетает при переходе на другую локу.Только в логе stack trace: и все.И если загрузить посл.сохран(avtosave) то все работает.
RENTGEN_4444
Взяв непонятные буковки/слоги/слова, без понимания как из них слогать нужные для себя тексты - глупо надеяться на написания даже простейшего предложения, не говоря уже о расказиках ...
1. Твоя 'local time' - устанавливается при инициализации скрипта, по сути при старте игры. Что же ты удивляешься, что при покупке своего опасного предмета ты дохнешь сразу? Тайм-аут с момента старта игры уже протикал ... ;-)
2. Применять к ГГ аптейт из модуля для неписей (xr_motivator) - пытаться пристроить слово куда-нибудь в текст ... авось получится предложение со смыслом. :sarcastic:
RENTGEN_4444,
Я, честно говоря, не понимаю, почему у тебя вылета нету. Давай посмотрим этот скрипт:
local time = time_global() + 30000
function opasnost()
if db.actor:object("opasn") then -- вместо and надо ставить then
if time<=time_global() then
db.actor:kill() -- должны быть скобки
end
end
end
Итак, как должно быть, на мой взгляд:
Функция mod.opasnost()[/i**5001b67681f3126adde4** true
time = time_global()
else
flag = false
time=nil
end
if time_global() - time >= 30000 and flag == true then
db.actor:kill()
time=nil
flag = false
end
end[/code]
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.