Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Operacje na graczu co pare godzin


  • Zamknięty Temat jest zamknięty
27 odpowiedzi w tym temacie

#1 A może sma?

    Godlike

  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 26.02.2012 19:39

Siema.
Chcę wykonywać jakąś tam akcję na graczu co kilka godzin przegranych przez niego na serwerze.
Wiem, że jest funkcja get_user_time, ale nie za bardzo wiem jak optymalnie sprawdzać czy gracz gra już określoną ilość czasu.
Mógłby mi ktoś podpowiedzieć jak to najlepiej zrobić? Wydaję mi się, że task powtarzany co 1 sekundę to raczej słaby pomysł...
  • +
  • -
  • 0

#2 Syczaj

    Profesjonalista

  • Użytkownik

Reputacja: 32
Życzliwy

  • Postów:156
  • Lokalizacja:Plock
Offline

Napisano 26.02.2012 20:01

Nie lepiej sprawdzać na spawnie ile ma godzin w sumie? I wtedy mu coś dać?
Zapisuj czas gry na nvault.
Potem get_user_time + ten zapisany sprawdzaj na każdym spawnie.
  • +
  • -
  • 1
Dołączona grafika

#3 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 26.02.2012 20:11

zmienna new Czas_Gracza[33]
Potem zapis do nvault/sql ( polecam sql ), i potem ten czas będzie w sekundach.
W funkcji np.spawn'u będziesz musiał go podzielić new godziny Czas_Gracza[id] / 60*60
W tym przypadku możesz zrobić tak new godziny = getPlayedTime(id) / 60*60
Jakby coś to pytaj :D
getPlayedTime(id)
{
	return Czas_Gracza[id] + get_user_time(id, 1);
}

Użytkownik speedkill edytował ten post 26.02.2012 20:12

  • +
  • -
  • 1

If you can dream it, you can do it.


#4 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 26.02.2012 22:00

No, okej, okej, ale jeżeli chcę coś zrobić raz na np. 4 godziny?

Załóżmy, że przy spawnie mam przegrane 230 minut.
dzielę: getPlayedTime(id)(230*60) / (60*60) = 3,8(3)
A więc, jeszcze nie grałem 4 godzin na serwerze.
Mineło trochę czasu.
Przy kolejnym spawnie mam już 241 minut, czyli (241*60) / 3600 = 4,01(6), więc teraz powinienem wykonać na graczu jakąś tam operację.
Tylko, że przy kolejnym spawnie też ona sie wykona, a ja chcę wykonywać ją CO 4 godziny, a nie PO 4 godzinach ;P

Gdyby nie fakt, że gracz przy spawnie może mieć przegrane np. 241 minut (a nie 240) to bym zrobił to w taki sposób:
if(play_time[id]/60) % 240 == 0) { cośtam }  // play_time[id] to czas gry w sekundach od 1. połącznia z serwerem (zapisywane na nvalut)

  • +
  • -
  • 0

#5 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 27.02.2012 15:19

Dzielisz czas otrzymujesz go w godzinach.
Teraz w spawnie zrobisz if(play_time[id]/60*60 >=4 && play_time[id]/60*60 < 5)
Możesz sprawdzić tak, ale nie jestem pewny.
Możesz tez Podzielić go tak żeby otrzymać godziny i minuty, teraz przy spawnie sprawdzaj czy jest = 4 && miunty[id] < 30) :P
  • +
  • -
  • 1

If you can dream it, you can do it.


#6 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 27.02.2012 15:35

Nooo, okej, okej, ale przy 8 godzinach już twój warunek działać nie będzie ;P
  • +
  • -
  • 0

#7 Stachuu :D ??

    Wszechobecny

  • Użytkownik

Reputacja: 237
Wszechwidzący

  • Postów:476
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Karsznice
Offline

Napisano 27.02.2012 15:43

to moze jak wykona ta operacje to zeruj czas gracza ?
  • +
  • -
  • 0

#8 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 27.02.2012 15:49

Jest to jakieś rozwiązanie... Tylko trochę kijowe, jeżeli chcę znać czas, który dany gracz przegrał na serwerze...
  • +
  • -
  • 0

#9 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 27.02.2012 15:59

ja bym to zrobil tak na wejsciu jesli goscia nie ma w vault to wrzucasz mu ze gral te 4h i co spawn zmniejszasz te liczbe jak wyjdzie to ją zapisujesz i przy wejsciu wczytujesz jak liczba bedzie mniejsza od 0 to znowu ustawiasz mu 4h i wywolujesz funkcje
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#10 Nakupenda.

    Not yet YODA

  • Użytkownik

Reputacja: 137
Zaawansowany

  • Postów:451
  • Imię:Paweł
  • Lokalizacja:Warszawa
Offline

Napisano 27.02.2012 16:08

od tego jest operator reszty z dzielenia. xD

if(play_time[id]/(60*60) > 0 && play_time[id]/(60*60) % 4 == 0)

  • +
  • -
  • 0

#11 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 27.02.2012 16:19

tak ale zle go uzyles

pozatym nakupenda twoj sposób o ile podalbys poprawny kod dzialalby tylko gdy gracz respil by się w dokladnej sekundzie minięcia tych 4h a tu nie o to chodzi
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#12 Nakupenda.

    Not yet YODA

  • Użytkownik

Reputacja: 137
Zaawansowany

  • Postów:451
  • Imię:Paweł
  • Lokalizacja:Warszawa
Offline

Napisano 27.02.2012 16:58

tak ale zle go uzyles


hmm, a zakładając że by się respił dokładnie w tej sekundzie, jak powinien wyglądać mój kod poprawiony?

Użytkownik Nakupenda. edytował ten post 27.02.2012 16:59

  • +
  • -
  • 0

#13 TomekPL

    Pomocny

  • Użytkownik

Reputacja: 6
Nowy

  • Postów:41
  • GG:
  • Imię:Tomek
  • Lokalizacja:Szczecin
Offline

Napisano 27.02.2012 17:11

a nie mozna tego dac w curweapon ? to caly czas bedzie sprawdzac...
  • +
  • -
  • 0

#14 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 27.02.2012 17:26

play_time[id]%3600
to zwróci liczbe sekund ktora zostanie po odjęciu od calkowitego wyniku wszystkich pelnych godzin
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#15 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 162
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 27.02.2012 17:54

a może by czas gry pobrać z gametrackera przez sockety ?
  • +
  • -
  • 0

#16 Nakupenda.

    Not yet YODA

  • Użytkownik

Reputacja: 137
Zaawansowany

  • Postów:451
  • Imię:Paweł
  • Lokalizacja:Warszawa
Offline

Napisano 27.02.2012 20:45

a co wy na to panowie:

new ilosc[33], stara_ilosc[33]


public client_connect(id)
{
stara_ilosc[id] = floatround(play_time[id]/(4 * 60 * 60), floatround_floor)
}
public Nowa_Runda()
{
for(new id = 0; id<32; id++)
{
ilosc[id] = floatround(play_time[id]/(4 * 60 * 60), floatround_floor)
if(stara_ilosc[id] != ilosc[id])
{
stara_ilosc[id]++
jakas_funkcja(id)
}
}
}

Użytkownik Nakupenda. edytował ten post 27.02.2012 20:46

  • +
  • -
  • 1

#17 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 27.02.2012 21:05

Ale floatround(0,5, floatround_floor) i floatround(0,95, floatround_floor) zwróci 0.
Więc funkcja wykona się, gdy wejdę na serwer np. z czasem 4:14, ale też i 4:26 - nie wykona się tylko raz ;F

Choć teraz tak sobie myślę, że może oprócz całkowitego czasu gry zapisywać sobie jeszcze jakąś zmienną Bool? Tylko jeszcze myszę wymyślić co ona mi da ;D
  • +
  • -
  • 0

#18 Stachuu :D ??

    Wszechobecny

  • Użytkownik

Reputacja: 237
Wszechwidzący

  • Postów:476
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Karsznice
Offline

Napisano 27.02.2012 22:13

to moze zrob ze 1 zmienia liczysz czas a 2 ilosc "eventow" ktore gracz juz zrobił
co event dodajesz do zmiennej++
i porostu czas wymagany potem mnożysz poprzez nr eventu
  • +
  • -
  • 0

#19 Nakupenda.

    Not yet YODA

  • Użytkownik

Reputacja: 137
Zaawansowany

  • Postów:451
  • Imię:Paweł
  • Lokalizacja:Warszawa
Offline

Napisano 27.02.2012 23:16

Ale floatround(0,5, floatround_floor) i floatround(0,95, floatround_floor) zwróci 0.
Więc funkcja wykona się, gdy wejdę na serwer np. z czasem 4:14, ale też i 4:26 - nie wykona się tylko raz ;F

Nie rozumiem Twojego toku myślenia Funkcja zostaje wykonana, gdy miną 4*3600 sekundy od ostatniego wykonania funkcji i już, to wcale nie musi być dokładnie tyle w chwili respa, po to jest floatround_floor. Zresztą najlepiej sam sprawdź na serwerze

@edit:
wyobraź sobie że wbijasz sobie na serwer z czasem 4:16, czyli dokładnie 15240 sekund
stara_ilosc sprawdzana przy wejsciu gracza wynosi 15240/14400 a zaokrąglając w dół jest to 1
po przegraniu np. 30 minut, stara ilosc sie nie zmienia, a nowa ilosc wynosi 15240+30*60 = 17040
i mamy sprawdzenie w nowej rundzie: 17040/14400 w zaokrągleniu w dół nadal wynosi 1 ! Czyli ponieważ stara_ilosc == ilosc, to nic się nie dzieje

a kiedy nowa ilosc bedzie różna od starej ilości? Jak wyniesie 2. A kiedy wyniesie dwa? Gdy łączny czas gracza będzie większy od 8:00
tutaj nic nie musi być co do sekundy, po prostu po przekroczeniu kolejnych 4 godzin wyonywana jest podczas zrespienia funkcja

Poprawcie mnie jeśli się myle
  • +
  • -
  • 0

#20 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 28.02.2012 01:48

kombinujecie i kombinujecie

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

#define PLUGIN "4h"
#define VERSION "1.0"
#define AUTHOR "G[o]Q"

new time_play[33];

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    RegisterHam(Ham_Spawn,"player","PlayerSpawnPost",1);
}
public PlayerSpawnPost(id){
    static temp_time=time_play[id]+get_user_time(id);
    if(temp_time/3600 >=4){
        Bonus(id);
        temp_time[id]=0;
    }
}
public client_connect(id){
    wczytaj_dane(id);
}
public client_disconnect(id){
    zapisz_dane(id)
    time_play[id]=0;
}
public Bonus(id){
    // FUNKCJA ODPOWIEDZIALNA ZA BONUS
}
public zapisz_dane(id){
    time_play[id]+=get_user_time(id);
    //TUTAJ IMPLEMENTACJA ZAPISU DO VAULT
}
public wczytaj_dane(id){
    //TUTAJ IMPLEMENTACJA WCZYTYWANIA Z VAULT
}

dopiszcie sobie tylko wczytywanie i zapis xD
  • +
  • -
  • 1
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych