Главная | Регистрация | Вход | Приветствую Вас | Гость| RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Форум » Навигатор » Модострой » Тут все
Тут все
[PRMT]Myha
Дата: Понедельник, 02.05.2011, 21:59 | Сообщение # 1
Сообщений: 27
Награды: 2  +
Репутация: 2  ±
Замечания:  ±
Статус: Убежал
Мини база знаний!
http://piarforum.forumrpg.ru/viewforum.php?id=12
Ответы пожелания на форум:
http://piar-mod.ucoz.ru/
первый не рабочий! dry


[ (RU) ]
paka
Дата: Четверг, 05.05.2011, 22:16 | Сообщение # 2
Сообщений: 272
Награды: 2  +
Репутация: 4  ±
Замечания:  ±
Статус: Убежал
Да нгрм

[ (RU) ]
stalin
Дата: Пятница, 06.05.2011, 21:42 | Сообщение # 3
Сообщений: 49
Награды: 0  +
Репутация: 2  ±
Замечания:  ±
Статус: Убежал
Новые монстры
Введение
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.
Для примера возьму кошек (уж очень они мне нравятся)
Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().
Вылет при появлении
Обычно сопровождается сообщением в логе:
Arguments : Can't open section 'cat_weak'
Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция
[m_cat_e]:monster_base
Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида
[cat_weak]:m_cat_e
то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:
Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak]
Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:
smart_terrain_choose_interval = 00:15:00
Запускаем, вылетаем с ошибкой:
Arguments : Can't find variable satiety_threshold in [cat_weak]
В общем, добавляем параметры, но кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.
Ну, на всякий случай, нужно добавить еще две строчки:
critical_wound_threshold = 0.4
critical_wound_decrease_quant = 0.
После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит

Добавлено (06.05.2011, 21:42)
---------------------------------------------
Вылет при убийстве
Это знаменитая ошибка:
Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........
Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.
Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной
local killCountProps = {...}
в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:
cat_weak = 1, cat_normal = 2, cat_strong = 3,
Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:
monster_classes = {
кошек нет и здесь, добавляем:
[clsid.cat_s] = "cat",
Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.
Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:
• is_object_monster(obj)
кошек нет, добавляем рядом с собаками:
otype == clsid.cat or
• IsMonster (object, class_id)
кошки есть, ничего не трогаем.
Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку
cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")
и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился

Добавлено (06.05.2011, 21:42)
---------------------------------------------
Вылет при обыске
Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.
Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.
Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки smile )
Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем
icon = ui_frame_error_sign_red
Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.
Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.
Внимание!!!
Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет wink

Добавлено (06.05.2011, 21:42)
---------------------------------------------
это всё что нужно для создания новых монстров


[ (RU) ]
paka
Дата: Пятница, 06.05.2011, 21:45 | Сообщение # 4
Сообщений: 272
Награды: 2  +
Репутация: 4  ±
Замечания:  ±
Статус: Убежал
Вот Сталин молодчик не то что ты Ванёк он и в форумах норм общается и пишет а не кидает сылки

[ (RU) ]
stalin
Дата: Пятница, 06.05.2011, 21:50 | Сообщение # 5
Сообщений: 49
Награды: 0  +
Репутация: 2  ±
Замечания:  ±
Статус: Убежал
Создание квестов
Создание квестов и диалогов
Создание базового диалога
Итак, приступим к созданию диалога, в котором нам будет выдаваться новый квест. Участвующие лица: Сидорович (С) и Меченый (М)
М: Здравствуй, Сидорыч! Есть работенка?
С: О, неужели заглянул к нам на огонек, Меченый? Ладно... ближе к телу... эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось.
М: Без проблем! Уже бегу.
Будем считать, определились с фразами базового диалога. Теперь необходимо добавить его в соответствующем виде, чтобы игре он был «понятен».
Создание «скелета» диалога.
Для того, чтобы добавить наш диалог, необходимо открыть для редактирования файл gamedata\config\gameplay\dialogs_escape.xml
Для тех, кто знаком с языком XML структура данного файла будет ясна с первого взгляда. Но, поподробнее об этом.
Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции:
1. <game_dialogs> и закрывающий к нему - </game_dialogs>
2. <dialog id = «»> закрывающий - </dialog>
3. <phrase_list> - </phrase_list>
4. <phrase id = «»> - </phrase>
5. <text> </text>
6. <next> </next>
В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже.
Поясню, что обозначает каждый тэг в отдельности.
1. Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги);
2. Определяет новый диалог с id = «». Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ;

Добавлено (06.05.2011, 21:49)
---------------------------------------------
3. Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <phrase_list> и </phrase_list> содержатся фразы диалога;
4. Этот тэг определяет фразу с id = «». Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры);
5. Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже;
6. Внутри этого тэга содержится ссылка (в числовом формате) на следующую (или следующие) фразы.
Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога.
<precondition> </precondition>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC.
<action> </action>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг).
<give_info> </give_info>. Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его. Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог. <has_info> </has_info> и <dont_has_info> </dont_has_info> являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие.
Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест.
Создание info_portion'ов
Итак, открываем файл gamedata\config\gameplay\ info_l01escape.xml. Что мы там видим? Правильно, все ту же структуру XML. В данном файле нас интересуют только два тэга:
<info_portion id = “”> </info_portion>
<task > </task>
Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>)
Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста:
<info_portion id = “new_task_started”>
<task>new_task</task>

Добавлено (06.05.2011, 21:49)
---------------------------------------------
</info_portion>
Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task.
<info_portion id = “player_talked_with_wolf”>
</info_portion>
<info_portion id = “player_complete_new_task”>
</info_portion>
Создание нового квеста
Сами квесты содержаться в файлах типа tasks_*****.xml
Откроем файл gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.
Для примера исследуем уже существующий квест:
<game_task id="esc_help_wounded_from_raid" prio="485">
<title>esc_help_wounded_from_raid</title>
<objective>
<text>esc_help_wounded_from_raid_0</text>
<icon>ui_iconsTotal_esc_help_wounded_from_raid</icon>
<function_complete>escape_tasks.task_fox_complete</function_complete>
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
<article>esc_fox_help</article>
</objective>
<objective>
<text>esc_help_wounded_from_raid_1</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_fox_heal</infoportion_complete>
<infoportion_fail>esc_dogs_return</infoportion_fail>
</objective>
<objective>
<text>esc_help_wounded_from_raid_2</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>escape_stalker_done</infoportion_complete>
</objective>
</game_task>
По кусочкам:
<game_task id="esc_help_wounded_from_raid" prio="485"> </game_task>
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = “” задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.
<title>esc_help_wounded_from_raid</title>
Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml.

Добавлено (06.05.2011, 21:49)
---------------------------------------------
<function_complete>escape_tasks.task_fox_complete</function_complete>
Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.
<infoportion_complete>escape_fox_heal</infoportion_complete>
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.
<infoportion_fail>esc_dogs_return</infoportion_fail>
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.
<map_location_type hint="esc_fox">green_location</map_location_type>
Создает указатель на карте с подсказкой esc_fox и типом green_location.
<object_story_id>Escape_stalker_from_raid</object_story_id>
Указывает на sid из файла gamedata\config\game_story_ids.ltx
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
Автоматически устанавливает данную подзадачу в положение «Выполнено», если у игрока есть данный info_portion. //!!!!!!Не уверен – не пользовался не разу.
<text>esc_help_wounded_from_raid_0</text>
Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст.
Создадим задание, которое потребуется нам для диалога:
<game_task id=”new_task”>
<title>Поговорить с Волком</title>
<objective>
<text>Вернуться к Сидорычу</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_Trader</object_story_id>
<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
<objective>
<text>Поговорить с Волком</text>
<map_location_type hint="volk">green_location</map_location_type>
<object_story_id>Escape_novice_lager_volk</object_story_id>
<infoportion_complete>player_talked_with_wolf</ infoportion_complete>
</objective>
<objective>
<text>Вернуться к Сидорычу</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_Trader</object_story_id>
<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
</game_task>

Добавлено (06.05.2011, 21:49)
---------------------------------------------
Теперь создадим скелеты диалогов для нашего квеста. Потребуется три: один для Волка и два для Сидорыча.
<dialog id = “volk_new_quest”>
<has_info> new_task_started </has_info>
<dont_has_info> player_talked_with_wolf</dont_has_info>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
<phrase id = “0”>
<text>esc_volk_new_quest_0</text>
<next>1</next>
</phrase>
<phrase id = “1”>
<text>esc_volk_new_quest_1</text>
<give_info>player_talked_with_wolf</give_info>
<next>2</next>
</phrase>
<phrase id = “2”>
<text>esc_volk_new_quest_2</text>
<action>dialogs.break_dialog</action>
</phrase>

</prhase_list>
</dialog>

<dialog id = “esc_trader_new_quest”>
<dont_has_info> player_complete_new_task </dont_has_info>
<dont_has_info> player_talked_with_wolf</dont_has_info>
<phrase_list>
<phrase id = “0”>
<text>esc_trader_new_quest _0</text>
<next>1</next>
</phrase>
<phrase id = “1”>
<text>esc_trader_new_quest _1</text>
<give_info>new_task_started </give_info>
<next>2</next>
</phrase>
<phrase id = “2”>
<text>esc_trader_new_quest _2</text>
<action>dialogs.break_dialog</action>
</phrase>

</prhase_list>
</dialog>

<dialog id = “esc_trader_new_quest_complete”>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
<phrase id = “0”>
<text> esc_trader_new_quest_complete _0</text>
<next>1</next>
</phrase>
<phrase id = “1”>
<text> esc_trader_new_quest_complete _1</text>
<give_info>player_complete_new_task </give_info>
<next>2</next>
</phrase>
<phrase id = “2”>
<text> esc_trader_new_quest_complete _2</text>
<action>dialogs.break_dialog</action>
</phrase>
</prhase_list>
</dialog>

Добавлено (06.05.2011, 21:50)
---------------------------------------------
Все «скелеты» добавляем в файл dialogs_escape.xml. Между <game_dialogs> и <dialog id=...>!
Примечание: посмотрите на уже готовые диалоги, которые создали разработчики игры – это облегчит вам жизнь.
Теперь бежим в файл character_desc_escape.xml
Ищем там NPC с id = “escape_trader” и добавляем два новых <actor_dialog></actor_dialog>:
<actor_dialog>esc_trader_new_quest_complete </actor_dialog>
<actor_dialog>esc_trader_new_quest </actor_dialog>
Там же ищем NPC с id = “esc_wolf” и добавляем один актор_диалог:
<actor_dialog> volk_new_quest </actor_dialog>
Примечание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:
<string id=" esc_trader_new_quest_complete_0 ">
<text>Все, я выполнил поручение Влока!</text>
</string>
<string id=" esc_trader_new_quest_complete_1 ">
<text>Молодец, Меченый. На тебя можно положиться.</text>
</string>
<string id=" esc_trader_new_quest_complete_2 ">
<text>Рад был помочь, Сидорыч.</text>
</string>
<string id=" esc_trader_new_quest _0 ">
<text> Здравствуй, Сидорыч! Есть работенка?</text>
</string>
<string id=" esc_trader_new_quest _1 ">
<text> О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая
просьба: сбегай к Волку, у него что-то намечалось.</text>
</string>
<string id=" esc_trader_new_quest _2">
<text> Без проблем! Уже бегу.</text>
</string>
<string id="esc_volk_new_quest_0">
<text>Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.</text>
</string>
<string id="esc_volk_new_quest_1">
<text>Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и
скажи, что все хорошо.</text>
</string>
<string id="esc_volk_new_quest_2">
<text>Все, ухожу.</text>
</string>
Все! Поздравляю! Вы только что написали новый квест.


[ (RU) ]
paka
Дата: Пятница, 06.05.2011, 21:50 | Сообщение # 6
Сообщений: 272
Награды: 2  +
Репутация: 4  ±
Замечания:  ±
Статус: Убежал
Да эт интересно

[ (RU) ]
stalin
Дата: Пятница, 06.05.2011, 21:51 | Сообщение # 7
Сообщений: 49
Награды: 0  +
Репутация: 2  ±
Замечания:  ±
Статус: Убежал
Вот всё что нужно для создания квестов !!

Добавлено (06.05.2011, 21:51)
---------------------------------------------
Создание новой группировки
Новая группировка
Сегодня мы создадим новую группировку. Назовем её, скажем, "Ветер". Не суть важно.
Практика
Базовый уровень
1. Для начала в game_relations.ltx и в таблицу отношений группировок в конце и в заголовке добавляем название своей группировки и коэффициенты отношений к ней у других группировок. Также, не забываем прописать её собственное отношение к другим группировкам:
[communities_relations]
;|actor |act_dol|act_fre|stalker|monolit|militar|killer |ecolog |dolg |freedom|bandit |zombied|strange|trader|arena_enemy|wind|
;=================================================================================================================================
actor = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
actor_dolg = 0, 0, 0, 0, -5000, -500, -5000, 5000, 600, -5000, -5000, -5000, 0, 0, -5000
actor_freedom = 0, 0, 0, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, -5000, 0

stalker = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
monolith = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, 5000, 5000, -5000, 0, -5000, 0
military = -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, -5000, -5000, -5000, 0, 0, -5000, 0
killer = -5000, -5000, 0, -5000, -5000, -5000, 5000, -5000, -5000, -5000, 0, -5000, -5000, 0, -5000, 0
ecolog = 0, 600, -5000, 0, -5000, 1000, -5000, 5000, 500, -5000, -500, -5000, 0, 0, 0, 0
dolg = 0, 600, -5000, 0, -5000, -500, -5000, 5000, 5000, -5000, -5000, -5000, 0, 0, 0, 0
freedom = 0, -5000, 600, 0, -5000, -5000, -5000, -1500, -5000, 5000, 0, -5000, 0, 0, 0, 0
bandit = -5000, -5000, 0, -5000, -5000, -500, 0, -5000, -5000, 0, 0, -5000, -5000, 0, -5000, 0
zombied = -5000, -5000, -5000, -5000, 5000, -5000, -5000, -5000, -5000, -5000, -5000, 5000, -5000, 0, -5000, 0
stranger = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -500, -5000, 0, 0, 0, 0
trader = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
arena_enemy = -5000, -5000, -5000, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, 0, 0, 0

wind = 0, 0, 0, 0, -5000, -5000, -5000, 0, 0, 0, -5000, -5000, 0, 0, -5000, 0
Также, изменим эту строку, добавив туда имя и номер группировки:
;названия группировок
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10,
freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18,
Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.
Далее, в разделе [communities_sympathy] в конце добавляем свою группировку и коэффициент "впечатлительности" - чем он меньше, тем меньше отношение группировки будет меняться к вам в целом:
[communities_sympathy]
actor = 0.0
actor_dolg = 0.0
actor_freedom = 0.0
stalker = 0.0
monolith = 0.0
military = 0.0
killer = 0.0
ecolog = 0.0
d olg = 0.1
freedom = 0.1
bandit = 0.0
zombied = 0.0
trader = 0.0
stranger = 0.0
arena_enemy = 0.0
wind = 0.0
2. После этого в файле death_manager.script ищем строку local community_list и в скобках добавляем название своей группировки:
function init_drop_settings()
local community_list = { "stalker", "dolg", "freedom", "bandit", "military", "zombied", "ecolog", "killer", "monolith",
"arena_enemy", "actor_dolg", "wind" }
3. В файле death_items_by_communities.ltx пишем [x]:stalker (вместо x - название вашей группировки):
[...]
af_dummy_spring = 0
af_fuzz_kolobok = 0

;Еда
vodka = 0

[arena_enemy]
[actor_dolg]

[wind]: stalker
bread = 0
kolbasa = 0
vodka = 0
energy_drink = 0.3
4. Если предусматривается респавн бойцов новой группировки, в se_respawn.script прописываем в local simMaxCount = { после строчек с зомбированными сталкерами строку:
wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,

Добавлено (06.05.2011, 21:51)
---------------------------------------------
5. Чтобы при убийстве непися новой группировки игра не вылетала в xr_statistic.script,
после строки:
zombied_novice = 1, zombied_experienced = 2, zombied_veteran = 3, zombied_master = 4,
пишем
dark_stalker_novice = 1, dark_stalker_experienced = 2, dark_stalker_veteran = 3, dark_stalker_master = 4,

6. Ну а в character_desk_x.xml выбираем любого NPC (или группу) и меняем группировку на свою:
<!---esc_wolf--->
<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>

<class>esc_wolf</class>
<community>wind</community>
[...]
7. Чтобы у персонажа в графе "Группировка" отображалось не "wind", а "Ветер", зарегистрируем соответствующую строку в файле string_table_general.xml:
<?xml version="1.0" encoding="windows-1251" ?>
<string_table>
<string id="wind">
<text>Ветер</text>
</string>
<string id="actor">
<text>Одиночка</text>
</string>
[...]
8. Существует возможность создать для нашей новой группировки места, где они будут ходить (*_terrain брать из m_stalker.ltx):
То есть, к примеру, существует секция:
[stalker_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
Тогда можно создать новую, по аналогии:
[wind_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
010,001,255,255 ;Разрешено ходить по опасным местам на янтаре

Здесь, очевидно, указаны координаты самого уровня. Для каждого уровня существует своя начальная координата.
Продвинутый уровень
Такой метод достаточно примитивен. Это не полноценная группировка. Нам нужны соответствующие диалоги, возможность получения квестов и вступления в группировку, уникальные NPC.
Квесты
Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.
Во-первых, пропишите в список диалогов персонажа следующие строки:
<actor_dialog>[что-нибудь]_dialog</actor_dialog>
<actor_dialog>[что-нибудь]_reward</actor_dialog>
Примеры названий: tm_trader_dialog, tm_wolf_dialog...
Внимание! Метод не проверен.
Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.

    [...]

    ;--------Wind------------------------
    ;----------Kill Stalker----
    wind_kill_stalker
    ;----------Find Item----
    wind_find_item

    [...]

    ;tasks for Wind

    [wind_find_item]
    type = find_item
    community = actor
    text = [ссылка на текст с рассказом заказчика о задании]
    description = [ссылка на текст с описанием задания]
    parent = [имя NPC-заказчика]
    target = scientific_outfit
    reward_money = 5000
    reward_reputation = +5
    reward_rank = 4
    reward_item = wpn_sig_m1
    time = 86400

    [wind_kill_stalker]
    type = kill_stalker
    community = actor
    text = [ссылка на текст с рассказом заказчика о задании]
    description = [ссылка на текст с описанием задания]
    parent = [имя NPC-заказчика]
    target = sim_stalker_master_master
    reward_money = 4000
    reward_reputation = +5
    reward_rank = 9


[ (RU) ]
paka
Дата: Пятница, 06.05.2011, 21:52 | Сообщение # 8
Сообщений: 272
Награды: 2  +
Репутация: 4  ±
Замечания:  ±
Статус: Убежал
Круто и ты это можешь

[ (RU) ]
stalin
Дата: Пятница, 06.05.2011, 22:11 | Сообщение # 9
Сообщений: 49
Награды: 0  +
Репутация: 2  ±
Замечания:  ±
Статус: Убежал
reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap
time = 86400
Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании task_manager.ltx читайте в уроке, посвященном однотипным квестам.
Да, и зарегистрируйте сами ветки диалогов в файле dialogs.xml. Вот пример того, как это сделано для заданий "Долга":
<dialog id="tm_dolg_dialog" priority="-1">
<init_func>task_manager.init_dolg_task_dialog</init_func>
</dialog>
<dialog id="tm_dolg_reward" priority="0">
<init_func>task_manager.init_dolg_reward_dialog</init_func>
<precondition>task_manager.has_active_vendor_task</precondition>
</dialog>
Соответственно, пройдем туда, куда указывает строка task_manager.init_dolg_task_dialog - в task_manager.script:
function init_dolg_task_dialog(dlg)
get_random_task():init_task_dialog(dlg, "dolg")
По аналогии делаем и с нашим "Ветром".
Вступление в группировку
Реализуем возможность вступления в группировку.
Прописываем в dialogs.script такие action'ы:
-----------------------------------------------------------------------------------
-- Community
-----------------------------------------------------------------------------------

[...]

function actor_set_wind (actor, npc)
printf ("ACTOR NOW IN WIND COMMUNITY"
if db.actor then
db.actor:set_character_community ("actor_wind", 0, 0)
end
return true
end
После чего создадим диалог, и сделаем в нем фразу с action'ом вида <action>actor_set_wind</action>. Советую изучить урок, посвященный диалогам.
Новые NPC
Лучше всего всё вышеприведенное повесить на нового, уникального персонажа. Способ его спавна описан

Добавлено (06.05.2011, 21:52)
---------------------------------------------
это всё для создания своей группировки !!

Добавлено (06.05.2011, 21:53)
---------------------------------------------
Да всё это я могу сделать за 2 дня =на доработку 5 дней в общем гдето за 1-2 недели готов новый мод !!

Добавлено (06.05.2011, 22:11)
---------------------------------------------
Вот короче как создавать телепорт !!!!!

В игре существует такой объект как "zone_teleport", но если мы его создадим через create, то он будет выглядеть и переливаться как настоящий телепорт, но телепортировать нас куда-либо увы не сможет. Связано это с тем что, у аномалий ( а телепорт это такая разновидность аномалии ) параметры задаются хитромудро, через all.spawn. Вобщем штатным способом телепорты без полнофункционального редактора карт не получить (хотя возможно я не прав уже после написания этого текста появились идеи как это сделать через all.spawn). Значит на нашу долю остаються способы "не штатные" wink Реализуем самый простой. Будем считать что у нас на карте есть квадрат с заданными координатами при попадании в который актера должно переместить в точку с другими координатами. Для этого будем периодически проверять координаты актера, и если он в квадрате - перемещяем. Вот в краце принцип действия нашего "самодельного" телепорта.
Реализация

В каталоге gamedata\scripts\ Создадим файл bind_mteleport.script с логикой работы нашего телепорта.
-- ************************************************
-- ** Imp **
-- ** Биндер самодельных телепортов **
-- ** Поддерживает работу самопальных телепортов **
-- ************************************************

local teleport_binders ={} -- Список телепортов

function abs_comp(a,b)
-- Служебная функция вычисления разности
if( a < b) then
return (b - a)
else
return (a - b)
end
end

function teleportate(x,y,z)
-- Функция телепортации
local a = vector()
-- Задаем координаты
a.x = x
a.y = y
a.z = z

-- Сама телепортация
db.actor:set_actor_position(a)

-- Звуковое сопровождение
local snd_obj = xr_sound.get_safe_sound_object([[affects\tinnitus3a]])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

end

function actor_update(delta)
local i,v,acter_poz,s

-- Получим позицию актера (что-бы каждый раз не запрашивать)
acter_poz = db.actor:position()

-- Проверяем наши телепорты
for i, v in pairs(teleport_binders) do
s = v.parametrs

local obj = level.object_by_id( i )
if obj ~= nil then
-- Наш телепорт в онлайне проверяем дальше
if s.teleporte ~= nil and s.teleporte ~= false then
-- Телепорт запущен
if ( time_global() <= s.time ) then
-- Если время отведенное на показ спецэфектов
-- прошло, производим телепортацию
teleportate(s.poz_x,s.poz_y,s.poz_z)
if s.rotate ~= nil then
db.actor:set_actor_direction(s.rotate)
end
s.teleporte = false
end
return
end

-- Пороверим не забрел-ли актер в наш телепорт
if (abs_comp(s.x, acter_poz.x)< v.parametrs.radius and
abs_comp(s.z, acter_poz.z)< v.parametrs.radius and
abs_comp(s.y, acter_poz.y)< v.parametrs.z_radius) then
-- Актер в зоне действия телепорта, запустим телепорт
s["teleporte"] = true
s["time"] = time_global() + 500

-- Запускаем спецэфекты телепортации
level.add_pp_effector ("teleport.ppe", 2006, false)
end
end
end
end

function bind( obj )
obj:bind_object( restrictor_teleport( obj ) )
end

----------------------------------------------------------------------------------------------------
class "restrictor_teleport" ( object_binder )

function restrictor_teleport:__init(obj, char_ini) super(obj)
end

function restrictor_teleport:net_spawn(data)
local char_ini = system_ini()

Добавлено (06.05.2011, 22:11)
---------------------------------------------
-- Если это телепорт то занесем его в специальный список телепортов
if self.teleport == true then
teleport_binders[self.object:id()] = self

-- Заполним таблицу параметров
self["parametrs"] = {}
if char_ini:line_exist(self.section, "radius") then
self.parametrs["radius"] = tonumber(char_ini:r_string(self.section, "radius"))
else
self.parametrs["radius"] = 2 -- Дефолтный радиус по xy
end
if char_ini:line_exist(self.section, "z_radius") then
self.parametrs["z_radius"] = tonumber(char_ini:r_string(self.section, "z_radius"))
else
self.parametrs["z_radius"] = self.parametrs["radius"] -- если радиус высоты не задан то задаем равным радиусу xy
end

-- Запомним позицию что-бы каждый раз не считать
local s_obj = alife():object(self.object:id())
self.parametrs["x"] = tonumber(s_obj.position.x);
self.parametrs["y"] = tonumber(s_obj.position.y);
self.parametrs["z"] = tonumber(s_obj.position.z);

-- Запомним координаты куда телепортимся
self.parametrs["poz_x"] = tonumber(char_ini:r_string(self.section, "poz_x"))
self.parametrs["poz_y"] = tonumber(char_ini:r_string(self.section, "poz_y"))
self.parametrs["poz_z"] = tonumber(char_ini:r_string(self.section, "poz_z"))

if char_ini:line_exist(self.section, "rotate") then
self.parametrs["rotate"] = tonumber(char_ini:r_string(self.section, "rotate"))
end
end
return true
end

function restrictor_teleport:net_destroy()
-- Удаляем наш телепорт
teleport_binders[self.object:id()] = nil
self.parametrs = nil
object_binder.net_destroy(self)
end

function restrictor_teleport:reload(section)
local char_ini = system_ini()

self.section = section
-- Если это телепорт то
if char_ini ~= nil and char_ini:line_exist(self.section, "teleport") then
self["teleport"] = true
end
end

Для постоянного обновления нужно прицепить функцию actor_update() к биндеру актера, для чего в файле bind_stalker.script найдем функцию:

function actor_binder:update(delta)

В ней найдем вызов обновления рестрикторов bind_restrictor.actor_update(delta) под которым вставим строку с вызовом нашей функции обновления: bind_mteleport.actor_update(delta)

Все с программной частью закончили, теперь задаем данные телепорта.

В каталоге gamedata\config\misc открываем файл zone_teleport.ltx и в конце файла добавляем следующие строки описывающие конкретный телепорт:
[m_teleport_1]:zone_teleport
teleport = standart
script_binding = bind_mteleport.bind
;Параметры нашего телепорта
radius = 2
;Высота захвата телепорта
z_radius = 2

;Куда телепортируемся (телепортация всегда идет в пределах карты)
poz_x = 22.78
poz_y = 20.35
poz_z = 659.24

; Угол зрения при появлении. Если параметра нет то не меняется.
rotate = 1.5

Параметры нашего телепорта:
radius - на самом деле не радиус, а половина длинны стороны нашего квадрата (в начале я хотел сделать его кругом, но посчитал, что лучше не тратить процессорное врямя по пусту). Центром квадрата является точка респавна телепорта.
z_radius - высота нашего телепорта.
poz_x, poz_y, poz_z - координаты точки телепортации.
rotate - Угол поворота после телепортации от оси X (я не разбирался в каких единицах задается, но 1.5 примерно равно 90 градусов). Если параметр удалить то будет оставатья угол под которым актер вошел в телепорт.
Использование

Теперь с помощью create создадим наш телепорт: Пример:
local obj
local a = vector()
a.x = -244.55
a.y = -19.46
a.z = -125.42
obj = alife():create("m_teleport_1",a,12829,8,65535)

Создаст телепорт возле выхода из бункера Сидоровича. Наш телепорт перебрасывает игрока на вышку блокпоста (перед выходом с уровня).

Все!


[ (RU) ]
paka
Дата: Понедельник, 09.05.2011, 10:01 | Сообщение # 10
Сообщений: 272
Награды: 2  +
Репутация: 4  ±
Замечания:  ±
Статус: Убежал
Да а ты знаешь как вылет исправить при перехода на др локацию

[ (RU) ]
Форум » Навигатор » Модострой » Тут все
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:
Дизайнер сайта Ангел