Skocz do zawartości
Zerfet

[ROZWIĄZANY]Kasa za przejechane km

Rekomendowane odpowiedzi

Witam. Mam taki kod:

VehicleInfo[vehid][Przebieg] += 0.0008;

 

Ale niestety nwm jak go przerobić, że jeżeli przejedziemy 100km to dostajemy np. 100$

Edytowane przez Zerfet

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale to chyba tylko raz się wykona jak pojazd będzie miał 100 km. A ja chcę aby co 100km dawalo hajs niezaleznie od tego ile pojazd ma przebiegu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie bardzo rozumiem. Pisałem, że chcę aby co 100 km dawało hajs więc myślałem, że ten kod jest tak zrobiony, że przejadę 100km i dostaję 100$ i po ponownym przejechaniu 100km ponownie 100$ dostaję. I czy dało by się tak zrobić, że jak VehicleInfo[vehid][Przebieg] jest rowne 100, 200, 300, 400 itd. To wtedy dostaje się kasę?

Edytowane przez Zerfet

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Toż to właśnie ten kod robi tylko musisz go użyć w odpowiedni sposób, widocznie użyłeś go na pałę bez pomysłu. Gotowca Ci raczej Sim00n nie da, ja tak samo, ale jeżeli napiszesz co i gdzie próbujesz z tym kodem zrobić to pewnie ktoś pomoże.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przetłumaczę Ci ten kod na słowa a Ty powiesz mi co jest z nim nie tak.

VehicleInfo[vehid][Przebieg]				// Tutaj jest przechowywany przebieg pojazdu
floatround()								// Ta funkcja zaokrągla floata na inta
a % b										// Znak procentu to modulo, daje Ci resztę z dzielenia a przez b

floatround(VehicleInfo[vehid][Przebieg])				// To Ci zwróci przebieg pojazdu ale zaokrąglony do inta
floatround(VehicleInfo[vehid][Przebieg]) % 100 == 0		// To Ci sprawdzi czy reszta z dzielenia przebigu przez 100 równa się 0

Ten kod bierze przebieg pojazdu, zaokrągla i sprawdza czy liczba jest mnożnikiem 100. ALE przez to, że zaokrąglasz, to kod wykona się dla przebiegu:
99.5 <= przebieg < 100.5

Mógłbyś po prostu zrobić VehicleInfo[vehid][Przebieg] % 100 == 0 ale wtedy Twój przebieg musi być idealnie 100.00000, 200.00000, itd. a zgaduje, że przebieg jest floatem więc nigdy nie będzie dokładny co do zera. 

To, że ten kod wykonuje się dla przedziału a nie dla konkretnej wartości jest Twoim problemem. Jeżeli ktoś ma 99.8 przebiegu to dostaje kasę, jeżeli ma 99.9525 to dostaje kasę, jeżeli ma 100.23251 to dostaje kasę, itd ... Żeby naprawić ten błąd, musisz zapisać sobie jakąś flagę, która mówi Ci, czy gracz dostał już kasę za ten konkretny przebieg.
Co więcej: Co jeżeli gracz będzie miał 100 przebiegu i się zatrzyma w miejscu tak żeby przebieg mu nie leciał? Dalej chcesz mu dawać co sekundę kasę? Nie. Dlatego musisz przemyśleć w jaki sposób mu kasę dajesz.

PS Propsuje Bantu za nie danie Ci gotowca bo ja staram się tu na forum tak pomagać żeby ktoś pomyślał o kodzie i zrozumiał coś sam a większość innych po prostu wrzuca kod za lajki.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 godzinę temu, Sim00n napisał:

Przetłumaczę Ci ten kod na słowa a Ty powiesz mi co jest z nim nie tak.


VehicleInfo[vehid][Przebieg]				// Tutaj jest przechowywany przebieg pojazdu
floatround()								// Ta funkcja zaokrągla floata na inta
a % b										// Znak procentu to modulo, daje Ci resztę z dzielenia a przez b

floatround(VehicleInfo[vehid][Przebieg])				// To Ci zwróci przebieg pojazdu ale zaokrąglony do inta
floatround(VehicleInfo[vehid][Przebieg]) % 100 == 0		// To Ci sprawdzi czy reszta z dzielenia przebigu przez 100 równa się 0

Ten kod bierze przebieg pojazdu, zaokrągla i sprawdza czy liczba jest mnożnikiem 100. ALE przez to, że zaokrąglasz, to kod wykona się dla przebiegu:
99.5 <= przebieg < 100.5

Mógłbyś po prostu zrobić VehicleInfo[vehid][Przebieg] % 100 == 0 ale wtedy Twój przebieg musi być idealnie 100.00000, 200.00000, itd. a zgaduje, że przebieg jest floatem więc nigdy nie będzie dokładny co do zera. 

To, że ten kod wykonuje się dla przedziału a nie dla konkretnej wartości jest Twoim problemem. Jeżeli ktoś ma 99.8 przebiegu to dostaje kasę, jeżeli ma 99.9525 to dostaje kasę, jeżeli ma 100.23251 to dostaje kasę, itd ... Żeby naprawić ten błąd, musisz zapisać sobie jakąś flagę, która mówi Ci, czy gracz dostał już kasę za ten konkretny przebieg.
Co więcej: Co jeżeli gracz będzie miał 100 przebiegu i się zatrzyma w miejscu tak żeby przebieg mu nie leciał? Dalej chcesz mu dawać co sekundę kasę? Nie. Dlatego musisz przemyśleć w jaki sposób mu kasę dajesz.

PS Propsuje Bantu za nie danie Ci gotowca bo ja staram się tu na forum tak pomagać żeby ktoś pomyślał o kodzie i zrozumiał coś sam a większość innych po prostu wrzuca kod za lajki.

Tak będzie dobrze?

 



if(GetPVarInt(playerid, "Przegladzik") == 0)
                {
                    SetPVarInt(playerid, "Przegladzik", 1);
                    SetTimerEx("UnlockPrzeglad", 60000, false, "d", playerid);

            if( floatround ( VehicleInfo[vehid][Przebieg] ) % 100 == 0 )
            {
            

GivePlayerMoney(playerid, 100);


            }
            }

    forward UnlockPrzeglad(playerid);
    public UnLockPrzeglad(playerid)
    {
        SetPVarInt(playerid, "Przegladzik", 0);
        return 1;
    }



			
		

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W tym kodzie jeżeli ktoś ma 100 przebiegu i nie będzie się ruszał przez dłużej niż 60 sekund to dostanie kasę podwójnie. Jeżeli będzie czekał 2 minuty to dostanie 2 razy, itd.
Kombinuj inaczej :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sim00n, niektórzy mogą mieć problem z pomysłem, matematyką, logiką, a nie kodem :P

@Zerfet dobre, będzie działać, ale będzie to trochę przekłamywać. Jak chcesz się bardziej postarać - zrób to nie wykorzystując timerów. Możesz zapisać sobie ostatnią setke za którą dostał kase i dać ponownie jeżeli kolejna setka jest większa. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam taki kodzik:

if( floatround ( VehicleInfo[vehid][Przebieg] ) % 100 == 0 )
            {
           GivePlayerMoney(playerid, 100);
            VehicleInfo[vehid][Przebieg] += 1;
            }


I jak zeruję przebieg i wsiadam do pojazdu to dodaje mi 1km, daje 100$ i potem już nic sie nie dzieje. Robię 100km, 200 itd. a kasy już wcale nie daje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mhm

 

Mozesz dodac tez do callbacka onplayerentervehicle:

nextpay[playerid] = VehicleInfo[vehid][Przebieg] + 100;

 

Bo moga byc bugi jak zapisujesz gdzies do bazy ten przebieg aut.

 


 
Edytowane przez ziom123

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×