Forum Stalker.pl • Zobacz temat - [LUA] alife release x2

[LUA] alife release x2

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] alife release x2

Postprzez Plaargath w 09 Lut 2015, 14:20

Napotkałem taki oto problemik, nie bardzo go rozumiem w ogóle, to i rozwiązanie trudniej wykoncypować.
Misja jest taka: policzyć ile jest w ekwipunku itemów "substytut", jeśli dwa lub więcej to usunąć dwa "substytut"y i dodać "zamiennik2", jeśli jeden to usunąć jeden "substytut" i dodać "zamiennik1".
Liczę sobie ilość itemów funkcją, która zwraca zmienną "ile" i definiuję:
Kod: [ Pobierz ] [ Ukryj ]
local mam_jeden, mam_dwa
if ile >= 2 then mam_dwa = true end
if ile = 1 then mam_jeden = true end
 

potem leci sobie dalej.
Wszystko ok, poza tym, że nie potrafię potem usunąć dwa razy "substytut"u.

Próbuję tak:
Kod: [ Pobierz ] [ Ukryj ]
if mam_dwa then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    alife():release(alife():object(getrid:id()), true)
    alife():create("zamiennik2",db.actor:position(),0,0,0)
elseif mam_jeden then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    alife():create("zamiennik1",db.actor:position(),0,0,0)
end

albo tak:
Kod: [ Pobierz ] [ Ukryj ]
if mam_dwa then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    local getridtoo = (db.actor:object("substytut"))
    alife():release(alife():object(getridtoo:id()), true)
    alife():create("zamiennik2",db.actor:position(),0,0,0)
elseif mam_jeden then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    alife():create("zamiennik1",db.actor:position(),0,0,0)
end

i w obu przypadkach kupa taka, że zamiana na "zamiennik1" działa, a na "zamiennik2" nie. Zupełnie jakby ignorowało ten drugi alife release.
Czego to brakuje?
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] alife release x2

Postprzez tt44 w 09 Lut 2015, 17:51

Spróbuj takiego zapisu:
Kod: [ Pobierz ] [ Ukryj ]
if mam_dwa then
    local getrid = (db.actor:object("substytut"))
    for i = 1, 2 do
         alife():release(alife():object(getrid:id()), true)
    end
    alife():create("zamiennik2",db.actor:position(),0,0,0)
elseif mam_jeden then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    alife():create("zamiennik1",db.actor:position(),0,0,0)
end
 

Teraz release powinno zostać wykonane dwa razy przez pętle for.

Za ten post tt44 otrzymał następujące punkty reputacji:
Positive Plaargath.
tt44
Stalker

Posty: 88
Dołączenie: 12 Lut 2013, 19:02
Ostatnio był: 24 Cze 2017, 19:07
Kozaki: 60

Re: [LUA] alife release x2

Postprzez Plaargath w 09 Lut 2015, 19:23

Bardzo dziwne rzeczy się dzieją.
Kiedy robię tak, jak piszesz, to dalej znika tylko jeden "substytut", i nie spawnuje się "zamiennik2".
Jeśli przeniosę linijkę, która stwarza "zamiennik2" przed pętlę for, wtedy dalej znika tylko jeden "substytut", ale spawnuje się "zamiennik2".
Nie ma też różnicy czy definiuję getrid wewnątrz czy na zewnątrz for'a - efekt ten sam.
Miałem tam też linijkę, co mi tekst na ekran rzuca, żebym się szybko połapał czy funkcja chwyciła, nie wyświetla message'a - wychodzi na to, że wszystko, co wpiszę między "end" tego fora a "elseif" nie chwyta.
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] alife release x2

Postprzez tt44 w 12 Lut 2015, 18:24

Funkcja na usunięcie wielu itemów za jednym razem.
Kod: [ Pobierz ] [ Ukryj ]
function RemoveItems(section, count)
        for index = 0, db.actor:object_count() - 1 do
                if count > 0 and db.actor:object(index):section() == section then
                        alife():release(alife():object(db.actor:object(index):id()))
                        count = count - 1
                end
        end
end
 

W twoim skrypcie:
Kod: [ Pobierz ] [ Ukryj ]
if mam_dwa then
    RemoveItems("substytut", 2)
    alife():create("zamiennik2",db.actor:position(),0,0,0)
elseif mam_jeden then
    local getrid = (db.actor:object("substytut"))
    alife():release(alife():object(getrid:id()), true)
    alife():create("zamiennik1",db.actor:position(),0,0,0)
end
 

Za ten post tt44 otrzymał następujące punkty reputacji:
Positive Plaargath.
tt44
Stalker

Posty: 88
Dołączenie: 12 Lut 2013, 19:02
Ostatnio był: 24 Cze 2017, 19:07
Kozaki: 60

Re: [LUA] alife release x2

Postprzez Plaargath w 12 Lut 2015, 21:07

No proszę, jak elegancko. Chyba w końcu zacząłem gdzieś w głąbi (EDIT głębi. Chociaż to też po prawdzie pasuje.) siebie dopuszczać do istnienia dobrodziejstwa języka obiektowego i oduczać się parszywych przyzwyczajeń z pascala, bo zacząłem kombinować w tę samą stronę. Dzięki Ci bardzo za pomoc, chłopie!
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 1 gość