У меня проблема с долговцем, которого спасает Пуля, не помню как там его. Я не могу с ним поговорить, а он вечно куда то целится со своей беретты, даже когда прибегает на блокпост долга. Как эту каку исправить?
P.S. я ничего не менял, глюк "пришёл" из OGSM'а.
Я – хозяин своей судьбы, но только судьба знает, где закончится мой путь.
Я уже задавал вопрос, но как сделать "Новости зоны"?
Немного подробнее опишу:
Нашел я в АМК 1.4.1. вот такие файлы:
amk_death_lists
amk_modders
amk_dolg
amk_freedom
amk_names_lists
amk_news_lists
amk_uniq_news_lists
news_data
news_main
news_manager
Там указаны смерти, диалоги и разные "Бла-бла-бла" короче чат
Я понял, что их нужно где-то прописывать, но где?
З.Ы.Не предлагать установить АМК, я хочу внедрить в другой мод этот "чат"
Дробитель
http://narod.ru/disk/22401797000/news.7z.html
Инструкция:http://www.amk-team.ru/forum/index.php?s=&showtopic=8986&view=findpost&p=406090
Сорри что на украинском
Или можно взять новости отсюда - http://www.amk-team.ru/forum/index.php?showtopic=8986#entry374420
Правда новости от АМК 1.2 RENTGEN_4444
function ваше_название_функции(actor, npc)
if npc:character_community() ~= "(сюда пишем название группировки куда хотите вступить" then
npc:set_character_community("пишем сюда еще раз группировку в которую хотите вступить", 0, 0)
end
end
Дробитель
СтОит выбирать себе задачку по силам и навыкам.
Ты хочешь портировать в 'свой' мод одну и самых трудоемких 'фенечек' из АМК-мода.
Если у тебя нет навыков по совмещению скриптовых модов, то подобная задачка тебе сейчас НЕ по силам, а объяснять тебе многочисленные места/шаги по 'где/как/чего' - врядли кто возьмется.
Тем более на твое "где прописывать", никто не ответит, т.к. что у тебя за 'другой мод' - только тебе ведомо.
Перечисленные тобою файлы, во-первых, не единый "чат", а два: "обычный" (работает из amk_mod.script - новости не зависят от игры) и "интерактивный" (news_main и news_data - содержание новостей зависит от игры/прохождения). Во-вторых, используют и другие файлы из AMK-мода, используя сторонние функции.
Если у тебя нет достаточного опыта и навыков по скриптам игры (что скорее всего судя по заданному вопросу), то или ищи на просторах инета (пмнится было что-то кусочно-выделенное) или ищи знакомого скриптера ... RENTGEN_4444
Даже в оригинальной игре есть 'перевод игрока' в другую группировку (Долг, Свободу).
Почему ленишься посмотреть САМ в уже имеющемся под рукою материале?
Загляни в оригинальный 'dialogs.script' и найдя еомментарий от разрабов "-- Community" поизучай функции проверки актора в группировке и перевод его в нее (например: 'actor_set_dolg()'). TheDoktor
Подобные баги неписей ('молчалки-неотвечалки') - имеют корни в логике неписей.
Хочешь исправлять - изучай логику для конкретного непися и правь ее.
Задачка далеко не из простых. Во-первых, как обычно без всех исходных материалов, влияющих на логику/выбор логики, из твоего мода не обойтись. Во-вторых, без общих и частных знаний 'как и что' в логике неписей - ты только сторонним читателем будешь, а кто-то должен будет тебе написать/разжевать.
Советую поштудировань материалы на вики на эту тему и уже с неким багажем знаний вернуться к вопросу. Подсказка по частному случаю: ищи в сторону параметра 'meet' (т.е. условий когда неписю (не)запрещено болтать).
---------------------------"Звук при съедании предмета,(ов) (BSF assemblage)"-------------------------
Код:
local eat = nil
function use_med() - это надо ставить на всем знакомый актор апдейт
if eat and type(eat) == 'number' then
if not level.object_by_id( eat ) then
local snd_obj = xr_sound.get_safe_sound_object([[пишем путь до звука]])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
eat = nil
end
if eat and type(eat) == 'userdata' then
eat = eat:id()
else
eat = nil
end
end
function drop_med(obj) - это надо ставить на on_item_drop (obj)
local obj_sect = obj:section()
if obj_sect == 'предмет1' or obj_sect == 'предмет2' or obj_sect == 'предмет3' then - здесь пишем итемы
eat = obj
end
end
Но тут в функции я показал пример с множеством предметов, а если у нас допустим только один предмет, то пишем так:
Код:
function drop_med(obj) - это надо ставить на on_item_drop (obj)
local obj_sect = obj:section()
if obj_sect == 'предмет1' then - здесь пишем итемы
eat = obj
end
end
после этого вылет
вот мой bind_stalker
function init (obj)
xr_motivator.AddToMotivator(obj)
end
function actor_init (npc)
npc:bind_object(actor_binder(npc))
end
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
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)
--' Сюжет
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)
level_tasks.proceed(self.object)
--game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object) function drop_med(obj)
local obj_sect = obj:section()
if obj_sect == 'conserva' then
eat = obj
end
end
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.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
local eat = nil
function use_med()
if eat and type(eat) == 'number' then
if not level.object_by_id( eat ) then
local snd_obj = xr_sound.get_safe_sound_object(sounds\monsters\drink_1)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
eat = nil
end
if eat and type(eat) == 'userdata' then
eat = eat:id()
else
eat = nil
end
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
object_binder.save(self, packet)
--' Сохраняем данные об отключенном вводе
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
sr_psy_antenna.load(reader)
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
batment
Сильно сомневаюсь Artos будет тебе это разжевывать(и будет кстати правильно с его стороны), но дабы ты в который раз не заполнял топик подобными элементарными вопросами отвечу\подскажу за него:
нужно вписывать в тело методов bind_stalker.script не сами функции, а только их вызов: имя_файла.use_med() -- в метод апдейта
и имя_файла.drop_med(obj) -- в каллбек на дроп
а сами функции положи в любой скриптовый файл (свой или уже имеющийся).
В вызове функций вместо строчки имя_файла укажи имя файла куда положил функции.
И еще путь до звука указан неверно:
1)папку sounds указывать не нужно - указывается путь относительно ее.
2) путь до файлов указывается через двойной слеш+кавычки. (либо - при одном слеше - нужно вместо кавычек использовать двойные квадратные скобки).
PS: Как можно изучать С++ (сужу по подписи на твоей аве)- далеко непростой кстати язык с огромным числом библиотек, классов, методов((сужу по изученному мной в базовой версии его родственнику C#)- не разобравшись в таких основополагающих вещах как вызов функции, тело функции, аргументы функции, операторы функции? Неужели книжка создателя lua - камрада Роберта Иерусалимского настолько тяжела, что ее даже руки взять страшно...
Вопрос само собой риторический.
PPS: В топике ушедшем в архив я кстати дал другой вариант отслеживания использования предмета - более простой. Для кого интересно?
Вопрос опять же риторический.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Alex-San
Это не моя статья - а код из сборки Struck'a BSF assemblage. Использованный там вариант отслеживания использования предмета(хотя и является рабочим при условии его применения с умомом - его автор singapur22) - тем не менее слегка устарел. Более простой пример я приводил на последней странице прошлого темы.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Подскажите пожалуйсто. Что неправельно в этих строках?
Перекрестие прицела заменено на курсор(который у бинокля).
if device().fov<67 then
if string.find(db.actor:active_item():section(),"wpn_") and get_hud():GetCustomStatic("old_cursor") then
get_hud():RemoveCustomStatic("old_cursor")
end
else
if not get_hud():GetCustomStatic("old_cursor") then get_hud():AddCustomStatic("old_cursor") end
end
Игра вылетает при смерти ГГ и ссылается на эту строку:
if string.find(db.actor:active_item():section(),"wpn_") and get_hud():GetCustomStatic("old_cursor") then
Зарание спасибо.
erlik большое спасибо, помогло.
отредактировал(а) Zhekcon: 19-11-2010 13:00 GMT3 час.
Si vis pacem, para bellum - Хочешь мира, готовся к войне.
erlik, возвращаясь к чьему-то вопросу про изменение имени ГГ. Можно же воспользоваться твоей статьей про переименовывание файлов. Сделать 2 файла: с оригинальным именем и измененным. После диалога их подменить.
Хм... ясно. Ну в диалогах можно не использовать имя Меченого - убрать.
отредактировал(а) SkyLoader: 19-11-2010 14:08 GMT3 час.
SkyLoader
Ну во первых файлов, где используется имя Меченого - вагон и маленькая тележка (одних только диалогов, где упоминается в тексте имя Меченый несколько десятков - как ты представляешь их перезапись\подмену - делать копии каждого файла?), а во вторых подмена - я об этом писал - ничего не дает, конфигурационые параметры (да и диалоги наверно тоже - впрочем не проверял) во время игры считываются не из самих файлов, а из памяти куда они загружаются туда при старте новой игры. После перезагрузки игры с сейва идет обращение не к конфигурационным файлам, а к данным записанным в сейвы с их последующей загрузкой в память.
Простая проверка чтением во время игры параметров через методы класса ini_file() показал, что чтение идет вовсе не из самого текстового файла - в папке у меня лежал подменный файл с новыми параметрами, результат же его якобы чтения выдал значение дефолтного параметра. И для предмета по прежнему использовались настройки из дефолтного файла.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
А можно как-нибудь изменять конфиги(и желательно на время)игры через скрипт?Например когда актор пьет таблетку,он начинает быстро бегать и высоко прыгать.
#erlik :...конфигурационые параметры...во время игры считываются не из самих файлов, а из памяти куда они загружаются туда при старте новой игры. После перезагрузки игры с сейва идет обращение не к конфигурационным файлам, а к данным записанным в сейвы с их последующей загрузкой в память.
Что тут не понятного?
На всякий случай скажу - НЕТ, НЕЛЬЗЯ.
Хотя в принципе-то можно, но для этого нужно переписать память.
Того, кто это сможет сделать не знаю.
Лично я занимаюсь Luа. Это высокоуровневый язык программирования.
Для реализации того, о чем я сказал необходимо знать ассемблер как минимум.
А можно как-нибудь изменять конфиги(и желательно на время)игры через скрипт?
Смотря какие. Если параметр пишется в нет пакет объекта - тогда можно попробовать, если знать как с ним работать. Считать\перазаписать\перевести объект в онлайн\оффлайн.
Или если есть специальные методы для изменения значения конкретного параметра.
Например динамически изменить скорость течения времени в игре(параметр из файла alife) -можно.
Высоту прыжка ГГ\скорость передвижения - практически нет. Вариантов реализации не существует.
batment
Да. В on_item_drop (obj).
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
а теперь вообще вылетает с логом мол
LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:217: attempt to index global 'xr_havka_sound' (a nil value)
Люди сори может не в тему, но вопрос небольшой! есть ли какая-нибудь модификация которая добавляет ТОЛЬКО спальный мешок без других нововведений? желательно на версию 1.0004rus
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.