Alle nachfolgenden CODEs dürfen in anderen Programmen/Spielen verwendet werden!
Voraussetzungen
Programmiersprachen: PB, PHP
Als erstes braucht man ein Webspace auf dem man php-Rechte hat um dort php-Codes abzulegen und eine Liste mit den HighScore Einträgen, welche die php-Datei verändern darf/kann.
Damit keine sich in die HighScore "reincheaten" kann, brauchen wir auf jeden Fall eine Art Kontroll-String der bei jedem Eintrag mitgesendet wird.
Vorbereitung
Wir legen uns also zu erst ein Ordner auf dem Webspace an (Ordner)
Webspace-Ordner
HighscoreList.php
Damit die Highscroe läuft brauchen wir am Anfang eine StartDatei (hier HighscoreList.php)
Code: Alles auswählen
<?php
$Item = array();
Highscore.php
Diese Datei dient zum eintragen von Werten in die HighscoreList.php, und kontruliert vorher ob die Werte "echt sind" und schreibt dann die neue Zeile in die Liste.
Außerdem gibt sie (wenn gefordert) die Daten der Liste aus oder bei Fehler einen Fehlercode der dann von PB übersetzt wird.
Code: Alles auswählen
<?php
// Diese Variable bitte selber den eigenen wünschen nach anpassen!
//
$HighScoreKey = 'Password';
//
// Sortierung nach Punkten
function SortPoints($a,$b)
{
if ($a[0]<$b[0]) return 1;
elseif ($a[0]>$b[0]) return -1;
else return 0;
}
// Neuer Highscore Eintrag
if ($_GET['Points'])
{
$_GET['Name'] = urldecode($_GET['Name']);
if (crypt($_GET['Points'].$_GET['Name'], $HighScoreKey) == $_GET['Key'])
{
include 'HighscoreList.php';
foreach($Item as $Unit)
{
if ( ($Unit[0]==$_GET['Points']) and ($Unit[1]==$_GET['Name']) )
{
echo 'FALSE #3';
exit;
}
}
if ($File = @fopen('HighscoreList.php', 'a'))
{
// Eintrag in die Datei schreiben
fwrite($File, '$Item[] = array('.$_GET['Points'].', "'.$_GET['Name'].'");'.chr(13));
fclose($File);
echo 'TRUE';
}
else
{
echo 'FALSE #2';
}
}
else
{
echo 'FALSE #1';
}
}
// Highscore auslesen
else
{
include 'HighscoreList.php';
usort($Item,SortPoints);
if ($_GET['from']>0) $_GET['from']--;
else $_GET['from']=0;
if ($_GET['to']>0) $_GET['to']--;
else $_GET['to']=count($Item);
for($n=$_GET['from'];$n<$_GET['to'];$n++)
{
// ausgabe der Highscore
echo $Item[$n][0].chr(9).$Item[$n][1].chr(13);
}
}
?>
PB-Code
HighScore
Nun folgen ein paar Proceduren zum auslesen/eintragen von/in HighScore-Einträgen:
Code: Alles auswählen
; Diese beiden Variablen bitte selber den eigenen wünschen nach anpassen!
; //
Global HighScoreKey$ = "Password"
Global HighScoreURL$ = "http://data.unionbytes.de/Highscore/Highscore.php"
; \\
InitNetwork()
; Lädt den Inhalt einer URL in einen String
Procedure.s DownloadToString(URL$, TimeOut=5000)
Protected Event, Time, Size, String$
Protected BufferSize = $1000
Protected *Buffer = AllocateMemory(BufferSize)
Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site)
Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)
If ConnectionID
SendNetworkString(ConnectionID, "GET "+URL$+" HTTP/1.0"+#LFCR$+#LFCR$)
Time = ElapsedMilliseconds()
Repeat
Delay(10)
Event = NetworkClientEvent(ConnectionID)
Until Event Or ElapsedMilliseconds()-Time > TimeOut
If Event
Repeat
Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
String$ + PeekS(*Buffer, Size, #PB_Ascii)
Until Not Size
Inhalt = FindString(String$, #LFCR$, 1)
If Inhalt
ProcedureReturn Mid(String$,Inhalt+3)
Else
ProcedureReturn String$
EndIf
EndIf
EndIf
EndProcedure
; Strukture der HighScore
Structure HighScore
Points.l
Name$
EndStructure
Global NewList HighScore.HighScore()
; Fügt einen Eintrag in die Internet HighScore
Procedure AddHighScoreItem(Points.l, Name$)
Protected Points$ = Str(Points)
Name$ = URLEncoder(Name$)
Protected Get$ = "?Points="+Points$+"&Name="+Name$+"&Key="+DESFingerprint(Points$+Name$, HighScoreKey$)
String$ = DownloadToString(HighScoreURL$+Get$)
If String$
If String$ = "TRUE"
Debug "HighScoreEintrag hinzugefügt."
ProcedureReturn #True
ElseIf String$ = "FALSE #1"
Debug "Ungültiger Eintrag!"
ElseIf String$ = "FALSE #2"
Debug "Fehler beim eintragen (bzw. schreiben in die Datei)!"
ElseIf String$ = "FALSE #3"
Debug "Identischer Eintrag!"
Else
Debug "Unbekannter Fehler!"
Debug String$
EndIf
Else
Debug "Download fehlgeschlagen!"
EndIf
EndProcedure
; Lädt die Internet HighScore runter
; Dabei kann ab einem bestimmten Platz (Start)
; eine bestimmte Menge (Count) runtergeladen werden.
Procedure ExamineHighScore(Start=1, Count=0)
Protected Get$, Position, OldPosition, Item$
ClearList(HighScore())
If Count > 0
Get$ = "?from="+Str(Start)+"&to="+Str(Start+Count)
Else
Get$ = "?from="+Str(Start)
EndIf
String$ = DownloadToString(HighScoreURL$+Get$)
If String$
Repeat
Position = FindString(String$, Chr(13), OldPosition+1)
If Position
Item$ = Mid(String$, OldPosition+1, Position-OldPosition-1)
AddElement(HighScore())
HighScore()\Points = Val(StringField(Item$, 1, Chr(9)))
HighScore()\Name$ = StringField(Item$, 2, Chr(9))
OldPosition = Position
EndIf
Until Not Position
ResetList(HighScore())
ProcedureReturn #True
Else
Debug "Download fehlgeschlagen!"
EndIf
EndProcedure
; Springt zum nächsten HighScore Eintrag (der Download-HighScore)
Macro NextHighScoreItem()
NextElement(HighScore())
EndMacro
; Gibt die Punkte des HighScore Eintrags zurück
Macro GetHighScorePoints()
HighScore()\Points
EndMacro
; Gibt den Namen des HighScore Eintrags zurück
Macro GetHighScoreName()
HighScore()\Name$
EndMacro
Kommentar
In PB wird in AddHighScoreItem() eine URL erzeugt welche für php auslesbare Daten enthält.
Die Daten bestehen aus den Punkten und dem Namen.
Damit es keine unberechtigten Einträge gibt wird zusätzlich ein ÜberprüfungsString mitgesendet.
Dieser wird aus in PB mit DESFingerprint() erstellt und in php mit gesendetetn Daten und crypt().
Nur wenn beide Übereinstimmen, wird der Eintrag wirklich eingetragen.
Der Eigene SchlüsselString muss in PB und php identisch sein!
Um nun eine Spam zu verhindern (also mehrmals die gleiche URL aufrufen) werden nur Unterschiedliche Einträge hinzugefügt (also nur wenn Punkte oder Name unterschiedlich ist)
Fals während dieser Abläufe ein Fehler auftritt wird dieser von php übermittelt, und als DEBUG in PB ausgegeben bzw mit einem FALSE.
Um die Liste auslesen zu können wird ExamineHighScore() benötigt.
Dort kann wiederum ein Auslesestart angegeben werden und eine Anzahl an Einträgen die ausgelesen werden soll.
Das Abarbeiten dieser Einträge basiert dann auf einem ähnlichen System wie bei zB. ExamineDirectory.
Beispiel
Wer alle Werte so übernimmt wie ich sie gegeben habe kann hier dann schnell eine PB-Datei öffnen, die Proceduren übernehmen und dann diesen CODE ausfühen um zu sehen was passiert :
Liste Auslesen:
Code: Alles auswählen
ExamineHighScore()
While NextHighScoreItem()
Debug Str(GetHighScorePoints())+" "+GetHighScoreName()
Wend
Code: Alles auswählen
Punkte = 123
Name$ = "Unbekannt"
Debug AddHighScoreItem(Punkte, Name$)
Schlusswort
Ich hoffe die CODEs sind verständlich, oder anwendbar, und ich hoffe ich habe euch damit viel geholfen.
Wer fragen hat, kann sie gerne stellen.