Skocz do zawartości

Jak zrobić artefakt maskę


Mithrandir

Rekomendowane odpowiedzi

@Mithrandir,

o tworzeniu artefaktu maski p-gaz był już temat, który jednak - jak sam twierdzisz jest niedostępny (dość nietypowy problem)...dlatego napiszę jeszcze raz z tą uwagą aby administracja nie usunęła wątku. Poprzednio podałem sposób na tworzenie artefaktu w wersji uproszczonej - bez hud'a maski przeciwgazowej, tym razem będzie inaczej a całość podzielę na 2 części wykonawcze - uproszczoną i zaawansowaną.

 

I. Część uproszczona.

[ 1 ]. W katalogu [gamedataconfigmisc] - odnajdujesz plik artefacts.ltx

[ 2 ]. Robisz kopię w/w pliku oraz plików, które zamierzasz modyfikować (zwłaszcza jeśli planujesz usprawnić jakiś mod).

[ 3 ]. Na samym dole pliku artefacts.ltx dodaj poniższy wpis, który podłączy nowy plik z artefaktami (maski p-gaz) do gry.

#include "art_gasmask.ltx"

w oryginalnym pliku z patcha 1.0004, wpis dodałem w linijce nr. 1373. Wpis nie powinien przerywać sekcji konfigurującej dany artefakt, dlatego najlepiej dodać go na samym dole pliku.

[ 4 ]. Utwórz plik .ltx (zmiana rozszerzenia z .txt) o nazwie j/w czyli. art_gasmask.ltx, który umieszczasz w katalogu [misc]. W pliku tym utworzymy artefakty-maski p-gaz w ilości 3 szt. Dlaczego tyle? - ponieważ skrypt dodający hud autorstwa Thunder Freak'a jest skonfigurowany na 3 rodzaje masek p-gaz, co nie oznacza, że można mieć w grze tylko 3 maski, jednakże chcąc wprowadzić nowe sekcje trzeba zmodyfikować pliki skryptu.

[ 5 ]. W nowo utworzonym pliku, dodajesz nowy artefakt, który stworzysz np. w oparciu o już istniejący np. af_fuzz_kolobok - artefakt Kulebiak. Możesz skopiować poniższe wpisy do tego pliku. - opisałem wszystkie parametry w postaci komentarza (polecam zapoznać się z opisem). Poniżej sekcje 3 masek p-gaz dla pliku art_gasmask.ltx :

; Artefakt maska pgaz/ sekcja 1[af_pgaz1]:af_baseGroupControlSection    = spawn_group$spawn		  = "artifactsfuzz kolobok"$npc		    = on    ; option for Level Editor;$prefetch	  = 3cform		   = skeletonclass		   = ARTEFACT visual		  = equipmentsgasmask3.ogf  ; model .ogf artefaktu - w tym przypadku ścieżka do modelu maski.description	 = enc_zone_artifact_af-fuzz-kolobox   ; opis artefaktuinv_name	    = af_mask_1 ; skrócona nazwa w ekwipunkuinv_name_short  =inv_weight	  = 0.35 ; waga artefaktu [kg] inv_grid_x	  = 12   ; współrzędna osi X na siatce pliku z ikonamiinv_grid_y	  = 23   ; współrzędna osi Y na siatce pliku z ikonamicost		    = 9500 ; cena bazowa artefaktu/przedmiotu.jump_height	 = 0.0  ; wysokość na jaką artefakt "podskakuje" po wyrzuceniu. ;particles	  = anomaly2artefactartefact_puxx  ; efekt wizualny - usunięty dla maski.lights_enabled  = false	 ; poświata artefaktu, blask  ;Poniżej znajdują się sekcje odpowiedzialne za regenerację zdrowia, przyrost radiacji etc.health_restore_speed    = 0.0    ; odzyskiwanie zdrowia		    radiation_restore_speed = -0.003 ; tempo usuwania radiacji, wartość ujemna usuwa, dodatnia - zwiększa radiację.satiety_restore_speed   = 0.0    ; parametr odpowiedzialny za sytość.power_restore_speed	 = -0.001 ; tempo regeneracji energii, wartość ujemna zwiększa zmęczenie postaci.bleeding_restore_speed  = 0.0    ; parametr odpowiedzialny za krwawieniehit_absorbation_sect    = af_pgaz1_absorbation    ;Dla poniższych wartości, 0 = max ochrona, 1 = brak ochrony[af_pgaz1_absorbation]burn_immunity		  = 1.0  ; odporność na ogień     strike_immunity	    = 1.0  ; odporność na uderzenieshock_immunity		 = 1.0  ; odporność na porażeniewound_immunity		 = 1.0  ; odporność na zadrapanie, uszkodzenia mechaniczne	  radiation_immunity	 = 0.9  ; odporność na radiacjętelepatic_immunity	 = 1.0  ; odporność na telepatięchemical_burn_immunity = 0.7  ; odporność na korozję chemicznąexplosion_immunity	 = 1.0  ; odporność na wybuchfire_wound_immunity    = 1.0  ; odporność na ostrzał; Artefakt maska pgaz/ sekcja 2[af_pgaz2]:af_baseGroupControlSection    = spawn_group$spawn		  = "artifactsfuzz kolobok"$npc		    = on    ; option for Level Editor;$prefetch	  = 3cform		   = skeletonclass		   = ARTEFACT visual		  = equipmentsgasmask1.ogf  ; model ogf artefaktu - w tym przypadku ścieżka do modelu maski.description	 = enc_zone_artifact_af-fuzz-kolobot   ; opis artefaktuinv_name	    = af_mask_2 ; skrócona nazwa w ekwipunkuinv_name_short  =inv_weight	  = 0.25 ; waga artefaktu [kg] inv_grid_x	  = 13   ; współrzędna osi X na siatce pliku z ikonamiinv_grid_y	  = 23   ; współrzędna osi Y na siatce pliku z ikonamicost		    = 4000 ; cena bazowa artefaktu/przedmiotu.jump_height	 = 0.0  ; wysokość na jaką artefakt "podskakuje" po wyrzuceniu. ;particles	  = anomaly2artefactartefact_puxx  ; efekt wizualnylights_enabled  = false	 ; poświata artefaktu, blask  ;Poniżej znajdują się sekcje odpowiedzialne za regenerację zdrowia, przyrost radiacji etc.health_restore_speed    = 0.0    ; odzyskiwanie zdrowia		    radiation_restore_speed = -0.002 ; tempo usuwania radiacji, wartość ujemna usuwa, dodatnia - zwiększa radiację.satiety_restore_speed   = 0.0    ; parametr odpowiedzialny za sytość.power_restore_speed	 = -0.001 ; tempo regeneracji energiibleeding_restore_speed  = 0.0    ; parametr odpowiedzialny za krwawieniehit_absorbation_sect    = af_pgaz2_absorbation    ;Dla poniższych wartości, 0 = max ochrona, 1 = brak ochrony[af_pgaz2_absorbation]burn_immunity		  = 1.0  ; odporność na ogień     strike_immunity	    = 1.0  ; odporność na uderzenieshock_immunity		 = 1.0  ; odporność na porażeniewound_immunity		 = 1.0  ; odporność na zadrapanie, uszkodzenia mechaniczne	  radiation_immunity	 = 0.9  ; odporność na radiacjętelepatic_immunity	 = 1.0  ; odporność na telepatięchemical_burn_immunity = 0.7  ; odporność na korozję chemicznąexplosion_immunity	 = 1.0  ; odporność na wybuchfire_wound_immunity    = 1.0  ; odporność na ostrzał; Artefakt maska pgaz/ sekcja 3[af_pgaz3]:af_baseGroupControlSection    = spawn_group$spawn		  = "artifactsfuzz kolobok"$npc		    = on    ; option for Level Editor;$prefetch	  = 3cform		   = skeletonclass		   = ARTEFACT visual		  = equipmentsgasmask3.ogf  ; model ogf artefaktu - w tym przypadku ścieżka do modelu maski.description	 = enc_zone_artifact_af-fuzz-kolobor   ; opis artefaktuinv_name	    = af_mask_3 ; skrócona nazwa w ekwipunkuinv_name_short  =inv_weight	  = 0.35 ; waga artefaktu [kg] inv_grid_x	  = 12   ; współrzędna osi X na siatce pliku z ikonamiinv_grid_y	  = 23   ; współrzędna osi Y na siatce pliku z ikonamicost		    = 12000 ; cena bazowa artefaktu/przedmiotu.jump_height	 = 0.0  ; wysokość na jaką artefakt "podskakuje" po wyrzuceniu. ;particles	  = anomaly2artefactartefact_puxx  ; efekt wizualnylights_enabled  = false	 ; poświata artefaktu, blask  ;Poniżej znajdują się sekcje odpowiedzialne za regenerację zdrowia, przyrost radiacji etc.health_restore_speed    = 0.0    ; odzyskiwanie zdrowia		    radiation_restore_speed = -0.004 ; tempo usuwania radiacji, wartość ujemna usuwa, dodatnia - zwiększa radiację.satiety_restore_speed   = 0.0    ; parametr odpowiedzialny za sytość.power_restore_speed	 = -0.001 ; tempo regeneracji energiibleeding_restore_speed  = 0.0    ; parametr odpowiedzialny za krwawieniehit_absorbation_sect    = af_pgaz3_absorbation    ;Dla poniższych wartości, 0 = max ochrona, 1 = brak ochrony[af_pgaz3_absorbation]burn_immunity		  = 1.0  ; odporność na ogień     strike_immunity	    = 1.0  ; odporność na uderzenieshock_immunity		 = 1.0  ; odporność na porażeniewound_immunity		 = 1.0  ; odporność na zadrapanie, uszkodzenia mechaniczne	  radiation_immunity	 = 0.8  ; odporność na radiacjętelepatic_immunity	 = 1.0  ; odporność na telepatięchemical_burn_immunity = 0.7  ; odporność na korozję chemicznąexplosion_immunity	 = 1.0  ; odporność na wybuchfire_wound_immunity    = 1.0  ; odporność na ostrzał


[ 6 ]. Warto poświęcić trochę czasu na opis przedmiotu. W pliku w/w wprowadzono nowe opisy, które pierwotnie nie występują w grze, są to następujące sekcje:

description	 = enc_zone_artifact_af-fuzz-kolobox

jest to opis artefaktu o identyfikatorze af_pgaz1

description	 = enc_zone_artifact_af-fuzz-kolobot

jest to opis artefaktu o identyfikatorze af_pgaz2

description	 = enc_zone_artifact_af-fuzz-kolobor

jest to opis artefaktu o identyfikatorze af_pgaz3

Powyższe wpisy są zmodyfikowaną wersją opisu art. Kulebiak. Aby każda z masek p-gaz posiadała unikalny opis, należy dodać odpowiednie wpisy - zgodnie z parametrem description do pliku string_table_enc_zone.xml [gamedataconfigtextpol], zatem wprowadzam doń następujące sekcje:

    <string id="enc_zone_artifact_af-fuzz-kolobox">	        <text>Maska przeciwgazowa to podstawowy element wyposażenia stalkerów - jako pierwszy stopień ochrony dróg oddechowych przed toksynami i radiacją. Jej wadą jest szybszy przyrost zmęczenia z uwagi na ograniczoną przepustowość cyrkulacji powietrza.</text>    </string>    <string id="enc_zone_artifact_af-fuzz-kolobot">	        <text>Maska przeciwgazowa SzM-41M (typ "Słoń") jest jedną z najbardziej rozpowszechnionych wśród systemów ochrony dróg oddechowych z uwagi na przystępną cenę. Warto zaopatrzyć się w nią podczas eksploracji radioaktywnych obszarów Zony.</text>    </string>    <string id="enc_zone_artifact_af-fuzz-kolobor">	        <text>%c[255,255,1,1]Ulepszona wersja maski MP-6.</text>    </string>

identyfikatory opisu tj. string id muszą być zgodne z wprowadzonymi parametrami description znajdującymi się w pliku art_gasmask.ltx. Oczywiście - można wprowadzić dowolny opis przedmiotu - ja dałem przykładowy opis masek.

Aby skrócona nazwa artefaktu wyświetlała się prawidłowo, należy dodać do pliku string_table_enc_zone.xml opis zgodny z parametrem inv_name, są to sekcje następujące:

<string id="af_mask_1">        <text>Maska p-gaz typ MP-6</text>    </string>    <string id="af_mask_2">        <text>Maska p-gaz SzM-41M</text>    </string>    <string id="af_mask_3">        <text>Maska p-gaz SzM-41M</text>    </string>

[ 7 ]. Mając opis, dodać należy teksturę w ekwipunku zgodną z wprowadzonym modelem gasmask3.ogf, przydatny w tym celu okaże się ten poradnik.

Za współrzędne ikony odpowiadają wpisy (poniżej sekcje już edytowane dla potrzeb modyfikacji):

dla maski o identyfikatorze: af_pgaz1/af_pgaz3 (obie maski wykorzystują tę samą ikonę)

inv_grid_x	  = 12   ; współrzędna osi X na siatce pliku z ikonamiinv_grid_y	  = 23   ; współrzędna osi Y na siatce pliku z ikonami

dla maski o identyfikatorze: af_pgaz2

inv_grid_x	  = 13   ; współrzędna osi X na siatce pliku z ikonamiinv_grid_y	  = 23   ; współrzędna osi Y na siatce pliku z ikonami

zatem, zgodnie z w/w parametrami należy umieścić właściwą ikonę przedmiotu w pliku ui_icon_equipment.dds [gamedatatexturesui].

Aby ułatwić kwestie spojrzenia na obliczanie współrzędnych na siatce ekwipunku - screen z naniesioną numeracją przy ustawieniu oczka siatki 50x50 px.

Dołączona grafika

 

W Cieniu Czarnobyla znajdują się 3 modele maski przeciwgazowej, które nie zostały wykorzystane przez twórców. Znaleźć je można w [gamedatameshesequipments], są to modele:

gasmask1.ogf
gasmask2.ogf
gasmask3.ogf
dlatego nie trzeba dodawać modeli maski do [gamedata], chyba że chcesz wyciąć z moda maskę przeciwgazową o określonym wyglądzie, wówczas należy umieścić go zgodnie ze ścieżką określoną parametrem "visual" w pliku konfigurującym artefakt, który to parametr opisałem w tymże pliku.

Na tym można zakończyć część uproszczoną, która nie dodaje widoku hud'a maski p-gaz, jednakże maska przeciwgazowa posiada wszelkie parametry zdefiniowane w pliku art_gasmask.ltx i nadaje się do zakładania na pas z uwagi na wykorzystanie konfiguracji artefaktu.

 

 

II. Część zaawansowana - dodawanie hud'a maski.

Ta część modyfikacji dodaje widok maski p-gaz wraz z efektami oddechu, krwawienia, zmęczenia - czyli efektów zwiększających poziom realizmu w grze.

[ 1 ]. Do folderu [gamedatascripts] dodajemy plik skryptu odpowiedzialnego za hud maski p-gazowej.  Jest to plik hud.script autorstwa Thunder Freak'a - poniżej zawartość w wersji ze spolszczonymi komunikatami oraz parametrami dostosowanymi do identyfikatorów wprowadzonych masek p-gaz (af_pgaz1/af_pgaz2/af_pgaz3):

--[[------------------------------------------------------------------------------------------------ File	   : invasion_hud.script Description: HUD Masken Script mit abnehmbaren Masken, Bluteffekten und Blureffekte Copyright  : Thunder Freak (c) 2009, Rudix (c) 2008, Russo (c) 2008 Author	 : Thunder Freak (c) 2009 Last edit  : 21.05.2009 (by atonium2027 & Thunder Freak) Skrypt skonfigurowany na 3 maski przeciwgazowe: af_pgaz1/af_pgaz2/af_pgaz3--]]------------------------------------------------------------------------------------------------local current_suithudlocal mycurrent_suithudlocal suit_conditionlocal suitfirstrun = "yes"local actor_last_health = 0local bloodtime = 0local bloodtimeb = 0local isbleeding = "no"local countblood = 0local m_blood = nillocal isactcondset = "false"local radeffect = "false"local blurs = nillocal blurval = 0local blurlt = 0local blurcyctime = 0local blurlastphase = 0local suittypes = {   exo = "hud_exo",   scientific = "hud_sci",   ecolog = "hud_sci",   protection = "hud_sci",   military = "hud_mil",   specops = "hud_mil",   killer = "hud_gas",   cs_heavy = "hud_kill",   bandit = "hud_bandit",   cs_light = "hud_bandit"}local xrbelt = nillocal info_send = 0local breath_timelocal init_breath = falselocal heartbeat_setlocal verschnaufpause = {    [0] = "Potrzebny odpoczynek.",    [1] = "Stary, jestem wyczerpany.",    [2] = "W tej masce trudno biec z ekwipunkiem.",    [4] = "Chwila na odpoczynek."}function checkmysuithud()    local suithudtype, suithudname    if db.actor ~= nil then        bleedcondition()        atmen()        suithudtype = nil                local csuithud = db.actor:get_current_outfit()                if csuithud ~= nil then suithudname = csuithud:section() end        if suithudname ~= nil then            suit_condition = check_current_suit_condition()                    if suit_condition ~= nil then                    for i,v in pairs(suittypes) do                    if string.find(suithudname, i) then                        suithudtype = v .. "_" .. suit_condition                        xrbelt = nil                    end                end                        end        end                if suithudtype == nil then            check_mask_on_belt()            xrbelt = inventory.belt["af_pgaz1"]            if xrbelt == nil then xrbelt = inventory.belt["af_pgaz2"] end            if xrbelt == nil then xrbelt = inventory.belt["af_pgaz3"] end                        if xrbelt ~= nil and suit_condition ~= nil then suithudtype = "hud_gasmask_" .. suit_condition end        end                setmysuithud(suithudtype)        init_blurs()        blood()        set_blood()    endendfunction check_mask_on_belt()    local beltset = 0    local x1belt = inventory.belt["af_pgaz1"]    local x2belt = inventory.belt["af_pgaz2"]    local x3belt = inventory.belt["af_pgaz3"]    if x1belt == nil and x2belt == nil and x3belt == nil then return end    if x1belt ~= nil then        if x1belt == 1 then            beltset = 1        elseif x1belt > 1 then            beltset = 10        end    end    if x2belt ~= nil then        if x2belt == 1 then            beltset = beltset + 1        elseif x2belt > 1 then            beltset = 10        end    end    if x3belt ~= nil then        if x3belt == 1 then            beltset = beltset + 1        elseif x3belt > 1 then            beltset = 10        end    end        if info_send == 1 and beltset == 1 then info_send = 0 end        if beltset > 1 and info_send == 0 then        local text = "Przez ile masek chcesz oddychac, hmm? - jedna nie wystarczy?"        db.actor:give_game_news(text, "uiui_icon_gasmask", Frect():set(x,y,83,47), 1000, 5000)            info_send = 1    endendfunction check_current_suit_condition()    local suitname    local csuithud = db.actor:get_current_outfit()    if csuithud ~= nil then suitname = csuithud:section() end    if suitname ~= nil then        suit_condition = ""        local curcond = csuithud:condition()        if curcond >= 0.95 then            suit_condition = "blue"        elseif curcond >= 0.85 and curcond < 0.95 then            suit_condition = "green"        elseif curcond >= 0.70 and curcond < 0.85 then            suit_condition = "yellow"        elseif curcond >= 0.50 and curcond < 0.70 then            suit_condition = "red"        elseif curcond >= 0.27 and curcond < 0.50 then            suit_condition = "red2"        elseif curcond < 0.27 then            suit_condition = "red3"        end    end    return suit_conditionendfunction setmysuithud(hudtype)    local chud = get_hud():GetCustomStatic(mycurrent_suithud)    if chud ~= nil and mycurrent_suithud ~= nil and hudtype == nil then        get_hud():RemoveCustomStatic(mycurrent_suithud)        mycurrent_suithud = nil    end    if hudtype == nil and mycurrent_suithud == nil then return end    local new_hud = get_hud():GetCustomStatic(hudtype)    if new_hud == nil then        get_hud():RemoveCustomStatic(mycurrent_suithud)        get_hud():AddCustomStatic(hudtype)           	 if suit_condition ~= "green" and suit_condition ~= "blue" then            local snd_obj = xr_sound.get_safe_sound_object([[materialglassglass_fall03hl]])            snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 9.0)   	 end        mycurrent_suithud = hudtype    end    --invasion_mags.show_mags_on_mask()endlocal info2_send = falsefunction atmen()    local vol = 0    local ausdauer = db.actor.power    if init_breath == false then        breath_time = time_global() + 2300        heartbeat_set = time_global() + 7800        init_breath = true    end    if time_global() > breath_time and ausdauer < .7 then        if ausdauer < .7 and ausdauer >= .6 then            vol = 0.5        elseif ausdauer < .6 and ausdauer >= .5 then            vol = 1.0        elseif ausdauer < .5 and ausdauer >= .35 then            vol = 1.5        elseif ausdauer < .35 and ausdauer >= .2 then            vol = 2.0        elseif ausdauer < .2 then            vol = 2.5        end                local snd_obj = xr_sound.get_safe_sound_object([[characters_voicehuman_03stalkerstatesbreathbreath_1]])        snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), vol)        breath_time = time_global() + 2300    end    if ausdauer < .3 and time_global() > heartbeat_set then        local snd_obj = xr_sound.get_safe_sound_object([[heart2]])        snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 3.0)        heartbeat_set = time_global() + 7800    end    if ausdauer < .2 and info2_send == false then        db.actor:give_game_news(verschnaufpause[math.random(1, 4)], "uiui_iconstotal", Frect():set(0,0,83,47), 2000, 6000)            info2_send = true    end    if ausdauer > .2 then info2_send = false endendfunction init_blurs()    if mycurrent_suithud ~= nil and db.actor.power < .7 then        local zoom = 67.5 / device().fov        zoom = (zoom - 1) * 1.5 + 1        if zoom < 1.001 then            zoom = 1.001        end        local stretchy = 0.75 / (math.floor(device().aspect_ratio * 1000) / 1000)        if stretchy < 1 then stretchy = 1 end        local rect = {x = -768 * zoom + 768, y = (-512 * zoom + 512) * stretchy - (stretchy - 1) * 300, w = 1024 * zoom, h = 768 * zoom * stretchy}                set_blurs(true, rect)    else        set_blurs(false)    endendfunction set_blurs(enabled,rect)    if (not blurs) or get_hud():GetCustomStatic("hud_blur1") == nil then        blurs = {}        for i = 1, 5 do            get_hud():AddCustomStatic("hud_blur" .. i)            blurs[i] = get_hud():GetCustomStatic("hud_blur" .. i):wnd()            blurs[i]:SetWidth(0)        end    end        if not enabled then        for i = 1, 5 do            blurs[i]:SetWidth(0)        end        return    end    local power = db.actor.power    local period = 1.0 + power * power * 1.0    local expirt = 0.3    local breathpower = 3    local delta = (time_global() - blurlt) / 1000    local phase = (time_global() - blurcyctime) / 1000        blurlt = time_global()    if phase > period then        phase = phase % period        blurcyctime = blurlt - phase * 1000    end    if blurlastphase > phase then        blurlastphase = 0    end    local blurdelta = delta * -0.7    if blurlastphase < expirt and phase < expirt then        blurdelta = blurdelta + (phase - blurlastphase) * breathpower    elseif blurlastphase < expirt then        blurdelta = blurdelta + (expirt - blurlastphase) * breathpower    end    blurlastphase = phase    blurval = blurval + blurdelta    if blurval > 0.999 then        blurval = 0.999    elseif blurval < 0 then        blurval = 0    end    local tm = math.floor(blurval * 3)    local tmn = (tm + 1)    local v = blurval * 3 - math.floor(blurval * 3)    v= 1 - v    local v1 = 1 - v    if tm ~= 0 then        blurs[tm]:SetColor(GetARGB(v * 255, 255, 255, 255))    end    if tmn ~= 0 then        blurs[tmn]:SetColor(GetARGB(v1 * 255, 255, 255, 255))    end    for i = 1,4 do        if i == tm or i == tmn then            blurs[i]:SetWndRect(Frect():set(rect.x, rect.y, rect.w, rect.h))        else            blurs[i]:SetWndRect(Frect():set(rect.x, rect.y, 0, 0))        end    endendfunction blood()    local radwidth = db.actor.radiation    if db.actor ~= nil and radwidth == 0 then        if db.actor:alive() then            local current_health = math.floor(db.actor.health * 100)            local cbloodtime = time_global()            if cbloodtime > bloodtime and isbleeding == "stopit" then                for i=1,5 do                    if get_hud():GetCustomStatic("hud_blood" .. i) ~= nil then                        get_hud():RemoveCustomStatic("hud_blood" .. i)                        isbleeding = "no"                    end                end            end            if cbloodtime > bloodtime then                bloodtime = time_global() + 1500                if actor_last_health > current_health and actor_last_health ~= 0 then isbleeding = "yes" end                actor_last_health = math.floor(db.actor.health * 100)            end        end    endendfunction set_blood()    local radwidth = db.actor.radiation    local cbloodtimed = time_global()    if db.actor ~= nil and cbloodtimed > bloodtimeb and isbleeding == "yes" and radwidth == 0 then        bloodtimeb = time_global() + 170        m_blood = {}        countblood = countblood + 1        get_hud():AddCustomStatic("hud_blood" .. countblood)        m_blood[countblood] = get_hud():GetCustomStatic("hud_blood" .. countblood):wnd()        local chudblood = "hud_blood" .. countblood        if countblood == 4 then            isbleeding = "stopit"            countblood = 0        end    endendfunction bleedcondition()    if db.actor.health < 0.31 and isactcondset ~= "true" then        level.add_pp_effector ("alcohol.ppe", 2012, true)        isactcondset = "true"    end    if db.actor.health > 0.30 and isactcondset ~= "false" then        level.remove_pp_effector (2012)        isactcondset = "false"    end    if db.actor.radiation > 0.3 and radeffect ~= "true" then        level.add_pp_effector ("alcohol.ppe", 2013, true)        radeffect = "true"    end    if db.actor.radiation == 0 and radeffect ~= "false" then        level.remove_pp_effector (2013)        radeffect = "false"    endendfunction check_blood()endlocal logf_console = nilfunction logf( fmt, ... )    logf_console = get_console()    logf = logf_main    logf_main( fmt, ... )endfunction logf_main( fmt, ... )    local c = select( "#", ... )    if c <= 0 then -- nothing to format	  logf_console:execute( ":" .. string.gsub( fmt, " ", "160" ) )    else	  logf_console:execute( ":" .. string.gsub( fmt, " ", "160" ) )    endend

[ 2 ]. Do tego samego folderu j/w dodaję plik inventory.script, poniżej zawartość pliku dostosowana do utworzonych masek p-gaz :

-- This script taken from Soljanka. They appear to add duplicate artifact removal.-- The original source code appears to be Thunderfreaks "gasmask mod".-- Altered by Nuor 8/20/2010, for flexibility, now items and belt quanities can be customized. belt = {}belt_id = {}belt_status = falsetbl = {} local need_update = truelocal inventory_open = falselocal separator_spawned = falselocal separator = "separator"local belt_limit_enabled = truelocal debug = falselocal flag function update()		 if (need_update == false) then return end		 if debug == true and belt_status == true then get_console():execute("belt_status=false") end	    belt_status = false		 -- Spawn separatora	    if (separator_spawned == false) then			    alife():create(separator,					    db.actor:position(),					    db.actor:level_vertex_id(),					    db.actor:game_vertex_id(),					    db.actor:id())			    separator_spawned = true			    if debug == true then get_console():execute("separator_spawned") end			    return	    end		 belt = {}	    belt_id = {}	    flag = 0		 -- Usunięcie asortymentu	    db.actor:inventory_for_each(scan_inv)	    need_update = false		 -- Usunięcie separatora	    db.actor:inventory_for_each(del_separator)	    separator_spawned = false		 if debug == true and belt_status == false then get_console():execute("belt_status=true") end	    belt_status = true		 if debug == true then			    for i,k in pairs(belt) do					    get_console():execute(i.."="..k)			    end	    end	    if belt_limit_enabled == true then remove_excess() endend -- Skanowanie przedmiotów w ekwipunkufunction scan_inv(item)		 if tbl and tbl ~= {} then			    for k,v in pairs(tbl) do					    if item:id() == k then							    level.object_by_id(k):set_condition(v)  -- reset condition of transferred items							    tbl[k] = nil					    end			    end	    end		 local section = item:section()		 if section == separator then			    flag = 1			    return	    end		 if flag == 1 then			    if slot_item(item) ~= nil then					    flag = 2			    else					    insert_to_table(belt, section)					    belt_id[item:id()] = true			    end	    endend -- Dodawanie tabelifunction insert_to_table(tbl, section)	    if tbl[section] == nil then			    tbl[section] = 1	    else			    tbl[section] = tbl[section] + 1	    endend -- Skasowanie separatorafunction del_separator(item)	    if item:section() == separator then			    alife():release(alife():object(item:id()), true)			    if debug == true then get_console():execute("separator_removed") end	    endend -- Ustalenie czy obiekt znajduje się w slociefunction slot_item(item)	    for i=0,12 do			    local obj = db.actor:item_in_slot(i)			    if obj and item:id() == obj:id() then					    return i			    end	    end		 return nilend -- Podniesienie przedmiotufunction on_item_take(item)	    if item:section() == separator then return end		 if (inventory_open == false) then			    if (separator_spawned == true) then					    db.actor:inventory_for_each(del_separator)					    separator_spawned = false			    end				 need_update = true			    if debug == true then get_console():execute("item_take") end	    endend -- Wyrzucenie przedmiotufunction on_item_drop(item)	    if item:section() == separator then return end		 if (inventory_open == false) then			    if (separator_spawned == true) then					    db.actor:inventory_for_each(del_separator)					    separator_spawned = false			    end				 need_update = true			    if debug == true then get_console():execute("item_drop") end	    endend -- Ekwipunek Zamykanie/Otwieraniefunction on_inventory_info(info_id)	    if info_id == "ui_inventory" then			    inventory_open = true			    if debug == true then get_console():execute("inventory_open") end		 elseif info_id == "ui_inventory_hide" then			    inventory_open = false			    need_update = true			    if debug == true then get_console():execute("inventory_close") end	    endend -- move any excess artifacts from belt to inventoryfunction remove_excess()	    local t = check_excess()	    if t == nil then return end	    for k, v in pairs(belt_id) do			    local obj = level.object_by_id(k)			    local sect = obj:section()			    if t[sect] ~= nil then					    if t[sect] > 0 then							    t[sect] = t[sect] - 1					    elseif t[sect] <= 0 then							    local cond = obj:condition()							    alife():release(alife():object(k), true)							    local n_sobj = alife():create(sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())							    tbl[n_sobj.id] = cond					    end			    end	    endend -- sets item slot max-- returns a table of the form [Section] = <allowed slot amount>-- storage variables <art_lim..#> store the number of bonus slots for each of the 5 categories; "" and 1-4function check_excess()	    local art_limit =			    {			    af_pgaz1 = 1,			    af_pgaz2 = 1,			    af_pgaz3 = 1			    }	    local result = {}	    local belt_limit = nil	    for k, v in pairs(belt) do			    belt_limit = art_limit[k]			    if check_for_suit(k) == true then belt_limit = 0 end			    if belt_limit then					    result[k] = belt_limit			    end	    end	    return resultend -- When wearing a suit with mask no gasmasks are allowedfunction check_for_suit(item)	    local suit_types = {"exo", "scientific", "ecolog", "protection", "military", "specops", "killer", "cs_heavy"}	    local check,suit = false,nil	    if item:find("gasmaske") then			    for k,v in pairs(suit_types) do					    suit = _i.get_suit_stats("name")					    if suit ~= nil then							    if suit:find(v) then									    check = true									    break							    end					    end			    end	    end	    return checkend

Plik ten odpowiada za usuwanie maski z pasa - jeśli chcemy tam przenieść więcej niż jedną szt. tego samego rodzaju (patrz filmik od 1:37). Skrypt wymaga jeszcze uzupełnienia, ponieważ powinien usuwać więcej niż jedną maskę z pasa. Na chwilę obecną - aby nie psuć realizmu, można ograniczyć ilość noszonych na pasie masek p-gaz.

[ 3 ]. Aby wspomniane pliki skryptu tj. hud.script oraz inventory.script były wykorzystane w grze, należy podłączyć je do pliku bind_stalker.script [gamedatascripts] - dodaję zatem wpisy następujące:
w sekcji:

function actor_binder:info_callback(npc, info_id)

dodaję odnoszący się do nazwy skryptu wpis (skopiuj poniższy wiersz):

inventory.on_inventory_info(info_id)

następny wpis dodaję w sekcji:

function actor_binder:on_item_take (obj)

jest to kolejne odwołanie do pliku inventory.script (skopiuj poniższy wiersz):

inventory.on_item_take(obj)

ostatni z wpisów umieścić należy w sekcji:

function actor_binder:update(delta)

jest to następujące odwołanie do dodanych plików (skopiuj poniższy wiersz) :

hud.checkmysuithud()inventory.update()

całość można sprawdzić za pomocą programu WinMerge - na końcu posta wstawię pliki do pobrania.

[ 4 ]. W pliku escape_dialog.script [gamedatascripts] dodaję nowe przedmioty, które otrzymamy po rozmowie z Wilkiem - poniżej zmodyfikowana wersja funkcji:

function give_weapon_to_actor (trader, actor)    dialogs.relocate_item_section(trader, "wpn_pm", "in")    dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")    dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")    dialogs.relocate_item_section(trader, "wpn_knife", "in")    dialogs.relocate_item_section(trader, "af_pgaz1", "in")    dialogs.relocate_item_section(trader, "af_pgaz2", "in")    dialogs.relocate_item_section(trader, "af_pgaz3", "in")end

W wyniku rozmowy otrzymujemy maski przeciwgazowe o identyfikatorze af_pgaz1/af_pgaz2/af_pgaz3 - patrz plik art_gasmask.ltx

[ 5 ]. Do pliku items.ltx [gamedataconfigmisc] dodaję (na samym końcu pliku) sekcję odpowiedzialną za separator zdefiniowany w skrypcie inventory.script. Nie będę zagłębiał się w niuanse funkcji tegoż pliku, jednakże nie można pominąć tego wpisu dla prawidłowego działania modyfikacji :

[separator]:breadinv_grid_width        = 0inv_grid_height       = 0inv_weight            = 0

[ 6 ]. Do pliku ui_custom_msgs.xml [gamedataconfigui] dodać należy wpis konfigurujący tekstury Hud'a :

    <hud_blood1 x="0" y="0" width="1024" height="768" stretch="1">	  <texture>hudblood1</texture>    </hud_blood1>    <hud_blood2 x="0" y="0" width="1024" height="768" stretch="1">	  <texture>hudblood2</texture>    </hud_blood2>    <hud_blood3 x="0" y="0" width="1024" height="768" stretch="1">	  <texture>hudblood3</texture>    </hud_blood3>    <hud_blood4 x="0" y="0" width="1024" height="768" stretch="1">	  <texture>hudblood4</texture>    </hud_blood4>    <hud_blood5 x="0" y="0" width="1024" height="768" stretch="1">	  <texture>hudblood5</texture>    </hud_blood5>   <hud_gas_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas1</texture>   </hud_gas_blue>   <hud_gas_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas2</texture>   </hud_gas_green>   <hud_gas_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas3</texture>   </hud_gas_yellow>   <hud_gas_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas4</texture>   </hud_gas_red>   <hud_gas_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas5</texture>   </hud_gas_red2>   <hud_gas_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gas6</texture>   </hud_gas_red3>   <hud_kill_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc1</texture>   </hud_kill_blue>   <hud_kill_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc2</texture>   </hud_kill_green>   <hud_kill_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc3</texture>   </hud_kill_yellow>   <hud_kill_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc4</texture>   </hud_kill_red>   <hud_kill_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc5</texture>   </hud_kill_red2>   <hud_kill_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">    <texture>hudhud_merc6</texture>   </hud_kill_red3>    <hud_sci_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci1</texture>   </hud_sci_blue>   <hud_sci_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci2</texture>   </hud_sci_green>   <hud_sci_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci3</texture>   </hud_sci_yellow>   <hud_sci_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci4</texture>   </hud_sci_red>   <hud_sci_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci5</texture>   </hud_sci_red2>   <hud_sci_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_sci6</texture>   </hud_sci_red3>    <hud_nano_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano1</texture>   </hud_nano_blue>   <hud_nano_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano2</texture>   </hud_nano_green>   <hud_nano_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano3</texture>   </hud_nano_yellow>   <hud_nano_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano4</texture>   </hud_nano_red>   <hud_nano_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano5</texture>   </hud_nano_red2>   <hud_nano_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_nano6</texture>   </hud_nano_red3>   <hud_mil_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil1</texture>   </hud_mil_blue>   <hud_mil_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil2</texture>   </hud_mil_green>   <hud_mil_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil3</texture>   </hud_mil_yellow>   <hud_mil_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil4</texture>   </hud_mil_red>   <hud_mil_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil5</texture>   </hud_mil_red2>   <hud_mil_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_mil6</texture>   </hud_mil_red3>    <hud_exo_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo1</texture>   </hud_exo_blue>    <hud_exo_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo2</texture>   </hud_exo_green>    <hud_exo_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo3</texture>   </hud_exo_yellow>    <hud_exo_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo4</texture>   </hud_exo_red>    <hud_exo_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo5</texture>   </hud_exo_red2>    <hud_exo_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_exo6</texture>   </hud_exo_red3>   <hud_gasmask_blue x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask1</texture>   </hud_gasmask_blue>   <hud_gasmask_green x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask2</texture>   </hud_gasmask_green>   <hud_gasmask_yellow x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask3</texture>   </hud_gasmask_yellow>   <hud_gasmask_red x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask4</texture>   </hud_gasmask_red>   <hud_gasmask_red2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask5</texture>   </hud_gasmask_red2>   <hud_gasmask_red3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudhud_gasmask6</texture>   </hud_gasmask_red3>   <hud_blur1 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudbreath1</texture>   </hud_blur1>   <hud_blur2 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudbreath2</texture>   </hud_blur2>   <hud_blur3 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudbreath3</texture>   </hud_blur3>   <hud_blur4 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudbreath4</texture>   </hud_blur4>   <hud_blur5 x="0" y="0" width="1024" height="768" stretch="1" light_anim="ui_slow_blinking_alpha" la_cyclic="1" la_texture="0" la_text="1" la_alpha="1">	 <texture>hudbreath5</texture>   </hud_blur5>

[ 7 ]. Na końcu dodajemy tekstury, które należy umiescić w [gamedatatextureshud] - patrz sfinalizowana postać [gamedata] do pobrania.

spis wykorzystywanych tekstur:

blood1.dds, blood2.dds, blood3.dds, blood4.dds, blood5.dds, breath1.dds, breath2.dds, breath3.dds, breath4.dds, breath5.dds, hud_gasmask1.dds, hud_gasmask2.dds, hud_gasmask3.dds, hud_gasmask4.dds, hud_gasmask5.dds, hud_gasmask6.dds

Ktoś zapyta - po co podawać nazwy tekstur? Umieszczona na końcu wersja do pobrania będzie dostępna przez 30 dni na bezpłatnym hostingu plików, jeśli link wygaśnie - na podstawie podanych configów można będzie odtworzyć modyfikację, natomiast tekstury o podanej nazwie można pobrać z dowolnego moda dodającego hud - stąd ich wykaz.

[ 8 ]. Ostatnim plikiem jaki trzeba dodać jest ui_icon_gasmask.dds, należy umieścić go w [gamedatatexturesui] zgodnie ze skryptem hud.script.

 

Wersja sfinalizowana przygotowana w oparciu o pliki z patcha 1.0004 do niemodowanej wersji gry: download 1

________

1 pliki będą dostępne przez 30 dni.

Całość prezentuje się następująco:

 

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

 

Mam nadzieję,  że informacje przydadzą się również innym forumowiczom - jak zwykle wyszedł mini-tutorial z posta, ale dzięki temu można odtworzyć moda samodzielnie. W razie problemów - pisz w temacie. Całość testowana bez jakichkolwiek błędów. 

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

Jeśli chcesz połączyć ten mod z innym - dodającym hud do kombinezonu, wówczas trzeba dostosować skrypt. W wersji uproszczonej (bez hud'a) pliki nie powinny kolidować z innymi (pomijam tu podstawową kwestię dostosowania moda). Sprawdzałem modyfikację na "czystej" wersji Shoc'a, trudno mi zatem stwierdzić jak wygląda sprawa ewentualnych błędów przy połączeniu z inną modyfikacją ingerującą w hud, w każdym razie wszystko jest rozpisane "od A do Z", więc osoby zainteresowane zaimplementowaniem moda w większej modyfikacji będą miały ułatwione zadanie.

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.