Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-02-09 11:57:03
Ostatnio dodałem do swojego GTA modyfikację ImVehFt DK22Pac'a. Wszystko działa dobrze dopóki nie wejdę do jakiegoś pojazdu, bo po wejściu do pojazdu gra crashuje. Po sprawdzeniu okazało się że modyfikacja ta koliduje z modyfikacją dodającą licznik prędkości i możliwość tankowania pojazdów. Postanowiłem więc sprawdzić co dokładnie może powodować problem i po kilkunastu próbach wyszło mi że problem jest przez opcode 0A97. Jest tam np. coś takiego:
Kod:
:NONAME_2436
0A97: 27@ = car
0@ struct
27@ += 4
0A8D: 29@ = read_memory
27@ size 1 virtual_protect 0
RETURN
Po usunięciu kilku linijek ze skryptu wszystko zaczęło działać poprawnie, lecz teraz skrypt nie "zapamiętuje" poziomu paliwa w pojeździe przez co wyjście i ponowne wejście do tego samego pojazdu zmienia poziom paliwa. I mam pytanie czy jest możliwość zrobienia tego "zapamiętywania" poziomu paliwa w jakiś inny sposób?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-02-09 12:04:51
Czy ten skrypt wpisuje jakieś wartości w ten sam obszar pamięci (wskaźnik + 4)? Jeśli tak, wyrzuć go i znajdź inny. To nie ma prawa działać bez żadnych efektów ubocznych.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-02-09 12:50:12
Szczerze mówiąc nie do końca rozumiem to co napisałeś :) Może rzuć okiem na ten skrypt:
LICZNIK I PALIWO
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-02-09 13:41:45
Wyrzuć to. Tym stanem paliwa mod nadpisuje coś czego nie powinien. Dziwne że w ogóle działał.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-02-09 13:45:58
Szkoda, bo ten licznik fajnie się prezentował wokół radaru. A może ktoś poleci jakiś ładnie wyglądający i poprawnie działający licznik ze wskaźnikiem paliwa?
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-04-26 20:59:02
Powrócę jeszcze do tego tematu. W jaki sposób "zapisywać" stan paliwa w pojeździe? Chodzi mi o to że jak wyjdę z jednego pojazdu (który ma określony stan paliwa), wejdę do innego pojazdu i później z powrotem wejdę do tego pierwszego to żeby stan paliwa był taki sam jak wcześniej, a nie wybrany losowo. W każdym wskaźniku z jakim się spotkałem było zastosowane rozwiązanie przedstawione przeze mnie w pierwszym poście. Lecz przez to rozwiązanie żaden wskaźnik nie współpracuje z modem ImVehFt. Czy istnieje jakiś inny sposób na zapisanie takiego stanu, jakiś inny adres pamięci, albo w ogóle coś innego?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-04-27 00:45:22
Przypomnij mi się jutro. Mam pomysł jak to zrobić z użyciem alokowanego miejsca w środku skryptu CLEO.
___________________
Moderator
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-04-27 12:36:26
Zrobiłem to w formie funkcji SCM do odczytywania i zapisywania stanu paliwa. W momencie, gdy odczyt zwróci -1 oznacza to że pojazd nie ma przypisanego do siebie stanu paliwa (np. dopiero co został stworzony) i należy mu go przypisać.
Całość kodu najlepiej umieścić na samym dole skryptu.
Kod:
:ODCZYT_STANU_PALIWA
{
Param
etry:
1) uchwyt pojazdu
Zwra
cane:
1) stan paliwa (-1 jeśli pojazd nie ma przypisanego stanu paliwa)
}
0B10: 1@ =
0@ AND 0xFF
0B15: 2@ =
0@ SHR 8
0AC6: 3@ = label
@STAN_PALIWA offset
2@ *= 3
005A: 3@ +=
2@
0A8D: 4@ = read_memory
3@ size 1 virtual_protect 0
if 803B: not 1@ ==
4@
then
0AB2: ret 1 -1
end
3@ += 1
0A8D: 5@ = read_memory
3@ size 2 virtual_protect 0
0AB2: ret 1
5@
:ZAPIS_STANU_PALIWA
{
Param
etry:
1) uchwyt pojazdu
2) stan paliwa
}
0B10: 2@ =
0@ AND 0xFF
0B15: 3@ =
0@ SHR 8
0AC6: 4@ = label
@STAN_PALIWA offset
3@ *= 3
005A: 4@ +=
3@
0A8C: write_memory
4@ size 1 value
2@ virtual_protect 0
4@ += 1
0A8C: write_memory
4@ size 2 value
1@ virtual_protect 0
0AB2: ret 0
:STAN_PALIWA
hex
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
end
___________________
Moderator
Postów:
1004
Dołączył:
2009-01-20
Napisano dnia: 2014-04-27 13:01:45
Tak z czystej ciekawości. Co oznaczają te zera na samym dole kodu no i po co ich aż tyle?
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-04-27 14:27:01
To miejsce na zapis stanu paliwa dla wszystkich 110 pojazdów które mogą być w grze na raz.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-04-28 17:16:55
Muszę przyznać że te funkcje scm są przydatne. Wszystko działa jak należy, ale jest jeden problem. Kiedy zostawię pojazd w garażu i przesiądę się do innego pojazdu, odjadę na znaczną odległość i po kilku minutach wrócę i wsiądę do tego pojazdu w garażu to nie pokazuje on takiego stanu paliwa jak kiedy z niego wysiadłem, tylko zupełnie inny. W innych sytuacjach póki co nie spotkałem się z takim błędem.
Postów:
628
Dołączył:
2009-01-22
Napisano dnia: 2014-04-28 18:01:32
Rzeczywiście, pojazdy w garażu są tworzone od nowa, więc nie zachowują swojego stanu paliwa. To wymagałoby jeszcze oddzielnego triku.
___________________
Moderator
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2014-04-28 18:18:54
To może nie jest mi jakoś koniecznie potrzebne, ale jak byś mógł przedstawić ten "trik" to byłbym wdzięczny :D
Postów:
294
Dołączył:
2011-07-27
Napisano dnia: 2015-07-27 17:09:06
Silent napisał(a):
Zrobiłem to w formie funkcji SCM do odczytywania i zapisywania stanu paliwa. W momencie, gdy odczyt zwróci -1 oznacza to że pojazd nie ma przypisanego do siebie stanu paliwa (np. dopiero co został stworzony) i należy mu go przypisać.
Całość kodu najlepiej umieścić na samym dole skryptu.
Kod:
:ODCZYT_STANU_PALIWA
{
Parametry:
1) uchwyt pojazdu
Zwracane:
1) stan paliwa (-1 jeśli pojazd nie ma przypisanego stanu paliwa)
}0B10: 1@ = 0@ AND 0xFF
0B15: 2@ = 0@ SHR 8
0AC6: 3@ = label @STAN_PALIWA offset
2@ *= 3
005A: 3@ += 2@
0A8D: 4@ = read_memory 3@ size 1 virtual_protect 0
if 803B: not 1@ == 4@
then
0AB2: ret 1 -1
end
3@ += 1
0A8D: 5@ = read_memory 3@ size 2 virtual_protect 0
0AB2: ret 1 5@
:ZAPIS_STANU_PALIWA
{
Parametry:
1) uchwyt pojazdu
2) stan paliwa
}0B10: 2@ = 0@ AND 0xFF
0B15: 3@ = 0@ SHR 8
0AC6: 4@ = label @STAN_PALIWA offset
3@ *= 3
005A: 4@ += 3@
0A8C: write_memory 4@ size 1 value 2@ virtual_protect 0
4@ += 1
0A8C: write_memory 4@ size 2 value 1@ virtual_protect 0
0AB2: ret 0
:STAN_PALIWA
hex
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000 00 0000
end
Jak dobrze pamiętam ten kod pisany był dla liczb całkowitych. A jak wyglądałby ten kod dla liczb float ? Dużo należałoby zmienić?