Forum Stalker.pl • Zobacz temat - [LUA] ammo

[LUA] ammo

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"].

Re: [LUA] ammo

Postprzez Plaargath w 06 Mar 2015, 00:19

Jak tak próbuję, to jest CTD bez loga.

Wiecie co, dziwi mnie jeszcze coś. W dokładnie tak samo skonstruowanej funkcji takie coś jak poniżej działa:
Kod: [ Pobierz ] [ Ukryj ]
local index = self.list_box:GetSelectedIndex()
if index == -1 then return end
local item  = self.list_box:GetItemByIndex(index)
-- potem tak
local obj = item and level.object_by_id(item.item_id)
if not (obj) then return end
-- no i na koniec
local con = obj:condition()
-- i tutaj jakieś tam operacje na con, a na koniec:
obj:set_condition(con)
 


No i to działa poprawnie. Więc jakoś ten obiekt przez id widzi, rozpoznaje. I jednocześnie nie rozpoznaje, żeby wrzucić do packet_utils21?
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] ammo

Postprzez tt44 w 06 Mar 2015, 12:51

No to zamiast packet_utils, skorzystaj z m_net_utils (funkcja get_weapon_data):
http://www.mediafire.com/download/t5c49 ... ils.script

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] ammo

Postprzez Plaargath w 06 Mar 2015, 13:39

No proszę, coś się ruszyło.
Jest tak:
Kod: [ Pobierz ] [ Ukryj ]
local data = m_net_utils.get_weapon_data(alife():object(item.item_id))
local ammo_type = data.ammo_type
local ammo_current = data.ammo_current
alife():create_ammo(ammo_type, db.actor:position(), db.actor:m_level_vertex_id(), db.actor:m_game_vertex_id(), db.actor:id(), ammo_current)
 

Wtedy CTD odnośnie ostatniej linijki z tworzeniem amunicji, że "attempt to call method '?' (a nil value)"
No to zamieniam ją na takie coś, że rzuca mi na ekran to:
Kod: [ Pobierz ] [ Ukryj ]
(ammo_type.." <- ammo_type "..ammo_current.." <- ammo_current")
 

żebym mógł podpatrzeć, co i jak.
No i najpierw był CTD bez loga, potem w pełni naładowany makarow pokazał 218 i jakąś pięciocyfrową liczbę, potem kilka razy w pełni naładowany (8 pestek) makarov pokazał 8 i 0 (w tej kolejności), powtórzyło się to tak z cztery razy, potem vintorez z pięcioma pestkami pokazał 218 i coś pięciocyfrowego, a potem już za każdym razem CTD bez loga.
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] ammo

Postprzez tt44 w 06 Mar 2015, 14:55

Za ammo_type podstaw dla próby jakikolwiek rodzaj amunicji, np. "ammo_9x18_fmj" i sprawdź czy zespawnuje...

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] ammo

Postprzez Plaargath w 06 Mar 2015, 18:58

No to dopiero ciekawostki teraz się dzieją. Za Twoją radą lecę na próbę tak:
Kod: [ Pobierz ] [ Ukryj ]
local ammo_type = "ammo_9x18_fmj"
local ammo_current = 10
alife():create_ammo(ammo_type,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id(),ammo_current)
 

Za pierwszym razem - działa. Za drugim - też. Już się zaczynam cieszyć, a tu za trzecim CTD bez loga. :/
Nawet nie mam pomysłu na pomysł, żeby takie działanie jakoś wytłumaczyć.
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] ammo

Postprzez tt44 w 06 Mar 2015, 19:43

Te wyloty bez loga na 99,9% są spowodowane czym innym, o czym świadczy ich losowość.

BTW: Chodziło mi o to, żebyś tylko typ amunicji podał, a ammo_current ma być z pobierane ze skryptu m_net_utils i sprawdź czy wtedy zadziała, bo trzeba dojść do tego co powodowało ten błąd "attempt to call method '?' (a nil value)".
Czyli na razie niech będzie tak:
Kod: [ Pobierz ] [ Ukryj ]
local data = m_net_utils.get_weapon_data(alife():object(item.item_id))
local ammo_type = "ammo_9x18_fmj"
local ammo_current = data.ammo_current
alife():create_ammo(ammo_type, db.actor:position(), db.actor:m_level_vertex_id(), db.actor:m_game_vertex_id(), db.actor:id(), ammo_current)
 

I napisz jaki będzie efekt.

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] ammo

Postprzez Plaargath w 06 Mar 2015, 20:51

Wyłapałem ten inny powód CTD bez loga - rozwaliłem skrypt w jednym miejscu, jak chciałem, żeby szybciej szło na potrzeby hurtowej ilości testów. Naprawione, wracamy do akcji.

Błąd z methodem spowodowany jest wpisaniem "m_level_vertex_id()" i "m_game_vertex_id()" zamiast "level_vertex_id()" i "game_vertex_id()".
Wpisuję zatem bez "_m", czyli tak:
Kod: [ Pobierz ] [ Ukryj ]
local data = m_net_utils.get_weapon_data(alife():object(item.item_id))
local typ = "ammo_9x18_fmj"
local ile = data.ammo_current
alife():create_ammo(typ, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id(), ile)
 

przykładowe efekty przedstawiają się następująco:
numer próby ; ile_zespawnował ; ile_było_w_magazynku ; jaką_broń_czytał:
1) 15 30 ak74
2) 15 30 ak74
3) 0 30 sig550
4) CTD (broń dodana przez moda) (bez loga)
wgranie save'a
1) 0 30 ak74
2) 0 30 ak74
3) 0 30 sig550
4) 0 8 makarow
5) 15 4 wintorez
6) CTD ak74 (bez loga)
wgranie save'a
1) 0 8 makarow
2) 0 30 ak74
3) 0 30 sig550
4) 15 8 makarow
5) 0 8 makarow
6) 0 8 makarow
7) CTD gauss (bez loga)
Także coś mu tam trybi, tylko nie do końca.

ED: opis cyferek poprawiłem, bo w błąd bym Cię wprowadził
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] ammo

Postprzez tt44 w 06 Mar 2015, 22:00

Sprawdziłem u siebie w stalkerze i problem rozwiązany!! Musisz użyć ammo_elapsed, zamiast ammo_current, wtedy zespawnuje tyle naboi ile jest w magazynku.
Kod: [ Pobierz ] [ Ukryj ]
local ile = data.ammo_elapsed
 

EDIT: a co do typu amunicji to może być tak:
Kod: [ Pobierz ] [ Ukryj ]
local typ = system_ini():r_string(item, "ammo_class")
 

Tylko, że nie wiem czy skrypt nie zgłupieje jeśli broń ma przypisane w configu kilka różnych rodzajów amunicji...

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] ammo

Postprzez Plaargath w 07 Mar 2015, 01:06

tt44 napisał(a):Sprawdziłem u siebie w stalkerze i problem rozwiązany!! Musisz użyć ammo_elapsed, zamiast ammo_current, wtedy zespawnuje tyle naboi ile jest w magazynku.
Kod: [ Pobierz ] [ Ukryj ]
local ile = data.ammo_elapsed
 



Jak zmieniłem na elapsed, to bez zmian. Raz zero, raz od czapy, raz CTD, czyli to samo.
To potwierdza to, co pisałeś wcześniej:
tt44 napisał(a):Moim zdaniem coś jest spieprzone na tym etapie:
Kod: [ Pobierz ] [ Ukryj ]
index = self.list_box_parts:GetSelectedIndex()
item = self.list_box_parts:GetItemByIndex(index)
 



Udało mi się wypracować możliwość manipulowania condition'em, kiedy zdefiniowałem go tak:
Kod: [ Pobierz ] [ Ukryj ]
local item = self.list_box_parts:GetSelectedItem()
local obj = item and level.object_by_id(item.item_id)
 

więc próbowałem pozmieniać jakoś ten element, ale nie udało mi się. Oto próby, jakie podjąłem i ich efekty w komentarzach.
To za każdym razem stoi na początku:
Kod: [ Pobierz ] [ Ukryj ]
local index = self.list_box_parts:GetSelectedIndex()
local item = self.list_box_parts:GetSelectedItem()
local obj = item and level.object_by_id(item.item_id)
 

a to na końcu:
Kod: [ Pobierz ] [ Ukryj ]
local data = m_net_utils.get_weapon_data(giwera)
 

A między wrzucałem takie próby:
Kod: [ Pobierz ] [ Ukryj ]
local giwera = self.list_box_parts:GetItemByIndex(index)
 -- CTD: attempt to call method 'STATE_Write' (a nil value)
local giwera = alife():object(item_id)
 -- CTD: bez loga
local giwera = item
 -- CTD: attempt to call method 'STATE_Write' (a nil value)
local data = m_net_utils.get_weapon_data(alife():object(item.item_id))
 -- bez CTD, ale generuje bledna ilosc
local giwera = alife():object(item.item_id)
 -- bez CTD, ale generuje bledna ilosc
sritem = self.list_box_parts:GetItemByIndex(index)
local giwera = sritem and sritem.item_id and alife():object(sritem.item_id)
 -- te dwa daja razem CTD bez loga
local giwera = item and alife():object(item:id())
local data = m_net_utils.get_weapon_data(giwera.id)
 -- te dwa daja razem attempt to call method '?' (a nil value)
local giwera = alife():object(item.id)
local data = m_net_utils.get_weapon_data(giwera.id)
 -- te dwa daja razem CTD bez loga
local item  = self.list_box:GetItemByIndex(index)
local giwera = item and level.object_by_id(item.item_id)
 -- te dwa daja razem "attempt to index field '?' (a nil value)"
 

Dupa zbita, paniedzieju.
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] ammo

Postprzez tt44 w 07 Mar 2015, 01:18

CTD: attempt to call method 'STATE_Write' (a nil value) - to dlatego, że podałeś obiekt bez id
Jak zmieniłem na elapsed, to bez zmian. Raz zero, raz od czapy, raz CTD, czyli to samo.

No to nie mam pojęcia napisałem u siebie skrypt, który wyrzuca na ekran ilość naboi w magazynku i w każdym przypadku się zgadzała. Skrypt ten wyglądał tak:
Kod: [ Pobierz ] [ Ukryj ]
local data = m_net_utils.get_weapon_data(alife():object(db.actor:active_item():id()))
news_manager.send_tip(db.actor, data.ammo_elapsed, nil, nil, nil)
 

Screen na potwierdzenie:
Image
Bez wglądu do twoich skryptów za wiele Ci nie potrafię pomóc, ale gdzieś musiałeś popełnić błąd. No i te wyloty bez loga... Poprzeglądaj uważnie skrypty i popróbuj w końcu dojdziesz do przyczyny.

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] ammo

Postprzez Plaargath w 21 Mar 2015, 13:54

Namęczyłem się okrutnie, ale w końcu się udało. Bez jednego szczególiku, ale chrzanię to, szkoda zachodu.

No, to teraz wypadałoby podobnie postąpić z dodatkami - czyli zrobić funkcję na odzyskiwanie tłumików i celowników zamontowanych do broni.
Konstrukcja będzie ta sama, ale oprzeć się musi, jak wnioskuję, na addon_flags.
Macie może w pamięci, jakie wartości (i w jakich okolicznościach) ta funkcja zwraca?
:

addon_flags = spk:r_u8() -- w m_net_utils
addon_flags = packet:r_u8() -- w packet_utils21


EDIT:
Dobra, pochytałem.
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] ammo

Postprzez tt44 w 21 Mar 2015, 17:54

Zmienna addon_flags zwraca:
Jeśli do broni doczepiony jest granatnik: 2, 3, 6, 7
Jeśli celownik: 1, 3, 5, 7
Jeśli tłumik: 4, 5, 6, 7
A co do sekcji dodatku który, ma zostać zespawnowany to są one zawarte w "scope_name", "silencer_name" i "grenade_launcher_name", w plikach ini.
tt44
Stalker

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

PoprzedniaNastępna

Powróć do Zew Prypeci

Kto jest na forum

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