Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Создание и редактирование квестов
denis2000Дата: Пн, 10.10.2011, 21:25 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Создание и редактирование квестов

Создание новых квестов и редактирование существующих

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


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                       local reason = string.format(fmt, ...)
                       error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Сб, 07.09.2013, 15:35 | Сообщение # 136
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

denis2000, да, так и есть. Буду искать, в каком из binder:update идет сохранение и восстановление.

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Сб, 07.09.2013, 16:32 | Сообщение # 137
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, А как собственно ставите метку, что она у вас пропадает?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Сб, 07.09.2013, 16:51 | Сообщение # 138
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

denis2000, сейчас переделал через колл-бэк на инфопоршни, командой
level.map_add_object_spot(obj_id, "crlc_small", "text")
Пропадает метка при загрузке сейва. А если не загружаться, тогда есть.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Сб, 07.09.2013, 16:51
 
makdmДата: Сб, 07.09.2013, 18:22 | Сообщение # 139
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

NIV, как вывести метки можно посмотреть на примере вызова функции fill_sleep_zones() на апдейте актора - pda.fill_sleep_zones()
Ну, а как работает функция посмотрите в файле pda.script и сделайте по аналогии. Туда можно вместо таблицы, где идёт перебор всех спальных мест, вставить проверку на выдачу инфопоршион.
При каждой загрузке игры у вас функция будет вызываться, проверяться выдача поршней и устанавливаться метка на объекты.
Причём всё это можно сделать внутри функции fill_sleep_zones()
Сами id меток можно записать в таблицу, которую сохранять в pstor переменных.
Скажу честно, сам не пробовал, но посмотрите, возможно так и решите эту проблему.


Терпение......
И все получится!


Сообщение отредактировал makdm - Сб, 07.09.2013, 18:37
 
denis2000Дата: Сб, 07.09.2013, 18:52 | Сообщение # 140
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, Пробуй функцию level.map_add_object_spot_ser(id, spot, text), после нее в сейве метки не пропадают.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
9vova8Дата: Вс, 08.09.2013, 12:43 | Сообщение # 141
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

Доброго времени суток, у меня вопрос: можно ли в ЗП сделать видимый таймер как в ТЧ на ЧАЭС? Если да, то как?

 
denis2000Дата: Вс, 08.09.2013, 13:33 | Сообщение # 142
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

9vova8, Конечно, только в стиле ЧН (не знаю отличается ли от ТЧ и чем):
Код
[logic]
active = sr_idle@wait

[sr_idle@wait]
on_info  = {+Инфопорция запуска таймера} sr_timer@1

[sr_timer@1]
type = dec ; Тип таймера - на уменьшение
start_value = 600000 ;Стартовое значение таймера в мс
on_value = 0 | sr_idle@wait %+Время таймера истекло%
on_info = {+Отмена таймера} sr_idle@wait


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
9vova8Дата: Вс, 08.09.2013, 14:06 | Сообщение # 143
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

denis2000, спасибо, только вот на экране его нет, а было бы неплохо.

 
denis2000Дата: Вс, 08.09.2013, 15:03 | Сообщение # 144
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

9vova8, Проверяйте соответствующие теги hud_timer в файлах *.xml. У меня по крайней мере все работает, все текстуры и все конфиги на месте и не закоментарены. Вот в этом посте видео с арены там таймер видно примерно на 12 минуте.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Volk66Дата: Вт, 24.09.2013, 21:17 | Сообщение # 145
Отмычка
Пользователи
Сообщений: 34
Награды: 0
Репутация: [ -24 ]

А как убрать старый сюжет чтобы новый сделать?

А форум почитать слабо? Или вам в енцатый раз нужно ответить на этот вопрос? denis2000
 
NIVДата: Ср, 25.09.2013, 12:59 | Сообщение # 146
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Коллеги, как вы считаете, можно ли в ЗП вернуть в ПДА некоторые функции из ПДА ТЧ, а именно: 1) добавить страничку "проваленные задания" (всего-то нарисовать новый элемент GUI) и 2) вернуть таймер на задания, типа "осталось 16 часов до провала"; 3) и др. - "Энциклопедия" и т.п. ? А может, в каком-то моде это уже реализовано?

Добавлено (25.09.2013, 12:59)
---------------------------------------------
Volk66, здесь, конечно не очень хороший поиск, тогда юзай "расширенный поиск" Яндекса по этому форуму. И всё найдется, например, сообщения 206 - 207.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Вт, 01.10.2013, 09:13 | Сообщение # 147
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (NIV)
Коллеги, как вы считаете, можно ли в ЗП вернуть в ПДА некоторые функции из ПДА ТЧ

Теоритически это вполне возможно, есть ли мод с такой реализацией в свободном доступе - не знаю, сам поищи.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Сб, 05.10.2013, 22:29 | Сообщение # 148
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Попробовал вместо таймера в ПДА сделать таймер на экране через sr_timer.script. Но поскольку он управляется из рестриктора, получается забавная вещь: уходишь с локации - таймера нет, возвращаешься - таймер продолжает отсчет. А хотелось бы, чтобы и на другой локации таймер продолжался.
Как можно считать остаток времени и передать его в качестве параметра рестриктору на новой локации?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
FantomICWДата: Сб, 05.10.2013, 23:05 | Сообщение # 149
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, рекомендую глянуть схему работы армейского таймера в SGM. Там все построено на очень простой форме в XML и скриптами, которые вполне реально разобрать.
[cut=XML-форма]
Код
<!-----[Военный таймер]------>
<army_timer_form x="69" y="518" width="281" height="229">
<texture>ui_mod_timer_main_wnd</texture>
<btn_start x="93" y="81" width="122" height="23">
<texture_e>ui_button_ordinary_e</texture_e>
<texture_t>ui_button_ordinary_t</texture_t>
<texture_h>ui_button_ordinary_h</texture_h>
<text font="letterica16">st_army_timer_start</text>
</btn_start>
<btn_stop x="93" y="115" width="122" height="23">
<texture_e>ui_button_ordinary_e</texture_e>
<texture_t>ui_button_ordinary_t</texture_t>
<texture_h>ui_button_ordinary_h</texture_h>
<text font="letterica16">st_army_timer_reset</text>
</btn_stop>
<btn_close x="93" y="168" width="122" height="23">
<texture_e>ui_button_ordinary_e</texture_e>
<texture_t>ui_button_ordinary_t</texture_t>
<texture_h>ui_button_ordinary_h</texture_h>
<text font="letterica16">st_menu_close</text>
</btn_close>
<timer_value x="115" y="35" width="220" height="16">
<text r="154" g="205" b="50" a="100" align="c" font="letterica16"></text>
</timer_value>
</army_timer_form>
[/cut]
[cut=Скриптовая прорисовка ]
Код
army_timer_value=0
army_timer_deprive=0
army_timer_active=false
class "army_timer" (CUIScriptWnd)
function army_timer:__init(owner) super()
self.owner = owner
self:InitControls()
self:InitCallBacks()
end
function army_timer:__finalize()
end
function army_timer:InitControls()
self:SetWndRect(Frect():set(0,0,1024,768))
local xml = CScriptXmlInit()
xml:ParseFile("ui_mod_elements.xml")
self.army_timer_form=xml:InitStatic("army_timer_form",self)
self:Register(xml:Init3tButton("army_timer_form:btn_start",self.army_timer_form),"btn_start")
self:Register(xml:Init3tButton("army_timer_form:btn_close",self.army_timer_form),"btn_close")
self:Register(xml:Init3tButton("army_timer_form:btn_stop",self.army_timer_form),"btn_stop")
self.timer_value=xml:InitStatic("army_timer_form:timer_value",self.army_timer_form)
end
function army_timer:Update()
CUIScriptWnd.Update(self)
if not object_alive(db.actor) then
self:btn_close()
end
if army_timer_active==true then
army_timer_value=string.format(math.floor(time_global()/1000))-army_timer_deprive
else
if army_timer_value>0 then
army_timer_value=0
end
end
self.timer_value:TextControl():SetText(army_timer_value)
end
function army_timer:InitCallBacks()
self:AddCallback("btn_start",ui_events.BUTTON_CLICKED,self.btn_start,self)
self:AddCallback("btn_stop",ui_events.BUTTON_CLICKED,self.btn_stop,self)
self:AddCallback("btn_close",ui_events.BUTTON_CLICKED,self.btn_close,self)
end
function army_timer:OnKeyboard(dik,keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self:btn_close()
end
end
return true
end
function army_timer:btn_start()
army_timer_active=true
army_timer_deprive=string.format(math.floor(time_global()/1000))
end
function army_timer:btn_stop()
army_timer_active=false
end
function army_timer:btn_close()
give_object_to_actor("army_timer")
self:HideDialog()
end
[/cut]





Сообщение отредактировал FantomICW - Сб, 05.10.2013, 23:07
 
NIVДата: Пн, 07.10.2013, 20:24 | Сообщение # 150
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

FantomICW, сам таймер, может быть и не сложный. Сложно все остальное. Сейчас пытаюсь понять идеологию (sgm_loader.script). Там есть менеджер сохранений, менеджер худа и менеджер таймера. И все их надо переносить. Я ничего не упустил?

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
Поиск: