Создание нового НПС - Страница 2 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

Создание нового НПС


Рекомендуемые сообщения

можно ему работу в гулаге задать с определенными свойствами-как Шустрому или Толику или в условии спавна прописать инфопоршни (пример Волк -спавниться в лагере ,выполняет работу,а при получении определенного инфопоршня-исчезеет с кордона и появляется на складах) ну или не стопроцентный способ-по инфопоршню

изменить его характеристики .чтобы он по условию под гулаг не попадал (например поднять ранг до ветерана,которых к примеру на кордоне быть не должно или сменить группировку или имя)самый простой и надежный первый способ-выносишь логику в отдельный файл(в алспавне в костом дате пишешь имя файла логики в конфиг/стриптс-а внем расписываешь в начале основная логика а дальше условие при выполнении которого схема переключается и логика меняется(посмотри файл тех же Толика или Шустрого,нужна распакованная геймдата оригинальной игры)

Изменено пользователем gruber

Здравствуйте великие умы форума АМК! Можете сделать урок по созданию НПС в ЧН. Я пробовал а ничего не получается.

Объясните всё по крупиночкам языком ламеров :) что из себя представляет конфиг НПС в игре. (какие файлы за это отвечают + ещё подробная теория)

gruber

 

Это не совсем то что хотелось

Нужно чтоб НПС находясь под гулагом любым в определенное время отправился по своим

делам тоесть в none = true а погуляв некоторое время стал снова доступен смартгулагам

любым верней тем которым подходит

AKKK1,

Можно сделать по-другому.

Создай свой гулаг для этого непися. И тогда схема логики может быть такой.

НПС находится под каким-нибудь гулагом. Затем по инфопоршину он покидает этот гулаг и идет в гулаг, который ты создал (аналогия твоему варианту, когда он гуляет без гулага). Потом после еще одного инфопоршина он покидает новый гулаг и если ты ему ничего больше не пропишешь, то он захватится каким-либо гулагом, где есть свободное место.

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

Kostya V

 

Спасибо

но наскольло я понимаю невозможно создать смартгул на всю локу ? или можно ?

Как заставить непися для начала просто в определенное время покинуть гулаг перейти под свою логику но не в другой гулаг если он конечно не на всю локу

 

допустим начало игры новички у костра в 5.20 один из них должен уйти в [smartterain] none = true

а в 12.00 вернутся обратно или к любому другому camp

 

НПС находится под каким-нибудь гулагом. Затем по инфопоршину он покидает этот гулаг и идет в гулаг, который ты создал о

 

 

можноли создать на локе штук 30 гулагов и чтоб НПС по инфопоршу выбирал их рандомно

Pihan13, Там не трудно.....Скачай прогу(у меня в подписи),создай пробного НПС и посмотри фаилы на выходе... и разбирайся....

ЗЫ:Это не реклама моей программы :),хотя могло так выглядеть...

AKKK1,

Я не знаю, что значит гулаг на всю локу. По-моему, надо просто создать гулаг и прописать ему работу какую-нибудь. А вот работа этого гулага может быть уже по всему уровню. Как уже пропишешь.

Ты просил подсказать, как это можно сделать, я сказал. Расписывать все это не буду.

По поводу рандомности не знаю.

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

Гулаг на всю локу создать, конечно же, можно.

В загрузке работ проставить online = true и всё. Наделать пути, там где необходимо, прописать логику.

А для непися, который должен покинуть своё место на некоторое время, можно сделать примерно следующее:

[первая_логика]
on_info = {!is_day} вторая_логика

[вторая_логика]
on_info = {=is_day} первая_логика

Это условно. Можно и другие условия придумать. Функция is_day находится в xr_conditions.script. Можно создать по её аналогии другую, с другим промежутком времени. Назвать, к примеру, is_utro :)

function is_utro (actor, npc)
    return level.get_time_hours() >= 5 and level.get_time_hours() < 12
end

То есть, с 5ти до 12ти непись будет использовать одну логику, а в остальное время другую.

Конечно, можно заставить и покидать гулаг - прописать индивидуальную логику и имя_гулага = true - но только при этом гулаг необходимо распускать, используя cond = {+/-условие/инфопоршен}, по которому гулаг будет прекращать\возобновлять свою работу. Только это не есть хорошо, ибо все остальные жители так же будут покидать гулаг, если его отключить. Проще пользовать первый вариант - менять логику по условию или инфопоршену, не затрагивая остальных "жителей".

Ну и ещё, как вариант, можно менять состояние всего гулага. В один промежуток времени гулаг в 0-ом состоянии, в другой промежуток - в 1-ом - делается это в скриптах загрузки работ:

    if type == "имя_гулага" then
        return function(gulag)
            if db.actor ~= nil then
                if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 12 ) then
                    return 0
                else
                    return 1
                end
            else
                return gulag.state
            end
        end
    end

 

Изменено пользователем WAWKA

Спасибо если нельзя выдрать непись из гулага то можноли использовать логику гулага для НПС

Тоесть если НПС прописать например это с определенными условиями конечно

 

 

сидящие днём у костра

[logic@esc_lager_kamp1]

active = kamp1@esc_lager

 

[kamp1@esc_lager]

center_point = camp_center

path_walk = camp_center_task

soundgroup = esc_lager

meet = meet@lager

 

 

пойдет он k костру в лагере новичков ?

и если пойдет то ниче что он четвертым будет ?

Привет Всем! Вот и я решил "попробывать" себя в моддинге. Вроде всё сделал как написано, игра нормально загружается (без вылета), а моего НПС нет... Где я мог ошибиться, раз нет вылета? Соответственно лог не прикладываю.

Изменено пользователем pastor

)))))))))))))))))))))))))))))))))

меченый(стрелок), честно говоря не знаю... Но если это есть в уроке, то скорее всего да. Где и как это проверить? Кстати, если нет вылета, но я его не заспавнил, значит я всё правильно сделал? :) И ещё, я так понимаю, что НПС должен появиться сразу?!

)))))))))))))))))))))))))))))))))

pastor, необязательно если его нет и не вылетела правильно. Допустим ты в пути к визуалу допустил ошибку или впихнул ему такой предмет, которого нет в игре, либо допустил ошибку в его логике. Игра не вылетет, но в момент его спавна (экшеном из диалога например) игра вылетет

проверено на собственном опыте! ;)

'Pihan13' В том и дело, что, теорретически, спавниться он должен сразу (без диалога с кем либо). Ещё я понял, что новая игра для его появления не нужна?!

)))))))))))))))))))))))))))))))))

новая игра не нужна. скорее всего ты инфопоршень не туда вставил и он не появился.

Вот -

Всё наш НПС будет стоять на месте своего спауна. Едем дальше. Нам надо активировать нашего персоонажа. для этого мы должны вставить строку:

Код

<action>esc_unik_npc.esc_unik_npc</action>

Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml (gamedata/gameplay) под Код:

Код

<game_information_portions>

 

Код

<info_portion id="storyline_actor_start">

<task>storyline_eliminate_gunslinger</task>

 

Выглядеть это будет так:

 

Код:

Код

<game_information_portions>

<info_portion id="storyline_actor_start">

<task>storyline_eliminate_gunslinger</task>

<action>esc_unik_npc.esc_unik_npc</action>

</info_portion>

 

 

Добавлено через 2 мин.:

Кстати, в статье ошибку с

$spawn = "respawn\esc_unik_npc"

исправил

Изменено пользователем SCRIPT

Thank you for your honesty.

Now fuck off and die.

pastor, почитал урок и кое-что понял, в уроке спавн непися висит на инфопоршне, а ты создал новый инфопоршень, который у тебя не выдается, по этому и спавна нет. Вообщем сделай так:

<?xml version='1.0' encoding="windows-1251"?>

<game_information_portions>
  <info_portion id="storyline_actor_start">
    <task>storyline_eliminate_gunslinger</task>
    <action>new_krendel.new_krendel</action>
  </info_portion>

  <info_portion id="global_dialogs">
    <dialog>actor_break_dialog</dialog>
<!--    <dialog>actor_help_wounded</dialog>   -->
  </info_portion>


  <info_portion id="terrain_test">
  </info_portion>


  <!-- special info portion that sends to actor when it
    use in-game UI (PDA, Inventory, etc)-->
    
    <info_portion id="ui_pda">
        <disable>ui_pda_hide</disable>
    </info_portion>
    <info_portion id="ui_pda_hide">
        <disable>ui_pda</disable>
    </info_portion>
          
   <info_portion id="ui_pda_contacts"></info_portion>
   <info_portion id="ui_pda_contacts_hide"></info_portion>
   
   <info_portion id="ui_pda_map_local"></info_portion>
   <info_portion id="ui_pda_map_global"></info_portion>
   
   <info_portion id="ui_pda_news"></info_portion>
   <info_portion id="ui_pda_news_hide"></info_portion>
   
   <info_portion id="ui_pda_jobs_failed"></info_portion>
   <info_portion id="ui_pda_jobs_accomplished"></info_portion>
   <info_portion id="ui_pda_jobs_current"></info_portion>
   
    <info_portion id="ui_pda_jobs">
        <disable>ui_pda_jobs_hide</disable>
    </info_portion>
    <info_portion id="ui_pda_jobs_hide">
        <disable>ui_pda_jobs</disable>
    </info_portion>

   
   <info_portion id="ui_pda_contracts"></info_portion>
   
   <info_portion id="ui_pda_diary"></info_portion>
   <info_portion id="ui_pda_diary_hide"></info_portion>
      
   
   <info_portion id="ui_pda_encyclopedia"></info_portion>
   <info_portion id="ui_pda_encyclopedia_hide"></info_portion>
   
   <info_portion id="ui_pda_actor_info"></info_portion>
   <info_portion id="ui_pda_ranking"></info_portion>
   <info_portion id="ui_pda_events"></info_portion>
   
   <info_portion id="ui_inventory">
        <disable>ui_inventory_hide</disable>
   </info_portion>
   <info_portion id="ui_inventory_hide">
        <disable>ui_inventory</disable>
   </info_portion>

    <info_portion id="ui_talk">
        <disable>ui_talk_hide</disable>
    </info_portion>
    <info_portion id="ui_talk_hide">
        <disable>ui_talk</disable>
    </info_portion>

    <info_portion id="ui_trade">
        <disable>ui_trade_hide</disable>
    </info_portion>
    <info_portion id="ui_trade_hide">
        <disable>ui_trade</disable>
    </info_portion>

    <info_portion id="ui_car_body">
        <disable>ui_car_body_hide</disable>
    </info_portion>
    <info_portion id="ui_car_body_hide">
        <disable>ui_car_body</disable>
    </info_portion>


   <info_portion id="tutorial_part_15_hide_weapon"></info_portion>


    <info_portion id="autojump_enabled"></info_portion>

    <!--  kostya level  -->
    <info_portion id="peshera_code_door_unlocked"></info_portion>
    <info_portion id="peshera_code_door_unlocked2"></info_portion>
    <info_portion id="peshera_code_door_unlocked3"></info_portion>
    <info_portion id="peshera_code_door_unlocked4"></info_portion>
    <info_portion id="spawn_teleport_exit"></info_portion>
     <info_portion id="spawn_teleport_hospital"></info_portion>
    <info_portion id="krovosos_spawn"></info_portion>
    <info_portion id="krovosos_spawn2"></info_portion>
     <info_portion id="generators_code_door_unlocked"></info_portion>
     <info_portion id="red_forest_open"></info_portion>
    <info_portion id="red_forest_open2"></info_portion>


</game_information_portions>

 

Возможно всё, ну или почти всё.

Моя инструкция по спавну NPC через скрипт в ЧН

(опишу всё довольно понятно)

Чтож приступим :)

для начала берём файл:

gamedata\configs\gameplay\character_desc_***.xml (*** - имя локации, но это не важно т.к. например прописали мы нашего нпс в character_desc_escape.xml, его спокойно можно будет спавнить через скрипт скажем на болотах.)

в этот файл в самом конце есть тэг <xml> и теперь ПЕРЕД НИМ вставляем "основу":

<specific_character id="esc_nash_npc" team_default = "1">
<name>esc_nash</name>
<icon>ui_npc_vlad</icon>
<map_icon x="1" y="0"></map_icon>
<bio>Новичок.</bio> 
<class>esc_nash_npc</class> 
<community>freedom</community>  
<terrain_sect>stalker_terrain</terrain_sect> 
<snd_config>characters_voice\human_02\freedom\</snd_config>
<rank>50</rank>
<reputation>13</reputation>
<money min="0" max="1400" infinitive="0"/>
<visual>actors\stalker_monolith\stalker_monolith_2</visual>

<supplies>
[spawn] \n
device_torch \n
wpn_pb \n
ammo_9x18_fmj = 2 \n
</supplies>
</specific_character>

 

<specific_character id="esc_nash_npc" team_default = "1">

<name>esc_nash</name> - имя можно указать GENERATE_NAME_stalker, GENERATE_NAME_bandit... тогда будет генериться случайное имя, но у нас есть определённое имя - esc_nash. куда с ним дальше объясню позднее

<icon>ui_npc_vlad</icon> иконка нашего при обыске и шмоне трупа (объясню позднее)

<map_icon x="1" y="0"></map_icon> - хз что такое, по походу иконка на карте

<bio>Новичок.</bio> - абсолютно нигде не учавствует (в билде 1935 это можно было читать по ПДА)

<class>esc_nash_npc</class> - класс (объясню и создадим позднее)

<community>freedom</community> - группировка к которой принадлежит наш НПС (можно указать stalker, freedom, monolith ect.)

<terrain_sect>stalker_terrain</terrain_sect> - smart-terrain (так и указывать stalker_terrain)

<snd_config>characters_voice\human_02\freedom\</snd_config> (голосовой конфиг. распакуйте файл Localization\xrussian.db. ВНИМАНИЕ!!! если указать конфиг вояк и наш НПС будет другом, то будут вылеты - у вояк какогото там звука нету)

<rank>50</rank> - ранг (от 0 до 1000) вроде распределяется как новичок, опытный, мастер, ветеран,...

<reputation>13</reputation> - репутация (от 0 до 1000) репутация как на форуме АМК - у кого больше тот главнее (шутка). От неё зависит ВРОДЕ за сколько мы будем сдавать ему хабар и он нам.(т.е. если у него выше, то мы ему дёшево будем, а он нам дорого)

<money min="0" max="1400" infinitive="0"/> - шальные наличные. min="0" самый минимум который может у него быть, max="1400" и так понятно. поставив infinitive="1" у него будут бесконечные (например у торговцев ---)

<visual>actors\stalker_monolith\stalker_monolith_2</visual> - путь до модели "визуала" - любой файл в папке GAMEDATA\meshes\actors ну и соотв в подпапках.

<supplies> - открывает "снабжение"

[spawn] \n - это не трогаем

device_torch \n \\\\ сюда можно добавлять свое к примеру чтоб выдать НПС АК74, пишем ему строку wpn_ak74 \n

wpn_pb \n

ammo_9x18_fmj = 2 \n

</supplies> - закрывает"снабжение"

</specific_character>

 

 

Далее:

открываем gamedata\configs\creatures\spawn_sections_***.ltx (*** - имя локи. как и в предидущем случае неважно)

добавляем:

;наш персонаж
[esc_nash_npc]:stalker; Здесь esc_nash_npc - что вместо этого напишем, то и пропишем для спавна. или это сам класс нпс (в профиле его <class>esc_nash_npc</class>)
$spawn = "respawn\esc_nash_npc"
character_profile = esc_nash_npc; то,  что мы прописали в character_desc_*** (<specific_character id="esc_nash_npc"...)
spec_rank = veteran;ранг. на этот раз не цыфрами а словами (master, veteran...)
community = freedom;опять группировка. хотя если вы в профиле указали скажем freedom, а тут stalker, то вылета не будет
custom_data = scripts\escape\esc_nash_npc.ltx; custom data (в будующем кастомдата) путь до ltx - файла логики

 

Логика!

создаём файл esc_nash_npc.ltx (или как там у вас) в папке gamedata\configs\scripts\escape (имя локации опять чтобы не путаться)

пишем туда стандартную логику - стой на месте, нифига не делай:

[logic] 
active = walker@stay_at_position 
danger = danger_ignore

[danger_ignore] 
ignore_distance = 5

[walker@stay_at_position] 
path_walk = walker_stay_at_position_walk
path_look = walker_stay_at_position_look

Точки пути прописываем в файле way_имя_локации.ltx декомпилированного all.spawn. Новую игру начинать не нужно.

 

вот по логике чуток:

http://stalkerin.gameru.net/wiki/index.php...1%D1%82%D1%8C_1

 

Едем далее:

Имя:

в файле

gamedata\configs\text\rus\st_characters.xml в самый конец ПЕРЕД ТЭГОМ </string_table> добавляем:

<string id="esc_nash">
    <text>Индюк "Опаленный"</text>
</string>

Иконка:

стандартные в файле:

gamedata\configs\ui\textures_descr\ui_npc_unique.xml

структура файла:

<file name="ui\ui_npc_unique"> - файл из которого брать иконки
<texture id="ui_npc_u_nebo_2_face_1" x="0" y="0" width="165" height="108" /> иконка с именем ui_npc_u_nebo_2_face_1 размером 165 х 108 от начала координат (0,0)
ui_npc_u_nebo_2_face_1 - то что в профиле вставляется в тэг icon

 

Далее создаём скрипт ваше_название.script в папке gamedata\scripts. в него пишем

function esc_spawn_nash_nepic () 
    alife():create("esc_nash_npc",vector():set(-233.62,-20.04,-152.72),23680,570)
end

esc_nash_npc - Имя из spawn_cections_***

(-233.62,-20.04,-152.72),23680,570) позиция (x, y, z, gw, lw,) (-233.62,-20.04,-152.72),23680,570) - это в 1ом доме от сидорыча на кордоне

теперь добавляем строку <action>ваше_название.esc_spawn_nash_nepic</action> в любой диалог

Изменено пользователем ColR_iT

Как прописать что бы непись появился сразу в начале игры, а не после диалога? С редактированием алл.спавна.

Изменено пользователем Виталий Зверь
Как прописать что бы непись появился сразу в начале игры, а не после диалога? С редактированием алл.спавна

 

Если я правильно понял то так

создаем секцию и алл спавне

 

[не использумое число]

; cse_abstract properties

section_name = stalker ----------- обязательно

name = -------------------------- имя

position = -225.604339599609,-20.221607208252,-147.097625732422 ------- координаты

direction = 0.0623090341687202,0.00229393295012414,0.0141186164692044 ----- ореентир можно (0,0,0)

 

; cse_alife_trader_abstract properties

money = 5000 -------------- ну тут понятно

character_profile = esc_stalker_novice ------------

 

; cse_alife_object properties

game_vertex_id = 47

distance = 3.5

level_vertex_id = 29123

object_flags = 0xffffffbf

custom_data = <<END

[smart_terrains]

esc_lager = true ----------- имя смарта если под своей логикой то none = true

END

 

; cse_visual properties

visual_name = actors\novice\green_stalker_2

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 1

g_group = 5

health = 1

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 1

upd:timestamp = 0xef20e0ec

upd:creature_flags = 0xe5

upd:position = -225.604339599609,-20.221607208252,-147.097625732422

upd:o_model = 0

upd:o_torso = 0.00229393295012414,0.0623090341687202,0

upd:g_team = 0

upd:g_squad = 1

upd:g_group = 5

 

; cse_alife_monster_abstract properties

 

upd:next_game_vertex_id = 65535

upd:prev_game_vertex_id = 65535

upd:distance_from_point = 0

upd:distance_to_point = 0

 

; cse_alife_human_abstract properties

predicate5 = 2,2,0,1,0

predicate4 = 2,1,2,1

 

; cse_ph_skeleton properties

 

upd:start_dialog =

 

; se_stalker properties

 

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...