[PHP]Quake4 server uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik maak gebruik van gsQuery om via PHP gameservers uit te lezen en zichtbaar te maken op een website

Maar helaas werkt gsQuery niet voor de game Quake4

Quake4 lijkt erg veel op Doom3, maar de query resultaten geven niet de informatie wat ik nodig heb.
Als je een query doet met als protocol Doom3 dan krijg je bij de player stats allemaal server gegevens.

Mijn vraag is nu of iemand hetzelfde probleem heeft en al een oplossing heeft gevonden om ook een Quake4 server correct te kunnen uitlezen?

Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Kijk is naar het Doom3 protocol, deze werkt gewoon op Quake4. Niet alle tags werken, maar ik heb gewoon response gekregen.

Helaas heb ik de source niet meer, maar het was nog geen avond werk met dit document bij de hand.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat gebruik ik het doom3 protocol maar ik krijg geen enkele waarde eruit.
Alle server info worden als player info weer gegeven, de server info is totaal blank.
Geen servernaam, paswoord ja/nee, aantal spelers, niets van dat helaas

En die code op die website is abracadabra voor mij, weinig PHP code in te herkennen...

[ Voor 17% gewijzigd door Verwijderd op 02-11-2005 22:21 ]


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Verwijderd schreef op woensdag 02 november 2005 @ 22:11:
En die code op die website is abracadabra voor mij, weinig PHP code in te herkennen...
Het is ook geen code, het zijn de bytes die je moet zenden om info terug te krijgen. Het staat netjes gedocumenteerd.

Je connect met een socket naar de server, stuur een pakketje zoals gespecificeerd staat in het document en vangt daarna de reply op.

Je moet wel enige kennis hebben van sockets en bytes (wat gerelateerd is aan sockets), verdiep je anders eerst even in sockets voordat je hier aan begint.

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
probeer qstat eens.. ik weet niet of dit nog geupdate word, maar het is origineel voor quake2 geschreven, maar ondersteund veel meer spellen

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het probleem is dat ik al een heel script heb gemaakt in PHP wat gebruikt maakt van gsQuery en ik niet alleen Quake query maar vrijwel alle gangbare FPS games.
Om nu dat hele script om te gaan bouwen zie ik niet echt zitten, gsQuery ondersteund wel Doom3 maar blijkbaar niet Quake4, het PHP gedeelte lukt me allemaal nog wel maar dat bytes verhaal gaat me boven mijn pet.

Acties:
  • 0 Henk 'm!

  • TweakerNummer
  • Registratie: September 2001
  • Niet online
Verwijderd schreef op woensdag 02 november 2005 @ 23:43:
Het probleem is dat ik al een heel script heb gemaakt in PHP wat gebruikt maakt van gsQuery en ik niet alleen Quake query maar vrijwel alle gangbare FPS games.
Om nu dat hele script om te gaan bouwen zie ik niet echt zitten, gsQuery ondersteund wel Doom3 maar blijkbaar niet Quake4, het PHP gedeelte lukt me allemaal nog wel maar dat bytes verhaal gaat me boven mijn pet.
http://dev.kquery.com/index.php?article=22

Kijk daar eens naar. Het is eigenlijk heel simpel.
1) socket openen naar de server
2) "ÿÿÿÿgetservers" of iets dergelijks versturen (de bytes)
3) response uitlezen

Je moet alleen wel het Quake 4 protocol kennen.

[ Voor 3% gewijzigd door TweakerNummer op 03-11-2005 00:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik krijg het met geen mogelijkheid werkend

Ik moet dit intigreren in mijn huidige script en daarmee wil het niet werken, het script geeft gewoon geen waardes retour.

Acties:
  • 0 Henk 'm!

Verwijderd

joh, anders schrijf je eerst eventjes een stukje script (zorg dat het werkt)
en dan integreer je het later toch.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geprobeert maar werkt simpelweg niet
Ik snap er niets van, hele query komt met vreemde waardes terug die ik niet kan gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 03 november 2005 @ 15:23:
Geprobeert maar werkt simpelweg niet
Ik snap er niets van, hele query komt met vreemde waardes terug die ik niet kan gebruiken.
code?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is de code die ik nu gebruik

Wat ik retour krijg is zo onduidelijk dat je erbijna niks mee kunt, ik probeer te filteren maar dat lukt niet.
Als er bv al 1 waarde ontbreekt werkt het al niet meer, ook krijg ik totaal geen speler gegevens te zien.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  function query_server($getPlayers=TRUE,$getRules=TRUE)
  { 
    $command="\xFF\xFFgetInfo\x00\x00\x00\x00";
    if(!($result=$this->_sendCommand($this->address,$this->queryport,$command))) {
      $this->errstr='No reply received';
      return FALSE;
    }

    // strip header
    $noHeader = substr($result, strpos($result, "\x00\x00", 13)+2);
    $seperatorPos = strpos($noHeader, "\x00\x00");
     // extract rule data
    $ruleData = substr($noHeader, 0, $seperatorPos);

    $rawdata=explode("\x00", $ruleData); // de data

    for($i=0;$i< count($rawdata);$i++) {
      switch (strtolower($rawdata[$i++])) {

      case 'si_gametype':
    $this->gametype=$rawdata[$i];
      case 'gamename':
    $this->gamename=$rawdata[$i];
    break;
      case 'si_version':
    $this->gameversion=$rawdata[$i];
    break;
      case 'si_name':
    $this->servertitle=$rawdata[$i];
    break;
      case 'si_mapcycle':
    $mapdata=explode("/",$rawdata[$i]);
    $this->mapname=strtoupper($mapdata[2]);
    break;
      case 'si_maxplayers':
    $this->maxplayers=$rawdata[$i];
    break;
      case 'si_usepass':
    $this->password=$rawdata[$i];
    break;
      default:
    $this->rules[strtolower($rawdata[$i-1])] = $rawdata[$i];
      }
    }
 
    // game port is identical to query port
    $this->hostport = $this->queryport;
    $this->online =TRUE;

    if(!$getPlayers) {
      return TRUE;
    } 

    // getting player data
    $playerData = substr($noHeader, $seperatorPos+2);

    // length of player data
    $len = strlen($playerData)-8;

    for($i=0;$i<$len;$i=$posNextPlayer) {
      // unpacking ping and client rate
      $curPlayer = unpack('@'.$i.'/x/nping/nrate', $playerData);
      // finding start offset of next player
      $posNextPlayer = strpos($playerData, "\x00", $i+8);
      if($posNextPlayer == FALSE) { break; } // abort on bogus data
      // extract player name
      $curPlayer['name'] = substr($playerData, $i+8, $posNextPlayer-$i-8);
      // add player to the list of players
      $this->players[$this->numplayers++] = $curPlayer; 
    }
    
    $this->playerkeys = array('name' => TRUE, 'ping' => TRUE, 'rate' => TRUE);

    return TRUE;
  }

[ Voor 18% gewijzigd door Verwijderd op 03-11-2005 21:23 ]


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Kun je ons laten zien wat je precies terug krijg na de eerste command?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Probleem is dat ik een hele reeks code retour krijg alleen kan ik deze nergens copy en pasten
Als ik de code selecteer en kopieer en vervolgens ergens wil plakken krijg ik alleen dit:
result=ÿÿinfoResponse (en dan een hoop code)

De rest wat erachter staat krijg ik met geen mogelijkheid gecopied/paste, zelfs als ik de bron op vraag en het vanauit daar kopieer dan staat alleen result=ÿÿinfoResponse bij het plakken.

Ik heb een screenie gemaakt van een gedeelte van de code die retour komt:
Afbeeldingslocatie: http://www.verstappentuinhuisjes.nl/screen.JPG

[ Voor 14% gewijzigd door Verwijderd op 03-11-2005 22:44 ]


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Hoezo kun je dat niet paste'n? :?

Je kunt de response toch gewoon even uitspugen met een echo, je zult dan moeten splitten. Maar zonder het response resultaat kan ik weinig voor je doen, want je krijgt namelijk wel een result dus je query was in iedergeval wel goed en wordt herkend.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee gaat simpelweg niet
Het wordt al geprint op het scherm maar zodra je het selecteerd en kopieert en je wilt het pasten krijg je alleen het begin wat ik al vermelde.
Geen idee waarom je die code niet kunt kopieren, mij lukt het niet

update:
Ik heb de $result waarde naar een tekst bestand laten schrijven, dat ging wel.
Deze kan je hier downlaoden

Ook nog een toevoeging.
Als in de Q4 server de waarde fs_game niet is ingesteld loopt het script ook al direct bij de eerste waarde vast, het probleem is dus dat deze waarde helemaal niet ingevuld hoeft te zijn, bij de meeste server is deze waarde dus ook leeg en doet het script al helemaal niks.

Zoals al vermeld ik snap er niks meer van, de waardes die retour komen zijn inderdaad wel de game waardes echter ik kan totaal geen systeem vinden om die te ontcijferen.

[ Voor 67% gewijzigd door Verwijderd op 03-11-2005 23:02 ]


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Dit ziet er prima uit! Hij geef nu netjes aan:

si_numPlayers4
si_fragLimit 40
si_timeLimit 20
si_map mp/q4ctf1
si_gameType CTF
si_allowHitscanTint 1


Dit is toch ook precies wat je wilt hebben?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja echter het probleem is als 1 van de waardes leeg zijn bv:
si_frafLimit = null (dus geen waarde)
Dan klopt de rest niet meer daarna, dat heb ik nu al met de fs_game waarde die als eerste komt, standaard is bij de meeste servers deze waarde leeg, resultaat is dus dat de rest ook niet meer klopt.

Ook kan ik geen player gegevens eruit halen, hij zegt nu bv als spelers:
Speler: Ping:
1 26975
e 26465
KE4-1 25185
Dit terwijl er helemaal geen spelers zijn op de server.

Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Verwijderd schreef op vrijdag 04 november 2005 @ 13:37:
Ja echter het probleem is als 1 van de waardes leeg zijn bv:
si_frafLimit = null (dus geen waarde)
Dan klopt de rest niet meer daarna, dat heb ik nu al met de fs_game waarde die als eerste komt, standaard is bij de meeste servers deze waarde leeg, resultaat is dus dat de rest ook niet meer klopt.
Nee dit is niet waar, dan krijg je gewoon 2 keer een null-byte zeg maar.
Verwijderd schreef op vrijdag 04 november 2005 @ 13:37:
Ook kan ik geen player gegevens eruit halen, hij zegt nu bv als spelers:
Speler: Ping:
1 26975
e 26465
KE4-1 25185
Dit terwijl er helemaal geen spelers zijn op de server.
Probeer is een anderen server en weet je wel zeker dat er geen players zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja maar wel het probleem dat het script gewoon stopt, dus de $result (na verwijderen header) is dan alleen maar fs_game, alle andere info is verdwenen dan.

Op een andere server hetzelfde en ja weet 100% zeker dat er geen spelers zijn.
Ik query de server ook met een losse tool (All Seeying Eye), deze zegt ook dat er geen spelers op zijn.

Als ik de code gebruik zoals ik gepost heb werkt het in iedergeval helaas niet.
Dit is trouwens een bestaande code voor Doom3, welke is aangepast voor Q4, de originele Doom3 code heeft exact hetzelfde probleem.
Pagina: 1