Skocz do zawartości

[Tutorial] Jak dodać NPC utrzymującego stałą pozycję - bez edycji pliku all.spawn


Rekomendowane odpowiedzi

Przedmowa

 

Niniejszy poradnik dedykowany jest każdemu, kto chce dodać postać do świata gry Stalker - bez konieczności ingerencji w plik all.spawn. Przypomnę jednak podstawowe informacje, otóż - dodając za pomocą pliku all.spawn jakikolwiek przedmiot, jesteśmy zobligowani do rozpoczynania nowej gry, aby wprowadzone zmiany zostały dodane do rozgrywki. Poprzednio opisałem metodę dodawania jednostek do gry (link), która pomimo drobnej ingerencji w plik all.spawn, a dokładniej w pod-pliki way_*.ltx (* - nazwa lokacji) - nie wymuszała rozpoczynania nowej rozgrywki by przedmiot został zespawnowany. Metoda o której traktuje powyższy link ma wiele zalet, jak wspomniana elastyczność dodawania NPC'ów - jednak ma również wadę, na której owa elastyczność się kończy, a która jest funkcją możliwości dekompilacji pliku all.spawn. Innymi słowy - rzeczoną metodę można stosować w każdej modyfikacji Shoc (testowane na Shoc 1.0004 oraz modach) pod warunkiem, iż jesteśmy w stanie dodać waypoint do plików way_*.ltx, a jesteśmy to w stanie zrobić gdy możliwa jest dekompilacja pliku all.spawn. Determinująca dla wspomnianej (patrz w/w link) metody jest możliwość edycji pliku all.spawn. Są jednak mody - takie jak Solijanka/DMX, w których plik all.spawn został zmodyfikowany xrSpawner'em co uniemożliwia nam jego dekompilację, mało tego - xrSpawner posiada wiele ograniczeń edycyjnych, co utrudnia modyfikację plików way_*.ltx. Osobiście nie stosuję w edycji spawna - xrSpawner'a, dlatego pominę niuanse sposobów edytowania w/w narzędziem. Wróćmy jednak do meritum - chcąc dodać jakąkolwiek postać do Solijanki/DMX'a czy innego moda, w którym dekompilacja jest niemożliwa - napotykamy na spory problem. Ileż to graczy musiało używać spawner'ów w sytuacji gdy określony NPC ginął na takim etapie rozgrywki, iż szukanie zapisu gry sprzed jego śmierci traciło jakikolwiek sens? Ile fantów - począwszy od broni a skończywszy na artefaktach trzeba było zostawić w schowkach - tylko dlatego, iż w najbliższej okolicy nie było żadnego handlarza, zaś alternatywą dla opcji pozostawienia ich była konieczność zwiększania udźwigu? Niniejszy poradnik jest odpowiedzią na postawione pytania, wychodząc na przeciw problemowi staremu jak sam Stalker, problemowi który zainspirował mnie do napisania niniejszego opracowania. Widziałem podobną metodę zastosowaną w CoP, postanowiłem przenieść ją na grunt "Cienia Czarnobyla" do którego zawsze miałem sentyment.

 

Uwagi: metoda najlepiej nadaje się na dodawanie neutralnych NPC - np. handlarzy czy zleceniodawców bez przynależności frakcyjnej, ponieważ dodana postać nie zmienia pozycji (neutralność eliminuje ryzyko ataku na postać). Można w ten sposób dodawać np. snajperów, ale ich ograniczeniem będzie brak mobilności. Niewątpliwa zaleta to możliwość dodania postaci w dowolnym momencie fabuły bez konieczności rozpoczynania rozgrywki od początku. Metody nie polecam do tworzenia obozowisk (niemożność stworzenia trasy patrolowej). Wspomniana neutralność nie ogranicza funkcjonalności metody o której traktuje niniejsze opracowanie - jest jedynie sugestią, która zwiększa szanse przetrwania dodanej postaci. 

 

 

 

I. Etap przygotowawczy.
W pierwszej kolejności należy ustalić pozycję w jakiej zostanie zespawnowany NPC. Pozycja spawnu będzie jednocześnie punktem zajmowanym przez dodaną jednostkę.
Wadą omawianej metody jest brak możliwości zmiany pozycji przez NPC z uwagi na brak waypoint'ów, których dodanie jest tożsame z ingerencją w plik all.spawn. Jeśli zespawnujemy np. handlarza czy zleceniodawcę w miejscu gdzie będzie narażony na ostrzał czy ataki mutantów - wówczas szybko pożegna się z życiem. Pomijam tutaj aspekt uczynienia postaci nieśmiertelną (tutorial). To samo tyczy się modów jak np. Solijanka, gdzie spawn na obszarze braku ochrony przed emisją - będzie dla postaci stanowił wyrok śmierci, ponieważ dodany NPC nie będzie w stanie zająć pozycji wyznaczonej na ochronę przed zwarciem. Wybierzmy zatem takie miejsce, by trudu włożonego w dodanie NPC nie zmarnowała "zabłąkana kula" lub szukający pożywienia mutant.

 

Dla celów testowych - obrałem punkt spawn'a w piwnicy wioski kotów na Kordonie:

! Unknown command:  patrolName=npc_1|anim=spawn|pos=-213.51487731934,-23.183620452881,-124.86627960205|game=59|level=39928

 

Do zbierania punktów terenowych tj. koordynatów X, Y, Z, game_vertex_id, level_vertex_id - polecam narzędzie "Smartterrain and Waypoint Tools by dez0wave", które zostało opisane w tym poradniku - link, dostępność - download.

Alternatywne metody pozyskiwania koordynatów dla wszystkich części Stalkera:


LVID GVID Script SoC | LVID GVID Script CS | LVID GVID Script CoP | LVID GVID Script 3120 | LVID GVID Script AMK |

Warto zwrócić jeszcze uwagę na znacznie szybszy sposób uzyskania koordynatów, wymagający w przeciwieństwie do w/w narzędzi - wprowadzenia zmian w jednym tylko pliku. Jeśli chcemy wprowadzić zmiany w zaawansowanym skryptowo modzie jak np. Solijanka i jednocześnie nie mamy ochoty łączyć wielu plików w celu uzyskania kompatybilności - wówczas skorzystajmy z poniższej porady:

[ 1 ]. Do pliku ui_main_menu.script [lokalizacja: gamedatascripts] na samym końcu dodajemy poniższą funkcję:

--funkcja dodająca koordynatyfunction main_menu:OnButton_credits_clicked()local textlocal vidlocal gvidlocal a = vector()local texta = db.actor:position()vid = db.actor:level_vertex_id()gvid = db.actor:game_vertex_id()text = "Koordynaty:nX= "..a.x.."nY= "..a.y.."nZ= "..a.z.."nlevel_vertex= "..vid.."ngame_vertex_id= "..gvidnews_manager.send_tip(db.actor, text, nil, nil, 30000)end

[ 2 ]. Po zapisaniu zmian - wchodzimy w grę - wczytując savegame. Teraz wystarczy, iż podczas rozgrywki wyjdziemy do menu - klikając przycisk "Twórcy gry"/"Credits". Sygnał dźwiękowy powiadomi nas o dodaniu wiadomości na ekran. Po powrocie do gry - widzimy informację o koordynatach w dolnym lewym rogu ekranu - patrz screen.

 

post-3466-0-35624500-1384115130_thumb.jp

 

 

 

II. Etap wykonawczy - tworzenie struktury moda oraz edycja plików.

 

[ 1 ]. Tworzymy profil naszego NPC. Za cechy postaci takie jak wygląd, dźwięk, stan posiadanej gotówki, wyposażenie, nazwę, dialogi, ikonę - odpowiadają pliki character_desc_*.xml ( * - nazwa mapy). Więcej informacji nt. poszczególnych parametrów profilu postaci znajdziemy w tym poradniku, patrz pkt. 8.2. W przykładzie tworzę postać handlarza na Kordonie, zatem modyfikuję plik character_desc_escape.xml [lokalizacja: gamedataconfiggameplay], dodając wpis następujący:

<!-------------------------------------assassin początek wpisu------------------------------------------>    <specific_character id="assassin" team_default = "1">   <name>Dark Assassin</name>   <icon>ui_npc_u_stalker_bandit_5</icon>   <bio>sim_stalker_master_bio</bio>   <class>assassin</class>   <community>trader</community> <terrain_sect>stalker_terrain</terrain_sect>   <money min="100000" max="110000" infinitive="1"></money>   <rank>3000</rank>   <reputation>350</reputation>   <visual>actorsunicact_bright</visual>   <snd_config>characters_voicehuman_02bandit</snd_config>   <crouch_type>0</crouch_type>   <supplies>   [spawn] n   wpn_groza n   ammo_9x39_ap n   ammo_9x19_fmj n   #include "gameplaycharacter_food.xml" n   #include "gameplaycharacter_drugs.xml"   </supplies>   #include "gameplaycharacter_criticals_6.xml"   #include "gameplaycharacter_dialogs.xml"   </specific_character>     <!----------------------------------------assassin koniec wpisu------------------------------------------>

Zwróćmy uwagę na identyfikator profilowy utworzonej postaci tj. "assassin". Identyfikator ten będzie wykorzystywany w skrypcie, ponadto w konfiguracji wykorzystano niewystępujący w innych modyfikacjach model postaci, tj. act_bright.ogf [lokalizacja: gamedatameshesactorsunic]. Jeśli brakuje folderów - tworzymy je zgodnie ze ścieżką w/w pliku .xml:

<visual>actorsunicact_bright</visual>

Ścieżka nie zawiera w nazwie folderów gamedata i meshes - o czym warto pamiętać by właściwie umieścić żądany model postaci. Model z kolei posiada określoną teksturę, którą również należy umieścić w folderze [gamedata] - zgodnie ze ścieżką zdefiniowaną w pliku modelu .ogf.

W moim przypadku: act_bright.dds [lokalizacja: gamedatatexturesAazactor]. Wykorzystany w modyfikacji model postaci wraz z teksturami - link, autor: Aaz

Zapisuję zmiany, przechodząc do kolejnej konfiguracji

 

Uwagi dot. Solijanki:

Jeśli zależy nam na dodaniu postaci, która ma skonfigurowany profil postaci np. Jakut - szukamy jego identyfikatora profilowego tj. wpisu: "yakut_agro2", który dla Jakuta znaleźć można w pliku character_desc_new.xml [lokalizacja: gamedataconfiggameplay], wpis:

specific_character id="yakut_agro2"

W/w identyfikator znajdziemy również w pliku npc_new.xml [lokalizacja: gamedataconfiggameplay], fraza: "yakut_agro2". Pamiętajmy by dodawać tylko te postacie, które zginęły - co pomoże uniknąć błędów w rozgrywce.

[ 2 ]. Do pliku npc_profile.xml [lokalizacja: gamedataconfiggameplay] dodaję wpis uzupełniający dane z profilu postaci, dotyczący wprowadzonego identyfikatora: "assassin"

<!-- Assassin -->        <character id="assassin">            <class>Trader</class>        <specific_character>assassin</specific_character>    </character>    <!-- Assassin -->

[ 3 ]. Do pliku spawn_sections.ltx [lokalizacja: gamedataconfigcreatures] dodaję wpis wiążący identyfikator profilowy z przynależnością frakcyjną, rangą oraz schematem zachowań.

;--assassin początek sekcji[assassin]:stalker  $spawn = "respawnassassin"  character_profile = assassinspec_rank = master  community = Tradercustom_data = scriptsassassin_addondark_assassin.ltx;--assassin koniec sekcji

Pamiętajmy by tworząc powyższe zestawienie - zachować zgodność parametrów z utworzonym wcześniej profilem postaci, omówionym w pkt. 1. tj:
character_profile
spec_rank - patrz link, pkt. 8.5 - w części II poradnika.
community

[ 4 ]. Zgodnie z wpisem "custom_data" opisanej powyżej, tworzymy plik dark_assassin.ltx [lokalizacja: gamedataconfigscriptsassassin_addon], brakujące foldery tworzymy zgodnie ze ścieżką. W pliku umieszczamy wpis:

[logic]active = remarkcombat_ignore = combat_ignoretrade = misctrade_assassin.ltx[remark]no_move = trueanim = wardcombat_ignore_cond = alwaysdanger_ignore = danger_ignore[combat_ignore][danger_ignore]ignore_distance = 0

gdzie:

combat_ignore, danger_ignore - są parametrami nakazującymi ignorowanie stanu zagrożenia przez wykorzystującego schemat NPC'a.

combat_ignore_cond = always

powyższy wiersz nakazuje ciągłe ignorowanie zagrożenia.

no_move = true

wpis w/w - powoduje utrzymywanie stałej pozycji przez NPC'a.

Ustawienie zdefiniowane powyższymi parametrami - ma za zadanie utrzymać NPC z dala od ferworu walki poprzez ignorowanie pobliskich ataków. Ponieważ moja postać to handlarz - występuje tutaj dodatkowy wpis, definiujący oferowany przez handlarza asortyment.

trade = misctrade_assassin.ltx

[ 5 ]. Zgodnie ze ścieżką wpisu "trade" - pliku opisanego powyżej, tworzę trade_assassin.ltx [lokalizacja: gamedataconfigmisc], zawierający wpis:

[trader]buy_condition = assassin_generic_buysell_condition = {+esc_kill_bandits_quest_done} assassin_after_fabric_sell, assassin_start_sellbuy_supplies = {+esc_kill_bandits_quest_done} supplies_after_fabric, supplies_start[assassin_generic_buy];Ŕđňĺôŕęňűaf_medusa                = 1,    0.3af_cristall_flower        = 1,    0.3af_night_star            = 1,    0.3af_vyvert                = 1,    0.3af_gravi                = 1,    0.3af_gold_fish            = 1,    0.3af_blood                = 1,    0.3af_mincer_meat            = 1,    0.3af_soul                    = 1,    0.3af_electra_sparkler        = 1,    0.3af_electra_flash        = 1,    0.3af_electra_moonlight    = 1,    0.3af_rusty_thorn            = 1,    0.3af_rusty_kristall        = 1,    0.3af_rusty_sea-urchin        = 1,    0.3af_ameba_slime            = 1,    0.3af_ameba_slug            = 1,    0.3af_ameba_mica            = 1,    0.3af_drops                = 1,    0.3af_fireball                = 1,    0.3af_cristall                = 1,    0.3af_dummy_glassbeads        = 1,    0.3af_dummy_pellicle        = 1,    0.3af_dummy_battery        = 1,    0.3af_dummy_dummy            = 1,    0.3af_dummy_spring            = 1,    0.3af_fuzz_kolobok            = 1,    0.3;Ŕěěóíčöč˙ammo_9x18_fmj                = 0.9,    0.1ammo_9x18_pmm                = 0.9,    0.1ammo_9x19_pbp                = 0.9,    0.1ammo_9x19_fmj                = 0.9,    0.1ammo_11.43x23_hydro            = 0.9,    0.1ammo_11.43x23_fmj            = 0.9,    0.1ammo_12x70_buck                = 0.9,    0.1ammo_12x76_dart                = 0.9,    0.1ammo_12x76_zhekan            = 0.9,    0.1ammo_5.45x39_ap                = 0.9,    0.1ammo_5.45x39_fmj            = 0.9,    0.1ammo_9x39_sp5                = 0.9,    0.1ammo_9x39_ap                = 0.9,    0.1ammo_9x39_pab9                = 0.9,    0.1ammo_5.56x45_ss190            = 0.9,    0.1ammo_5.56x45_ap                = 0.9,    0.1ammo_7.62x54_7h14            = 0.9,    0.1ammo_7.62x54_7h1            = 0.9,    0.1ammo_7.62x54_ap                = 0.9,    0.1ammo_og-7b                = 0.9,    0.1ammo_vog-25p            = 0.9,    0.1ammo_vog-25                = 0.9,    0.1grenade_f1                = 0.9,    0.1grenade_rgd5            = 0.9,    0.1ammo_m209                = 0.9,    0.1;Îđóćčĺwpn_pm                    = 0.3,    0.1wpn_pb                    = 0.3,    0.1wpn_fort                = 0.3,    0.1wpn_hpsa                = 0.3,    0.1wpn_beretta                = 0.3,    0.1wpn_walther                = 0.3,    0.1wpn_sig220                = 0.3,    0.1wpn_colt1911            = 0.3,    0.1wpn_usp                    = 0.3,    0.1wpn_desert_eagle        = 0.3,    0.1wpn_bm16                = 0.3,    0.1wpn_toz34                = 0.3,    0.1wpn_wincheaster1300        = 0.3,    0.1wpn_spas12                = 0.3,    0.1wpn_ak74u                = 0.3,    0.1wpn_mp5                    = 0.3,    0.1wpn_ak74                = 0.3,    0.1wpn_abakan                = 0.3,    0.1wpn_l85                    = 0.3,    0.1wpn_lr300                = 0.3,    0.1wpn_sig550                = 0.3,    0.1wpn_groza                = 0.3,    0.1wpn_val                    = 0.3,    0.1wpn_vintorez            = 0.3,    0.1wpn_svu                    = 0.3,    0.1wpn_svd                    = 0.3,    0.1wpn_rg-6                = 0.3,    0.1wpn_rpg7                = 0.3,    0.1wpn_g36                    = 0.3,    0.1wpn_fn2000                = 0.3,    0.1;ADDONSwpn_addon_scope                    = 0.7,    0.2wpn_addon_scope_susat            = 0.7,    0.2wpn_addon_silencer                = 0.7,    0.2wpn_addon_grenade_launcher        = 0.7,    0.2wpn_addon_grenade_launcher_m203 = 0.7,    0.2;Áđîíčęčnovice_outfit            = 1,    0.3bandit_outfit            = 1,    0.3killer_outfit            = 1,    0.3monolit_outfit            = 1,    0.3soldier_outfit            = 1,    0.3specops_outfit            = 1,    0.3military_outfit            = 1,    0.3stalker_outfit            = 1,    0.3scientific_outfit        = 1,    0.3exo_outfit                = 1,    0.3svoboda_light_outfit    = 1,    0.3svoboda_heavy_outfit    = 1,    0.3dolg_outfit                = 1,    0.3dolg_scientific_outfit    = 1,    0.3ecolog_outfit            = 1,    0.3protection_outfit        = 1,    0.3;Ěĺäčęŕěĺíňűbandage                    = 1,    0.5medkit                    = 1,    0.5medkit_scientic            = 1,    0.5medkit_army                = 1,    0.5antirad                    = 1,    0.5;Äĺňŕëč ěîíńňđîâmutant_flesh_eye        ;NO TRADEmutant_boar_leg            ;NO TRADEmutant_dog_tail            ;NO TRADEmutant_psevdodog_tail    ;NO TRADEmutant_krovosos_jaw        ;NO TRADEmutant_burer_hand        ;NO TRADEmutant_zombie_hand        ;NO TRADEmutant_snork_leg        ;NO TRADE;Ĺäŕbread                    = 0.3,    0.1kolbasa                    = 0.3,    0.1conserva                = 0.3,    0.1vodka                    = 0.3,    0.1energy_drink            = 0.3,    0.1;Ďđĺäěĺňűdevice_torch            ;NO TRADEdetector_simple            ;NO TRADEdetector_advances        ;NO TRADEdetector_elite            ;NO TRADEdevice_pda                = 1,    0.5hand_radio                ;NO TRADEguitar_a                = 0.3,    0.1harmonica_a                = 0.3,    0.1;Ęâĺńňîâűĺ ďđĺäěĺňűgunslinger_flash        ;NO TRADEaf_blood_tutorial        ;NO TRADEesc_wounded_flash        ;NO TRADEquest_case_02            ;NO TRADEdar_document1            ;NO TRADEdar_document2            ;NO TRADEdar_document3            ;NO TRADEdar_document4            ;NO TRADEdar_document5            ;NO TRADEkruglov_flash            ;NO TRADElab_x16_documents        ;NO TRADEgood_psy_helmet            ;NO TRADEbad_psy_helmet            ;NO TRADEdecoder                    ;NO TRADEdynamite                ;NO TRADEquest_case_01            ;NO TRADEhunters_toz                ;NO TRADEbar_ecolog_flash        ;NO TRADEbar_tiran_pda            ;NO TRADEbar_lucky_pda            ;NO TRADE;Óíčęŕëüíűĺ ďđĺäěĺňűoutfit_novice_m1        = 1,    0.3outfit_bandit_m1        = 1,    0.3outfit_dolg_m1            = 1,    0.3outfit_killer_m1        = 1,    0.3outfit_specnaz_m1        = 1,    0.3outfit_stalker_m1        = 1,    0.3outfit_stalker_m2        = 1,    0.3outfit_svoboda_m1        = 1,    0.3outfit_exo_m1            = 1,    0.3wpn_ak74_m1                = 1,    0.3wpn_abakan_m1            = 1,    0.3wpn_fort_m1                = 1,    0.3wpn_ak74u_m1            = 1,    0.3wpn_mp5_m1                = 1,    0.3wpn_groza_m1            = 1,    0.3wpn_spas12_m1            = 1,    0.3wpn_winchester_m1        = 1,    0.3wpn_l85_m1                = 1,    0.3wpn_lr300_m1            = 1,    0.3wpn_svd_m1                = 1,    0.3wpn_sig_m1                = 1,    0.3wpn_eagle_m1            = 1,    0.3wpn_colt_m1                = 1,    0.3wpn_val_m1                = 1,    0.3wpn_mp5_m2                = 1,    0.3wpn_abakan_m2            = 1,    0.3wpn_l85_m2                = 1,    0.3wpn_sig_m2                = 1,    0.3wpn_rg6_m1                = 1,    0.3wpn_walther_m1            = 1,    0.3wpn_pm_arena            ;NO TRADEwpn_mp5_arena            ;NO TRADEwpn_toz34_arena            ;NO TRADEwpn_spas12_arena        ;NO TRADEwpn_ak74_arena            ;NO TRADEwpn_bm16_arena            ;NO TRADEwpn_ak74u_arena            ;NO TRADEwpn_val_arena            ;NO TRADEwpn_groza_arena            ;NO TRADEwpn_fn2000_arena        ;NO TRADEwpn_g36_arena            ;NO TRADE[supplies_start];Ŕěěóíčöč˙ammo_5.45x39_fmj        = 1,    0.1;Îđóćčĺwpn_groza_m1            = 1,    0.1;Áđîíčęčkiller_outfit            = 1,    0.1;Ěĺäčęŕěĺíňűbandage                    = 5,    0.6medkit                    = 5,    0.3antirad                    = 5,    0.3;Ĺäŕbread                    = 10,    0.5kolbasa                    = 10,    0.5conserva                = 10,    0.5vodka                    = 10,    0.3energy_drink            = 10,    0.3[supplies_after_fabric];Ŕěěóíčöč˙ammo_9x18_fmj            = 10,    0.6ammo_9x18_pmm            = 10,    0.5ammo_12x70_buck            = 10,    0.5;Áđîíčęčnovice_outfit            = 3,    0.8bandit_outfit            = 2,    0.6killer_outfit            = 2,    0.5stalker_outfit            = 1,    0.5;Îđóćčĺwpn_pm                    = 5,    0.5wpn_pb                    = 2,    0.5wpn_fort                = 2,    0.5wpn_bm16                = 3,    0.5wpn_mp5                    = 2,    0.5;Ěĺäčęŕěĺíňűbandage                    = 5,    0.6medkit                    = 5,    0.3antirad                    = 5,    0.5;Ĺäŕbread                    = 10,    0.5kolbasa                    = 10,    0.5conserva                = 10,    0.5vodka                    = 10,    0.3energy_drink            = 10,    0.3[assassin_start_sell];Ŕđňĺôŕęňűaf_medusa                ;NO TRADEaf_cristall_flower        ;NO TRADEaf_night_star            ;NO TRADEaf_vyvert                ;NO TRADEaf_gravi                ;NO TRADEaf_gold_fish            ;NO TRADEaf_blood                ;NO TRADEaf_mincer_meat            ;NO TRADEaf_soul                    ;NO TRADEaf_electra_sparkler        ;NO TRADEaf_electra_flash        ;NO TRADEaf_electra_moonlight    ;NO TRADEaf_rusty_thorn            ;NO TRADEaf_rusty_kristall        ;NO TRADEaf_rusty_sea-urchin        ;NO TRADEaf_ameba_slime            ;NO TRADEaf_ameba_slug            ;NO TRADEaf_ameba_mica            ;NO TRADEaf_drops                ;NO TRADEaf_fireball                ;NO TRADEaf_cristall                ;NO TRADEaf_dummy_glassbeads        ;NO TRADEaf_dummy_pellicle        ;NO TRADEaf_dummy_battery        ;NO TRADEaf_dummy_dummy            ;NO TRADEaf_dummy_spring            ;NO TRADEaf_fuzz_kolobok            ;NO TRADE;Ŕěěóíčöč˙ammo_9x18_fmj                ;NO TRADEammo_9x18_pmm                ;NO TRADEammo_9x19_pbp                ;NO TRADEammo_9x19_fmj                ;NO TRADEammo_11.43x23_hydro            ;NO TRADEammo_11.43x23_fmj            ;NO TRADEammo_12x70_buck                ;NO TRADEammo_12x76_dart                ;NO TRADEammo_12x76_zhekan            ;NO TRADEammo_5.45x39_ap                ;NO TRADEammo_5.45x39_fmj            = 1, 3ammo_9x39_sp5                ;NO TRADEammo_9x39_ap                ;NO TRADEammo_9x39_pab9                ;NO TRADEammo_5.56x45_ss190            ;NO TRADEammo_5.56x45_ap                ;NO TRADEammo_7.62x54_7h14            ;NO TRADEammo_7.62x54_7h1            ;NO TRADEammo_7.62x54_ap                ;NO TRADEammo_og-7b                ;NO TRADEammo_vog-25p            ;NO TRADEammo_vog-25                ;NO TRADEgrenade_f1                ;NO TRADEgrenade_rgd5            ;NO TRADEammo_m209                ;NO TRADE;Îđóćčĺwpn_pm                    ;NO TRADEwpn_pb                    ;NO TRADEwpn_fort                ;NO TRADEwpn_hpsa                ;NO TRADEwpn_beretta                ;NO TRADEwpn_walther                ;NO TRADEwpn_sig220                ;NO TRADEwpn_colt1911            ;NO TRADEwpn_usp                    ;NO TRADEwpn_desert_eagle        ;NO TRADEwpn_bm16                ;NO TRADEwpn_toz34                ;NO TRADEwpn_wincheaster1300        ;NO TRADEwpn_spas12                ;NO TRADEwpn_ak74u                ;NO TRADEwpn_mp5                    ;NO TRADEwpn_ak74                ;NO TRADEwpn_abakan                ;NO TRADEwpn_l85                    ;NO TRADEwpn_lr300                ;NO TRADEwpn_sig550                ;NO TRADEwpn_groza                ;NO TRADEwpn_val                    ;NO TRADEwpn_vintorez            ;NO TRADEwpn_svu                    ;NO TRADEwpn_svd                    ;NO TRADEwpn_rg-6                ;NO TRADEwpn_rpg7                ;NO TRADEwpn_g36                    ;NO TRADEwpn_fn2000                ;NO TRADE;ADDONSwpn_addon_scope                    ;NO TRADEwpn_addon_scope_susat            ;NO TRADEwpn_addon_silencer                ;NO TRADEwpn_addon_grenade_launcher        ;NO TRADEwpn_addon_grenade_launcher_m203 ;NO TRADE;Áđîíčęčnovice_outfit            ;NO TRADEbandit_outfit            ;NO TRADEkiller_outfit            = 1, 3monolit_outfit            ;NO TRADEsoldier_outfit            ;NO TRADEspecops_outfit            ;NO TRADEmilitary_outfit            ;NO TRADEstalker_outfit            ;NO TRADEscientific_outfit        ;NO TRADEexo_outfit                ;NO TRADEsvoboda_light_outfit    ;NO TRADEsvoboda_heavy_outfit    ;NO TRADEdolg_outfit                ;NO TRADEdolg_scientific_outfit    ;NO TRADEecolog_outfit            ;NO TRADEprotection_outfit        ;NO TRADE;Ěĺäčęŕěĺíňűbandage                    = 1, 3medkit                    = 1, 3medkit_scientic            ;NO TRADEmedkit_army                ;NO TRADEantirad                    = 1, 3;Äĺňŕëč ěîíńňđîâmutant_flesh_eye        ;NO TRADEmutant_boar_leg            ;NO TRADEmutant_dog_tail            ;NO TRADEmutant_psevdodog_tail    ;NO TRADEmutant_krovosos_jaw        ;NO TRADEmutant_burer_hand        ;NO TRADEmutant_zombie_hand        ;NO TRADEmutant_snork_leg        ;NO TRADE;Ĺäŕbread                    = 1, 3kolbasa                    = 1, 3conserva                = 1, 3vodka                    = 1, 3energy_drink            = 1, 3;Ďđĺäěĺňűdevice_torch            ;NO TRADEdetector_simple            ;NO TRADEdetector_advances        ;NO TRADEdetector_elite            ;NO TRADEdevice_pda                ;NO TRADEguitar_a                ;NO TRADEharmonica_a                ;NO TRADE;Ęâĺńňîâűĺ ďđĺäěĺňűgunslinger_flash        ;NO TRADEaf_blood_tutorial        ;NO TRADEesc_wounded_flash        ;NO TRADEquest_case_02            ;NO TRADEdar_document1            ;NO TRADEdar_document2            ;NO TRADEdar_document3            ;NO TRADEdar_document4            ;NO TRADEdar_document5            ;NO TRADEkruglov_flash            ;NO TRADElab_x16_documents        ;NO TRADEgood_psy_helmet            ;NO TRADEbad_psy_helmet            ;NO TRADEdecoder                    ;NO TRADEdynamite                ;NO TRADEquest_case_01            ;NO TRADEhunters_toz                ;NO TRADEbar_ecolog_flash        ;NO TRADEbar_tiran_pda            ;NO TRADEbar_lucky_pda            ;NO TRADE;Óíčęŕëüíűĺ ďđĺäěĺňűoutfit_novice_m1        ;NO TRADEoutfit_bandit_m1        ;NO TRADEoutfit_dolg_m1            ;NO TRADEoutfit_killer_m1        ;NO TRADEoutfit_specnaz_m1        ;NO TRADEoutfit_stalker_m1        ;NO TRADEoutfit_stalker_m2        ;NO TRADEoutfit_svoboda_m1        ;NO TRADEoutfit_exo_m1            ;NO TRADEwpn_ak74_m1                ;NO TRADEwpn_abakan_m1            ;NO TRADEwpn_fort_m1                ;NO TRADEwpn_ak74u_m1            ;NO TRADEwpn_mp5_m1                ;NO TRADEwpn_groza_m1            = 1, 3wpn_spas12_m1            ;NO TRADEwpn_winchester_m1        ;NO TRADEwpn_l85_m1                ;NO TRADEwpn_lr300_m1            ;NO TRADEwpn_svd_m1                ;NO TRADEwpn_sig_m1                ;NO TRADEwpn_eagle_m1            ;NO TRADEwpn_colt_m1                ;NO TRADEwpn_val_m1                ;NO TRADEwpn_mp5_m2                ;NO TRADEwpn_abakan_m2            ;NO TRADEwpn_l85_m2                ;NO TRADEwpn_sig_m2                ;NO TRADEwpn_rg6_m1                ;NO TRADEwpn_walther_m1            ;NO TRADEwpn_pm_arena            ;NO TRADEwpn_mp5_arena            ;NO TRADEwpn_toz34_arena            ;NO TRADEwpn_spas12_arena        ;NO TRADEwpn_ak74_arena            ;NO TRADEwpn_bm16_arena            ;NO TRADEwpn_ak74u_arena            ;NO TRADEwpn_val_arena            ;NO TRADEwpn_groza_arena            ;NO TRADEwpn_fn2000_arena        ;NO TRADEwpn_g36_arena            ;NO TRADE[assassin_after_fabric_sell];Ŕđňĺôŕęňűaf_medusa                ;NO TRADEaf_cristall_flower        ;NO TRADEaf_night_star            ;NO TRADEaf_vyvert                ;NO TRADEaf_gravi                ;NO TRADEaf_gold_fish            ;NO TRADEaf_blood                ;NO TRADEaf_mincer_meat            ;NO TRADEaf_soul                    ;NO TRADEaf_electra_sparkler        ;NO TRADEaf_electra_flash        ;NO TRADEaf_electra_moonlight    ;NO TRADEaf_rusty_thorn            ;NO TRADEaf_rusty_kristall        ;NO TRADEaf_rusty_sea-urchin        ;NO TRADEaf_ameba_slime            ;NO TRADEaf_ameba_slug            ;NO TRADEaf_ameba_mica            ;NO TRADEaf_drops                ;NO TRADEaf_fireball                ;NO TRADEaf_cristall                ;NO TRADEaf_dummy_glassbeads        ;NO TRADEaf_dummy_pellicle        ;NO TRADEaf_dummy_battery        ;NO TRADEaf_dummy_dummy            ;NO TRADEaf_dummy_spring            ;NO TRADEaf_fuzz_kolobok            ;NO TRADE;Ŕěěóíčöč˙ammo_9x18_fmj                = 1, 3ammo_9x18_pmm                = 1, 3ammo_9x19_pbp                ;NO TRADEammo_9x19_fmj                = 1, 3ammo_11.43x23_hydro            ;NO TRADEammo_11.43x23_fmj            ;NO TRADEammo_12x70_buck                = 1, 3ammo_12x76_dart                ;NO TRADEammo_12x76_zhekan            ;NO TRADEammo_5.45x39_ap                ;NO TRADEammo_5.45x39_fmj            ;NO TRADEammo_9x39_sp5                ;NO TRADEammo_9x39_ap                ;NO TRADEammo_9x39_pab9                ;NO TRADEammo_5.56x45_ss190            ;NO TRADEammo_5.56x45_ap                ;NO TRADEammo_7.62x54_7h14            ;NO TRADEammo_7.62x54_7h1            ;NO TRADEammo_7.62x54_ap                ;NO TRADEammo_og-7b                    ;NO TRADEammo_vog-25p                ;NO TRADEammo_vog-25                    ;NO TRADEgrenade_f1                    ;NO TRADEgrenade_rgd5                ;NO TRADEammo_m209                    ;NO TRADE;Îđóćčĺwpn_pm                    = 1, 3wpn_pb                    = 1, 3wpn_fort                = 1, 3wpn_hpsa                ;NO TRADEwpn_beretta                ;NO TRADEwpn_walther                ;NO TRADEwpn_sig220                ;NO TRADEwpn_colt1911            ;NO TRADEwpn_usp                    ;NO TRADEwpn_desert_eagle        ;NO TRADEwpn_bm16                = 1, 3wpn_toz34                ;NO TRADEwpn_wincheaster1300        ;NO TRADEwpn_spas12                ;NO TRADEwpn_ak74u                ;NO TRADEwpn_mp5                    = 3, 5wpn_ak74                ;NO TRADEwpn_abakan                ;NO TRADEwpn_l85                    ;NO TRADEwpn_lr300                ;NO TRADEwpn_sig550                ;NO TRADEwpn_groza                ;NO TRADEwpn_val                    ;NO TRADEwpn_vintorez            ;NO TRADEwpn_svu                    ;NO TRADEwpn_svd                    ;NO TRADEwpn_rg-6                ;NO TRADEwpn_rpg7                ;NO TRADEwpn_g36                    ;NO TRADEwpn_fn2000                ;NO TRADE;ADDONSwpn_addon_scope                    ;NO TRADEwpn_addon_scope_susat            ;NO TRADEwpn_addon_silencer                ;NO TRADEwpn_addon_grenade_launcher        ;NO TRADEwpn_addon_grenade_launcher_m203 ;NO TRADE;Áđîíčęčnovice_outfit            = 1, 3bandit_outfit            = 2, 4killer_outfit            = 3, 5monolit_outfit            ;NO TRADEsoldier_outfit            ;NO TRADEspecops_outfit            ;NO TRADEmilitary_outfit            ;NO TRADEstalker_outfit            = 3, 5scientific_outfit        ;NO TRADEexo_outfit                ;NO TRADEsvoboda_light_outfit    ;NO TRADEsvoboda_heavy_outfit    ;NO TRADEdolg_outfit                ;NO TRADEdolg_scientific_outfit    ;NO TRADEecolog_outfit            ;NO TRADEprotection_outfit        ;NO TRADE;Ěĺäčęŕěĺíňűbandage                    = 1, 3medkit                    = 1, 3medkit_scientic            ;NO TRADEmedkit_army                ;NO TRADEantirad                    = 1, 3;Äĺňŕëč ěîíńňđîâmutant_flesh_eye        ;NO TRADEmutant_boar_leg            ;NO TRADEmutant_dog_tail            ;NO TRADEmutant_psevdodog_tail    ;NO TRADEmutant_krovosos_jaw        ;NO TRADEmutant_burer_hand        ;NO TRADEmutant_zombie_hand        ;NO TRADEmutant_snork_leg        ;NO TRADE;Ĺäŕbread                    = 1, 3kolbasa                    = 1, 3conserva                = 1, 3vodka                    = 1, 3energy_drink            = 1, 3;Ďđĺäěĺňűdevice_torch            ;NO TRADEdetector_simple            ;NO TRADEdetector_advances        ;NO TRADEdetector_elite            ;NO TRADEdevice_pda                ;NO TRADEguitar_a                ;NO TRADEharmonica_a                ;NO TRADE;Ęâĺńňîâűĺ ďđĺäěĺňűgunslinger_flash        ;NO TRADEaf_blood_tutorial        ;NO TRADEesc_wounded_flash        ;NO TRADEquest_case_02            ;NO TRADEdar_document1            ;NO TRADEdar_document2            ;NO TRADEdar_document3            ;NO TRADEdar_document4            ;NO TRADEdar_document5            ;NO TRADEkruglov_flash            ;NO TRADElab_x16_documents        ;NO TRADEgood_psy_helmet            ;NO TRADEbad_psy_helmet            ;NO TRADEdecoder                    ;NO TRADEdynamite                ;NO TRADEquest_case_01            ;NO TRADEhunters_toz                ;NO TRADEbar_ecolog_flash        ;NO TRADEbar_tiran_pda            ;NO TRADEbar_lucky_pda            ;NO TRADE;Óíčęŕëüíűĺ ďđĺäěĺňűoutfit_novice_m1        ;NO TRADEoutfit_bandit_m1        ;NO TRADEoutfit_dolg_m1            ;NO TRADEoutfit_killer_m1        ;NO TRADEoutfit_specnaz_m1        ;NO TRADEoutfit_stalker_m1        ;NO TRADEoutfit_stalker_m2        ;NO TRADEoutfit_svoboda_m1        ;NO TRADEoutfit_exo_m1            ;NO TRADEwpn_ak74_m1                ;NO TRADEwpn_abakan_m1            ;NO TRADEwpn_fort_m1                ;NO TRADEwpn_ak74u_m1            ;NO TRADEwpn_mp5_m1                ;NO TRADEwpn_groza_m1            ;NO TRADEwpn_spas12_m1            ;NO TRADEwpn_winchester_m1        ;NO TRADEwpn_l85_m1                ;NO TRADEwpn_lr300_m1            ;NO TRADEwpn_svd_m1                ;NO TRADEwpn_sig_m1                ;NO TRADEwpn_eagle_m1            ;NO TRADEwpn_colt_m1                ;NO TRADEwpn_val_m1                ;NO TRADEwpn_mp5_m2                ;NO TRADEwpn_abakan_m2            ;NO TRADEwpn_l85_m2                ;NO TRADEwpn_sig_m2                ;NO TRADEwpn_rg6_m1                ;NO TRADEwpn_walther_m1            ;NO TRADEwpn_pm_arena            ;NO TRADEwpn_mp5_arena            ;NO TRADEwpn_toz34_arena            ;NO TRADEwpn_spas12_arena        ;NO TRADEwpn_ak74_arena            ;NO TRADEwpn_bm16_arena            ;NO TRADEwpn_ak74u_arena            ;NO TRADEwpn_val_arena            ;NO TRADEwpn_groza_arena            ;NO TRADEwpn_fn2000_arena        ;NO TRADEwpn_g36_arena            ;NO TRADE

[ 6 ]. Następnie tworzymy nowy plik skryptu - ja nazwałem go emperor.script (nazwa pliku jest wykorzystywana) [lokalizacja: gamedatascripts] i umieszczamy w nim szereg funkcji:

-- funkcje dot. jednego NPC'a-- funkcja początkowafunction start_emp_spawn()spawn_dark()end-- spawn jednostki.function spawn_dark()alife():create("assassin",vector():set(-213.51487731934,-23.183620452881,-124.86627960205),39928,59)end-- funkcja uzupełniająca dla stałej pozycji npc'afunction save_variable(variable_name, value)xr_logic.pstor_store(db.actor, variable_name, value)endfunction load_variable(variable_name, value_if_not_found)return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)end

Opis:
funkcja zawiera identyfikator profilowy, opisany w pkt. 1 oraz 2 tj: "assassin".
Koordynaty odpowiednio w skrypcie:

X: -213.51487731934Y: -23.183620452881Z: -124.86627960205level_vertex_id: 39928game_vertex_id: 59Pozostałe parametry zostawiamy bez zmian.

[ 7 ]. Kolejnym plikiem wymagającym konfiguracji jest bind_stalker.script [lokalizacja: gamedatascripts].

W sekcji w której znajdziemy funkcję:

function actor_binder:update(delta)

umieszczamy wpis pomiędzy obszarem pliku zaczynającym się od:

object_binder.update(self, delta)

a wpisem kończącym rzeczoną funkcję - end

Trudno opisać umieszczenie wpisu, z uwagi na bardziej rozbudowane (w niektórych modach) pliki bind_stalker.script, w moim przypadku wpis znajdziemy w linijce 338 - patrz załącznik [gamedata] na końcu poradnika. Wpis powinien mieć postać:

-- assassin start    if emperor.load_variable("spawn_dark",false)==false then        emperor.start_emp_spawn()        emperor.save_variable("spawn_dark",true)    end    -- assassin end

gdzie:

spawn_dark,start_emp_spawn - są funkcjami umieszczonymi w pliku emperor.script.

Budowa funkcji:

najpierw zdefiniowana funkcja znajduje plik skryptu "emperor", następnie występujące w nim funkcje (zdefiniowane w pkt. 6): load_variable, save_variable. Całość rozdziela kropka np: emperor.save_variable

[ 8 ]. W zależności od tego, czy tworzymy handlarza czy członka innej frakcji - uzupełniamy plik skryptu opisany poniżej.

Jeśli tworzymy handlarza, wówczas nie uzupełniamy pliku xr_conditions.script. Warto jednak zwrócić uwagę na potencjalny błąd związany z uśmierceniem sprzedawcy - patrz poniższy spoiler.

 

Rozważmy stworzenie NPC - frakcja: stalker

W pliku z oryginalnego stalkera - xr_conditions.script [lokalizacja: gamedatascripts] dodaję wpis (w moim przypadku od wiersza 28 do 32), który stosuje się do standardowych jednostek np. w przypadku schematu snajpera:

-- assassin wpis początkowyfunction is_assassin_enemy(enemy, object)return enemy:id() ~= db.actor:id()end-- assassin wpis końcowy

gdzie:

is_assassin_enemy - jest frazą występującą w schemacie postaci (w pliku dark_assassin2.ltx - załącznik).

W przygotowanej prezentacji (patrz filmik) wykorzystałem schemat handlarza. Sfinalizowana postać [gamedata] zawiera również konfigurację snajpera - wystarczy zmienić wpisy w:

a). pliku character_desc_escape.xml (opis, pkt.1 - cz.II)

<community>trader</community>

na:

<community>stalker</community>

b). pliku npc_profile.xml (opis, pkt. 2 - cz.II )

    <character id="assassin">            <class>Trader</class>        <specific_character>assassin</specific_character>    </character>

Zmieniamy na:

    <character id="assassin">          <class>assassin</class>      </character>

  c). pliku spawn_sections.ltx (opis, pkt. 3 - cz.II )

custom_data = scriptsassassin_addondark_assassin.ltx
na :
custom_data = scriptsassassin_addondark_assassin2.ltx

oraz wpisy:

community = Trader
zastępujemy:
community = stalker

Wówczas postać będzie wykorzystywać schemat snajpera, którego plik znajdziemy w załączonym folderze gamedata - plik: dark_assassin2.ltx.

Plik xr_conditions.script występuje w wielu modach, ważne aby wpis umieścić w pliku dostosowanym do określonej modyfikacji. W funkcji występuje fraza "is_assassin_enemy", którą wykorzystuje plik odpowiedzialny za schemat zachowania postaci: dark_assassin2.ltx

Uwagi: Jeśli tworzysz handlarza - nie atakuj go!

Jeśli zaczniemy atakować postać zdefiniowaną jako handlarz, wówczas może wystąpić błąd o treści:

FATAL ERROR [error]Expression    : fatal error[error]Function	  : CScriptEngine::lua_error[error]File		  : E:stalkerpatch_1_0004xr_3daxrGamescript_engine.cpp[error]Line		  : 73[error]Description   : <no expression>[error]Arguments	 : LUA error: ...w of chernobylgamedatascriptsdeath_manager.script:135: bad argument #1 to 'pairs' (table expected, got nil)

Starajmy się nie strzelać do naszego handlarza, który skonfigurowany jest na ignorowanie zagrożenia. Jeśli jednak mamy nieodpartą chęć przetestowania na nim naszej broni, podejrzewając go o handel trefnym towarem, wówczas w pliku death_manager.script zmieniamy wiersz:

local spawn_items = item_by_community[self.npc:character_community()]
na:
local spawn_items = item_by_community[self.npc:character_community()] or {}

zapisując zmiany. Ma to na celu eliminację błędu, jednakże jest to ostateczność !

W sfinalizowanej wersji plików - patrz załącznik [gamedata], w katalogu scripts znajdziemy wersję zmodyfikowaną o nazwie opt-death_manager.script. Gra nie korzysta z tego pliku, został dodany jedynie dla przykładu. Ponadto plik opis pliku_opt-death_manager.script.txt zawiera informacje nt. sposobu eliminacji błędu. Aby gra korzystała z pliku - wystarczy zmienić jego nazwę na death_manager.script
 
Błąd w/w nie występuje w przypadku dodania zwykłego stalkera!

[ 9 ]. Zapisujemy zmiany - sprawdzając efekt. Jak widać na prezentacji - nie jest konieczne rozpoczynanie nowej gry, aby postać handlarza została zespawnowana. Zwróćmy uwagę - folder gamedata nie zawiera katalogu [spawns]. Bez ingerencji w plik all.spawn udało się stworzyć zajmującego stałą pozycję NPC'a.

 

http://www.youtube.com/watch?v=NMWCBTCZea8

 

Poniżej - sfinalizowana wersja plików (dla wersji Shoc 1.0004). Po odpowiedniej adaptacji plików dla innych modyfikacji - bez konieczności rozpoczynania nowej gry, jesteśmy w stanie stworzyć nową postać.

gamedata.7z

 

 

Prawa autorskie na podstawie regulaminu, pkt.1.6. - The Emperor, wyłączność: StalkerTeam.

__________________________

Autor: The Emperor dla StalkerTeam

 

  • Dodatnia 4
Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 lata później...

Wywala mnie do pulpitu z logiem

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CInifile::r_string
[error]File          : E:\stalker\sources\trunk\xrCore\Xr_ini.cpp
[error]Line          : 352
[error]Description   : <no expression>
[error]Arguments     : Can't find variable radiation_v in [Michal]
 

stack trace:

 

Ktoś pomoże?

Odnośnik do komentarza
Udostępnij na innych stronach

Od razu napiszę, że modyfikuję moda Powrót Szramy do wersji 1.0006. Stworzyłem nowe pliki i edytowałem niektóre istniejące. W jednym z początkowych dialogów dałem między tagami action wywołanie funkcji spawn_Michal i spawn_Gabi ze skryptu My_spawn.script i gdy wypowiadam kwestię to wywala do pulpitu. Nie zależy mi żeby koniecznie utrzymywali stałą pozycję. 

Oto co mam w character_desc_nowe

 

 

Spoiler

 


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

<xml>

  <specific_character id="Michal" no_random = "1">
    <name>Michał</name>
    <icon>ui_npc_u_stalker_neytral_balon_1</icon>
    <map_icon x="1" y="4"></map_icon>
    <bio>bar_barmen_bio</bio>

    <class>Michal</class>
    <community>stalker</community>
    <money min="10000" max="110000" infinitive="20000"></money>
    
    <rank>1700</rank>
    <reputation>500</reputation>
    <visual>actors\neytral\stalker_ne_exoskeleton</visual>
    <snd_config>characters_voice\human_01\stalker\</snd_config>
    <crouch_type>-1</crouch_type>
    
    <supplies>
      [spawn] \n
      stalker_outfit \n
      wpn_groza \n
      ammo_9x39_sp5 \n
      
    </supplies>
          
    <actor_dialog>Rozmowa_z_Michalem</actor_dialog>

  </specific_character>
  
  <specific_character id="Gabi" no_random = "1">
    <name>Gabi</name>
    <icon>ui_npc_u_stalker_neytral_balon_1</icon>
    <map_icon x="1" y="4"></map_icon>
    <bio>bar_barmen_bio</bio>

    <class>Gabi</class>
    <community>stalker</community>
    <money min="10000" max="110000" infinitive="20000"></money>
    
    <rank>1700</rank>
    <reputation>500</reputation>
    <visual>actors\women\devchonka</visual>
    <snd_config>characters_voice\human_01\stalker\</snd_config>
    <crouch_type>-1</crouch_type>
    
    <supplies>
      [spawn] \n
      stalker_outfit \n
      wpn_val \n
      ammo_9x39_sp5 \n
      
    </supplies>
          
    <actor_dialog>Rozmowa_z_Gabi</actor_dialog>

  </specific_character>

</xml>


spawn_sections.ltx

[Michal]:stalker
$spawn = "respawn\Michal"
character_profile = Michal
spec_rank = master
community = stalker
custom_data    = scripts\Michal_i_Gabi\Michal.ltx

[Gabi]:stalker
$spawn = "respawn\Gabi"
character_profile = Gabi
spec_rank = master
community = stalker
custom_data    = scripts\Michal_i_Gabi\Gabi.ltx


Michal.ltx

[logic]
active = remark@emperor

[remark@emperor]
combat_ignore_cond = true
combat_ignore_keep_when_attacked = false
anim = hide
target = actor
on_info = {=see_enemy} remark@fire
wounded = wounded@work
[smart_terrains]
none = true
[wounded@work]
hp_state = 0|wounded_heavy@help_heavy
hp_state_see = 0|wounded_heavy@help_heavy
hp_victim = 0|nil
hp_fight = 0|false
hp_cover = 0|false

[remark@fire]
combat_ignore_cond = {!is_Michal_enemy}
radius = 0
anim = hide
on_info = {=health_le(0.5)} remark@search
wounded = wounded@work
sniper = true

Gabi.ltx wygląda identycznie


npc_profile.ltx

<character id="Michal">
        <class>Michal</class>
    </character>
<character id="Gabi">
        <class>Gabi</class>
    </character>


My_spawn.script

function spawn_Michal() 
alife():create("Michal",vector():set(-244.069,-19.549,-128.138),12825,8)
end

function spawn_Gabi() 
alife():create("Gabi",vector():set(-213.51487731934,-23.183620452881,-124.86627960205),39928,59)
end


xr.conditions.script

-- Michal wpis pocz№tkowy
function is_Michal_enemy(enemy, object)
return enemy:id() ~= db.actor:id()
end
-- Michal wpis koсcowy

-- Gabi wpis pocz№tkowy
function is_Gabi_enemy(enemy, object)
return enemy:id() ~= db.actor:id()
end
-- Gabi wpis koсcowy

 

 

BTW Czy jeśli chcę stworzyć NPC i nie zastosuję się do niektórych kroków (dotyczących utrzymania pozycji) i nie przypiszę mu smart terreina to będzie zawsze wywalać? Nie powinno być tak, że NPC będzie chodził gdzie chce?

 

Odnośnik do komentarza
Udostępnij na innych stronach

Kompletnie teraz strzelę ale spróbuj zamienić sekcje w spawn_sections.ltx na te i zobacz czy błąd wystąpi:

[Michal]:stalker
$spawn = "respawn\Michal"
character_profile = sim_stalker_master
spec_rank = master
community = stalker
custom_data    = scripts\Michal_i_Gabi\Michal.ltx

[Gabi]:stalker
$spawn = "respawn\Gabi"
character_profile = sim_stalker_master
spec_rank = master
community = stalker
custom_data    = scripts\Michal_i_Gabi\Gabi.ltx

Postacie nie będą takie jak chcesz ale sprawdź czy gra wywali do pulpitu.

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem to od nowa na czysta wersję stalkera i normalnie zrobiłem wpisy w character_desc_escape i npc_profile. Zmieniłem też spawn_sections i dodałem w config\scripts pliki z treścią dla schematu snajpera (skopiowane z pliku tutoriala). Próbowałem też nie tworzyć wpisy custom_data i stworzyć stalkerów ale się nie udało. Co dziwne gdy dodaję w pliku odpowiedzialnym za spawn przedmiotu podczas dialogu identyfikator jakiejś postaci ze spawn_sections to ta postać się spawnuje. Udało mi się zespawnować monolitowca w piwnicy w kordonie, stalkera, mutanty, kanister, wojskowego. Tylko z własną postacią mam problem. Obojętnie czy modyfikuje pliki script takie jak bind_stalker czy xr_conditions czy zostawiam je w spokoju ciągle wywala to radiation_v

Edytowane przez Kacper777777
Odnośnik do komentarza
Udostępnij na innych stronach

Zapodaję linka

megawrzuta.pl/filesgroup/28ffd5ff4ebe7d87646ccef19f5d3674.html

Gdy próbowałem zrobić żeby utrzymywał pozycję to wywala już innego loga

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:340: attempt to call field 'start_my_spawn' (a nil value)
 

stack trace:
 

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, miałem ten twój radiation_v, ten drugi błąd mi nie wystąpił.

Usuń to z spawn_sections.ltx:

;--Michal początek sekcji
[Michal]:stalker  
$spawn = "respawn\Michal"  
character_profile = sim_stalker_master
spec_rank = master  
community = stalker
;--Michal koniec sekcji 

;--Gabi początek sekcji
[Gabi]:stalker  
$spawn = "respawn\Gabi"  
character_profile = sim_stalker_master 
spec_rank = master  
community = stalker
;--Gabi koniec sekcji

I wstaw to:

[michal]:stalker  
$spawn = "respawn\michal"  
character_profile = sim_stalker_master
spec_rank = master  
community = stalker

[gabi]:stalker  
$spawn = "respawn\gabi"  
character_profile = sim_stalker_master 
spec_rank = master  
community = stalker

Ustaw tam sobie te custom_data i character_profile ale nie rób dużych liter i zbędnych "Początek sekcji" i "Koniec sekcji" bo tylko syf się robi.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Meta zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z tej strony, zgadzasz się na nasze Warunki użytkowania.