Forum Stalker.pl • Zobacz temat - [LUA] Zerowanie ekwipunku NPC'a

[LUA] Zerowanie ekwipunku NPC'a

Regulamin forum
Dział "Tworzenie Modyfikacji" służy do zadawania pytań odnośnie tworzenia modyfikacji, edytowania plików gry, oraz pisania tzw. tutoriali, czyli poradników odnośnie modyfikowania gry.
Nie zadajemy tutaj pytań odnośnie modyfikacji gotowych (nie dyskutujemy o nich!), prócz prób ich połączenia etc.


Przy cytowaniu plików *.LTX stosować tag [SYNTAX="ini"], przy cytowaniu plików *.script [SYNTAX="lua"] a przy cytowaniu plików *.xml - [SYNTAX="xml"].

[LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 13:20

Witajcie. Próbuję zrobić funkcję, która uruchamiałaby się w trakcie dialogu, i która zabierałaby NPC'owi wszystkie jego itemy. Ugrzęzłem z momentem, który miałby ustalić, co ów NPC dokładnie przy sobie ma. Mógłby ktoś mnie naprowadzić na rozwiązanie?
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Reklamy Google

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Cromm Cruac w 30 Sty 2015, 13:36

Kod: [ Pobierz ] [ Ukryj ]
npc:inventory_for_each(function(item)
     alife():release(item, true)       
end)
 


Możliwe, że w CoPie trzeba będzie zastąpić drugą linię tym:
Kod: [ Pobierz ] [ Ukryj ]
alife():release(alife():object(item:id()), true)
Image

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian
Awatar użytkownika
Cromm Cruac
Modder

Posty: 2541
Dołączenie: 22 Sty 2010, 19:01
Ostatnio był: 26 Lip 2023, 10:13
Miejscowość: Londyn / Bielsko-Biała
Kozaki: 1077

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 14:18

Wow, tak po prostu? Tak by to miało wyglądać?
Kod: [ Pobierz ] [ Ukryj ]
function npc_stock_remove()
  npc:inventory_for_each(npc_stock_remove(item))
  alife():release(alife():object(item:id()), true)
end
 

Eeee, niemożliwe. Co tam po tym each ma być za funkcja?

EDIT
Takie cuś?
Kod: [ Pobierz ] [ Ukryj ]
function npc_stock_remove()
 local function remove_item(obj)
  alife():release(alife():object(item:id()), true)
 end
 npc:inventory_for_each(remove_item)
end
 
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Cromm Cruac w 30 Sty 2015, 14:46

Parametrem inventory_for_each musi być funkcja. inventory_for_each leci po wszystkich itemach i aplikuje tą funkcję do każdego z nich.

Albo definiujesz lokalną i wykorzystujesz ją jako parametr
Kod: [ Pobierz ] [ Ukryj ]
local function remove_item(item)
   alife():release(alife():object(item:id()), true)
end
       
npc:inventory_for_each(remove_item)


albo definiujesz funkcję bezpośrednio tam gdzie parametr:
Kod: [ Pobierz ] [ Ukryj ]
npc:inventory_for_each(function(item)
     alife():release(alife():object(item:id()), true)
end)


Oba rozwiązania są poprawne

EDIT: :arrowu: to po twoim edicie to moje pierwsze z tego posta tyle, że masz tam błąd. Parametrem remove_item() jest 'obj' a używasz w następnej linii 'item'.

EDIT2: Tak zrób i powinno być git:
Kod: [ Pobierz ] [ Ukryj ]
function npc_stock_remove(npc)
     npc:inventory_for_each(function(item)
          alife():release(alife():object(item:id()), true)
     end)
end
Image

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian

Za ten post Cromm Cruac otrzymał następujące punkty reputacji:
Positive Plaargath.
Awatar użytkownika
Cromm Cruac
Modder

Posty: 2541
Dołączenie: 22 Sty 2010, 19:01
Ostatnio był: 26 Lip 2023, 10:13
Miejscowość: Londyn / Bielsko-Biała
Kozaki: 1077

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 15:09

Dzięki, Cromm, jesteś wielki. zaje*iste narzędzie swoją drogą.
Dopytam jeszcze tylko - można tego używać tak: db.actor:inventory_for_each, albo inv_box:inventory_for_each?
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Cromm Cruac w 30 Sty 2015, 15:39

db:actor na pewno, leci po naszym inwentarzu wtedy. inv_box nie wiem ale to funkcja klasy game_object więc możliwe, że tak.
Image

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian
Awatar użytkownika
Cromm Cruac
Modder

Posty: 2541
Dołączenie: 22 Sty 2010, 19:01
Ostatnio był: 26 Lip 2023, 10:13
Miejscowość: Londyn / Bielsko-Biała
Kozaki: 1077

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 16:08

Ja wohl.
Wiesz co, jeszcze bym się poradził w kolejnej kwestii, jeśli można.
Po wykonaniu powyższych zabiegów, chce kolesiowi zespawnować itemy wymienione z listy w pluginie.
W pluginie robię sekcję [new_items_list].
W skrypcie jest
Kod: [ Pobierz ] [ Ukryj ]
local medic_ini  = ini_file("plugins\\medic_stock.ltx")

i jest
Kod: [ Pobierz ] [ Ukryj ]
local new_items  = alun_utils.collect_section(medic_ini,"new_items_list",true)

Czy jeśli przywalę
Kod: [ Pobierz ] [ Ukryj ]
alife():create(new_items,npc:position(),0,0,npc:id())

to zadziała, czy muszę jakoś tę sekcję przerobić na tablicę, policzyć ile wpisów w tej tablicy, zrobić pętlę od 1 do policzonej-ilości-wpisów-w-tablicy i w tej pętli create coś a'la new_item_x?
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Cromm Cruac w 30 Sty 2015, 16:28

Musisz iterować tablicę (zakładam, że alun_utils.collect_section zwraca tablicę typu 'index => item' jako wynik)
Kod: [ Pobierz ] [ Ukryj ]
for k,item in pairs(new_items) do
     alife():create(item, npc:position(),0,0,npc:id())
end


EDIT: Możliwe też, że alun_utils.collect_section zwraca tablicę typu 'item => ilość'. Wtedy trzeba dołożyć for-a dla ilości danego itema.

Kod: [ Pobierz ] [ Ukryj ]
for item,amount in pairs(new_items) do
     for i = 1, amount do
          alife():create(item, npc:position(),0,0,npc:id())
     end
end
Image

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian

Za ten post Cromm Cruac otrzymał następujące punkty reputacji:
Positive Plaargath.
Awatar użytkownika
Cromm Cruac
Modder

Posty: 2541
Dołączenie: 22 Sty 2010, 19:01
Ostatnio był: 26 Lip 2023, 10:13
Miejscowość: Londyn / Bielsko-Biała
Kozaki: 1077

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 17:10

Oj, przepraszam, tak przywykłem, że zapomniałem już, że to nie jest plik z vanilli :)
Tak tą funkcję Alun napisał:
Kod: [ Pobierz ] [ Ukryj ]
function collect_section(ini,section,keytable)
        if not (ini) then
                return
        end

        local _t = {}
        if ini:section_exist(section) then
                local n = ini:line_count(section)
                if n > 0 then
                        for i = 0,n-1 do
                                local res,id,val = ini:r_line(section,i,"","")
                                if (keytable) then
                                        if (val == "") then
                                                val = true
                                        end
                                        _t[id] = val or true
                                else
                                        table.insert(_t,id)
                                end
                        end
                end
        end
        return _t
end
 
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Cromm Cruac w 30 Sty 2015, 17:26

Funkcja Aluna jest uniwersalna. W zależności od parametru keytable zwraca wariant 1 (jeśli false) albo 2 (jeśli true)
Zależy jak wygląda sekcja w ltx-ie takiego keytable używasz.
Image

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian
Awatar użytkownika
Cromm Cruac
Modder

Posty: 2541
Dołączenie: 22 Sty 2010, 19:01
Ostatnio był: 26 Lip 2023, 10:13
Miejscowość: Londyn / Bielsko-Biała
Kozaki: 1077

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 17:57

-- CIACH --
Ostatnio edytowany przez Plaargath, 30 Sty 2015, 19:05, edytowano w sumie 1 raz
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234

Re: [LUA] Zerowanie ekwipunku NPC'a

Postprzez Plaargath w 30 Sty 2015, 19:03

Zachciało mi się jeszcze jednej rzeczy, ale obiecuję, że to już ostatnia w temacie.
Otóż usiłuję wrzepić jeszcze z plugina listę itemów, które czystka ominie. Tak mi się to kleci, ale coś nie jestem pewien, a jeszcze nie mogę testować, żeby się kierować logami. Mógłbyś, proszę, spojrzeć?

W pluginie jest
Kod: Zaznacz wszystko
[kept_items_list]
item1
item2
item3
[new_items_list]
item4
item5
item6

W dialogu jest:
Kod: [ Pobierz ] [ Ukryj ]
<action>dialogs_zaton.zat_b22_medic_stock_remove</action>

A do dialogs_zaton dodaję to:
Kod: [ Pobierz ] [ Ukryj ]
function zat_b22_medic_stock_remove()

        local medic_ini  = ini_file("plugins\\medic_stock.ltx")
        local kept_items = alun_utils.collect_section(medic_ini,"kept_items_list",true)
        local new_items  = alun_utils.collect_section(medic_ini,"new_items_list",true)
        local to_be_kept_items = {}

        -- extract items to be kept
        local function keep_list_matching_item(item)
                for k,item in pairs(kept_items) do
                        if item ~= nil then
                                table.insert(to_be_kept_items,id)
                        end
                end
        end
        npc:inventory_for_each(keep_list_matching_item)

-- rip-off
        local function remove_item(item)
                alife():release(alife():object(item:id()), true)
        end
        npc:inventory_for_each(remove_item)

-- spawn kept items back
        for k,item in pairs(to_be_kept_items) do
                alife():create(item, npc:position(),0,0,npc:id())
        end

-- spawn new items from ltx
        for k,item in pairs(new_items) do
                alife():create(item, npc:position(),0,0,npc:id())
        end

end
 

Ma to sens?

EDIT:
CTD z logiem "dialogs_zaton.script:1798: attempt to index global 'npc' (a nil value)". Hmm, jak mu wytłumaczyć, że npc to koleś, z którym gadam?
EDIT2:
Testuję na Noe'm. Wrzepiam "npc == "zat_b18_noah", crasha nie ma, ale nie ma też żadnej różnicy w jego ekwipunku przed i po zmianach w plikach, coś nie działa.
Image Image

Merkantylizm, srerkantylizm.
Awatar użytkownika
Plaargath
Weteran

Posty: 653
Dołączenie: 23 Mar 2010, 15:12
Ostatnio był: 03 Kwi 2022, 22:03
Kozaki: 234


Powróć do Zew Prypeci

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 6 gości