elitepvpers

elitepvpers (https://www.elitepvpers.com/forum/)
-   Metin2 PServer Guides & Strategies (https://www.elitepvpers.com/forum/metin2-pserver-guides-strategies/)
-   -   LUA I/O & mysql (via os.execute) (https://www.elitepvpers.com/forum/metin2-pserver-guides-strategies/1429114-lua-i-o-mysql-via-os-execute.html)

LordMampf2 09/11/2011 16:29

LUA I/O & mysql (via os.execute)
 
Hallo =)
Ich will hier mal was hoffentlich neues Releasen, dass für große Server recht interessant ist..
Ich habe von einiger Zeit mal nach Möglichkeiten gesucht, um bestimmte Daten die in einer Quest benutzt werden woanders als in in der Quest-Tabelle speichern zu lassen? Warum?
Ganz einfach: Wenn ich jetzt etwas auslesen will also z.B. bei einem 2 sprachigen Server muss man ja irgendwo abspeichern, welche Sprache der user hat..
Das kann man ja ganz normal per setqf machen..
Aber wenn ich das jetzt abrufen muss also SELECT * xyx (des macht ja der db Server) dann muss der mysql Server so lange suchen bis er den Eintrag hat.. Was bei 800.000k Einträgen (PSG-Elysim 42k Spieler) ganz schön dauern kann und einige Ressourcen braucht.
Schneller und effizenter geht es wenn man einfach eine Textdatei ausliest, wo darin einfach die Sprache gespeichert wird..

Hier mal einen Ausschnitt aus meiner Questlib:
PHP Code:

function createtxtsystem()
    
os.execute("mkdir playerdata/".. pc.get_account_id() .."")
    
os.execute("mkdir playerdata/".. pc.get_account_id() .."/".. pc.get_player_id() .."")
end

function getlang()
    
local lang ""
    
local r io.open("playerdata/".. pc.get_account_id() .."/lang.txt","r")
    if 
r~=nil then
        lang 
r:read()
        
r:close()
        return 
lang
    
else 
        return 
false
    end
end

function setlang(text)
    
local w io.open("playerdata/".. pc.get_account_id() .."/lang.txt","w")
    if 
text == "de"    then
        w
:write("de")
    else
        
w:write("en")
    
end
    w
:close()
end 

Man sollte beachten dass Ordner nicht von alleine erstellt werden..
Also wird bei 1. Login das Grundgerüst von einem Spieler erstellt.
Warum jetzt das?
Ja jeder Spieler braucht eine eigene Textdatei logisch?
Da aber die Sprache bei allen Chars gleich ist, lass ich die Sprache im Account-Ordner (also der Ordner heißt wie die account-id des Spielers) speichern. Andere Daten die bei jedem Spieler unterschiedlich sind, kann ich in dem Ordner speichern, der im Account-Ordner ist aber die Player id als Name trägt.
Ich hoffe ihr habt es einigermaßen verstanden ;)

Genaue Leser ist sicher das os.execute aufgefallen. Mit dem Command kann man Befehle ausführen (also alle Befehle die man in putty so eingeben kann)..

Jemand der weiter nachdenkt und geil auf neue Ranglisten ist dem fällt ggf das hier ein:

PHP Code:

function rotkill()
    
os.execute("mysql -u root playerdata --execute='UPDATE pvpkillcounter SET rot = rot + 1 WHERE playerid = ".. pc.get_player_id() ..";'")
end

function gelbkill()
    
os.execute("mysql -u root playerdata --execute='UPDATE pvpkillcounter SET gelb = gelb + 1 WHERE playerid = ".. pc.get_player_id() ..";'")
end

function blaukill()
    
os.execute("mysql -u root playerdata --execute='UPDATE pvpkillcounter SET blau = blau + 1 WHERE playerid = ".. pc.get_player_id() ..";'")
end

function mobkill()
    
os.execute("mysql -u root playerdata --execute='UPDATE pvmkillcounter SET kills = kills + 1 WHERE playerid = ".. pc.get_player_id() ..";'")
end 

Wenn man die neuen Questbefehle richtig anwendet werden sie in die neu erstellte Datenbank namens playerdata genauer gesagt in der Tabelle pvpkillcounter eine Zahl hochzählen, die die Anzahl der getöteten Gegener oder eigene Leute bestimmt.
(Leider ungetestet bei größeren Servern)

Quest States lassen sich natürlich auch so speichern:


PHP Code:

function gettxtstate(state)
    
local value ""
    
local r io.open("playerdata/".. pc.get_account_id() .."/".. pc.get_player_id() .."/".. state ..".txt","r")
    if 
r~=nil then
        value 
r:read()
        
r:close()
        return 
value
    
else 
        return 
false
    end
end

function settxtstate(state,text)
    
local w io.open("playerdata/".. pc.get_account_id() .."/".. pc.get_player_id() .."/".. state ..".txt","w")
    
w:write(text)
    
w:close()
end 

Falls ihr diese Funktionen benutzt daran denken, dass wenn man z.B. ein Ordner erstellt, dass sich der Ordner im jeweiligen Core befindet. Also Verknüpfungen nicht vergessen ;)


Ich weiß nicht ob es schon alles in dieser Form bekannt ist, wenn ja dann sry ;)
Ich bitte euch dies nicht als eigenes auszugeben, da ich einige Tage an den paar Zeilen gesessen bin. Danke ;)

grüßle LordMampf2

√π. 09/11/2011 16:36

Erstmal überflogen und sieht hilfreich aus. Werde mich mal weiter mit auseinandersetzen. Danke!

IgorGlock 09/11/2011 16:39

Unnötig für i-welchen Ranglisten die Festplatte zu beschreiben.
Das geht alles mit setqf und MySQL SELECT.
:P

LordMampf2 09/11/2011 16:39

Quote:

Originally Posted by √π. (Post 12835616)
Erstmal überflogen und sieht hilfreich aus. Werde mich mal weiter mit auseinandersetzen. Danke!

Ja man muss sich das in Ruhe anschauen und genau überlegen was eig gemacht wird und was man selber macht.. Sonst bringt das nichts ;)


Quote:

Originally Posted by IgorGlock (Post 12835701)
Unnötig für i-welchen Ranglisten die Festplatte zu beschreiben.
Das geht alles mit setqf und MySQL SELECT.
:P

Vlt habe ich mich schlecht ausgedrückt.
Also Ranglisten kann man nicht verschachtelt speichern des kannste ja vergessen die wieder auzulesen (wenn man das so verschachtelt speichert wie oben)

Mysql Select dauert bei vielen Einträgen wie schon gesagt etwas..
(Ich habs ingame wirklich gestestet und es gab Unterschiede)

grüßle LordMampf2

.Alessa 09/11/2011 16:55

mit dem kann man eigentlich noch viel mehr anstellen.. Wenn sich einer böse benimmt, könnte man per ox.execute pf dazu anweisen, ihn zu blockieren...^^

LordMampf2 09/11/2011 17:00

Quote:

Originally Posted by .Alessa (Post 12836071)
mit dem kann man eigentlich noch viel mehr anstellen.. Wenn sich einer böse benimmt, könnte man per ox.execute pf dazu anweisen, ihn zu blockieren...^^

Net so viel verraten.. Da kann man vieles machen.. ;)
Das beste ist immernoch ein Ban Button im Client..
Man klick kurz drauf der jeweilige Spieler bekommt ein kick und ist gebannt xD

grüßle LordMampf2

RealFreak 09/11/2011 17:18

Quote:

Originally Posted by LordMampf2 (Post 12836177)
Net so viel verraten.. Da kann man vieles machen.. ;)
Das beste ist immernoch ein Ban Button im Client..
Man klick kurz drauf der jeweilige Spieler bekommt ein kick und ist gebannt xD

grüßle LordMampf2

kickt clientside und blockt serverside, kenns schon, allerdings hatte ich es nur durch hanashis mysql schnittstelle hinbekommen^^
Auf jeden Fall nais Thread^^

MfG RealFreak

.Alessa 09/11/2011 18:06

Naja RealFreak, Hanashi Schnittstelle hat bei mir nich hingehauen ;-)

Aber auf die Idee gekommen, die Queries einfach per os.execute auszuführen, bin ich nicht xD Ich Dummkopf... Eigentlich kann man damit schon extrem viel machen :D Ich verrate auch nicht mehr :D Dass das hier epvpers hat, ist eigentlich schon schlimm genug :x xD

Perfection- 09/11/2011 19:27

nice nice, so kann man mysql etwas entlasten , danke!

[SGA]Jango 09/11/2011 23:32

Könntest du vieleicht mal ein Select beispiel machen vieleicht auhc mit ner while oder for schleife! kriegst ein thx :D

.Resistance 09/12/2011 01:12

Wäre es damit möglich, einen Ingame Itemshop zu machen, der die Coins aus der Account Tabelle auslesen kann?

TehImpulse 09/12/2011 01:47

ja du kannst dann auf php ausführen via osexecute!!

Mashkin 09/12/2011 03:52

Quote:

Originally Posted by TehImpulse (Post 12845388)
ja du kannst dann auf php ausführen via osexecute!!

Wenn man Spaß daran hat, PHP-Skripts für die Konsole zu schreiben - ja.
Aber das ist vorallem bei größeren Servern ziemlich resourcenintensiv (PHP-Interpreter), weshalb ich einen compilierten Daemon oder eine andere Skriptsprache (z.B. Perl) bevorzugen würde...

Abgesehen davon kann man dank der io- und os-Schnittstelle so gut wie alles machen, was der Metin2-Systemuser (leider oft root) kann - also oft alles...

@LordMampf2: FreeBSD ist nicht Linux, daher würde ich dir die Bezeichnung "unixoide und BSD-basierte Systeme" empfehlen.

Computerfreek 09/12/2011 06:55

Es gibt eine spezielle SQL-Lib für Lua welche man benutzen kann.
Auf os.execute zurückzugreifen scheint mir ein wenig "overkill"-mäßig.
Wenn du nen Hähnchen braten willst kommst du doch auch nicht gleich mit einem Flammenwerfer an, oder?

Prσfizσcker94 09/12/2011 07:48

Quote:

Originally Posted by Computerfreek (Post 12846208)
Es gibt eine spezielle SQL-Lib für Lua welche man benutzen kann.
Auf os.execute zurückzugreifen scheint mir ein wenig "overkill"-mäßig.
Wenn du nen Hähnchen braten willst kommst du doch auch nicht gleich mit einem Flammenwerfer an, oder?

Würdest du uns ne kleine Anleitung schreiben, wie du die SQL-Lib zum laufen bekommen hast?

Lg

TheDestroyer™ 09/12/2011 08:29

its realy the best share! thank you

LordMampf2 09/12/2011 13:33

Quote:

Originally Posted by Computerfreek (Post 12846208)
Es gibt eine spezielle SQL-Lib für Lua welche man benutzen kann.
Auf os.execute zurückzugreifen scheint mir ein wenig "overkill"-mäßig.
Wenn du nen Hähnchen braten willst kommst du doch auch nicht gleich mit einem Flammenwerfer an, oder?

Ich weiß dass es die lib gibt.. Aber da ich gehört habe, dass sie nicht in quests verwedet werden kann hab ich hald alternativen gesucht..
mit dem overkill haste schon recht aber ich dachte besser als gar nix ;)
Ich muss muss mich mal an die LUA SQL dransetzten

@M@shkin
Da haste Recht mit dem Linux.. Aber irgendwie sagt man immer dass es Linux ist ;)

.Rebel 09/12/2011 15:18

with that we can make nomarch with no bug and also the market the new option of 2011 tanks for that share

Tofus 09/15/2011 20:09

Super Sache, jedoch steh ich vor einem Problem, was ich nicht gelöst bekomme:
Man kann nur Werte eintragen, die Zahlen sind. Will ich zum Beispiel die Spalte "rot" auf 'beispiel' setzen will, geht das ja normal mit
Code:

set rot = 'beispiel'
Jedoch geht das wegen den Anführungszeichen und Hochkommas nicht mehr, sobald man ' oder " verwendet, wird der Query nicht ausgeführt.


Hat jemand dafür ne Lösung?

αddι 09/17/2011 08:44

Quote:

Originally Posted by Tofus (Post 12903308)
Super Sache, jedoch steh ich vor einem Problem, was ich nicht gelöst bekomme:
Man kann nur Werte eintragen, die Zahlen sind. Will ich zum Beispiel die Spalte "rot" auf 'beispiel' setzen will, geht das ja normal mit
Code:

set rot = 'beispiel'
Jedoch geht das wegen den Anführungszeichen und Hochkommas nicht mehr, sobald man ' oder " verwendet, wird der Query nicht ausgeführt.


Hat jemand dafür ne Lösung?

Gleiches Problem.

Howaner 09/17/2011 08:56

probiert mal
set rot = \'beispiel\' aus
Ich weiß nicht ob das in Lua funzt aber in PHP gehts

Geswoq 09/17/2011 09:28

danke :)

Manuel92x 10/12/2011 16:24

Quote:

Originally Posted by Tofus (Post 12903308)
Super Sache, jedoch steh ich vor einem Problem, was ich nicht gelöst bekomme:
Man kann nur Werte eintragen, die Zahlen sind. Will ich zum Beispiel die Spalte "rot" auf 'beispiel' setzen will, geht das ja normal mit
Code:

set rot = 'beispiel'
Jedoch geht das wegen den Anführungszeichen und Hochkommas nicht mehr, sobald man ' oder " verwendet, wird der Query nicht ausgeführt.


Hat jemand dafür ne Lösung?

Quote:

Originally Posted by αddι (Post 12924707)
Gleiches Problem.

Ebenfalls. Ich hatte es schon mit escapen probiert, leider ohne Erfolg?

Tofus 10/12/2011 17:11

Quote:

Originally Posted by Manuel92x (Post 13320105)
Ebenfalls. Ich hatte es schon mit escapen probiert, leider ohne Erfolg?

set rot = \'beispiel\'

Manuel92x 10/12/2011 17:22

Quote:

Originally Posted by Tofus (Post 13320945)
set rot = \'beispiel\'

Wenn du mein Text lesen würdest, würdest du wissen, dass es mit dem escapen nicht funktioniert.
Die Datenbank wird nicht upgedated, und ich bekomme keine Fehlermeldung via PuTTY!

Tofus 10/12/2011 22:45

Quote:

Originally Posted by Manuel92x (Post 13321118)
Wenn du mein Text lesen würdest, würdest du wissen, dass es mit dem escapen nicht funktioniert.
Die Datenbank wird nicht upgedated, und ich bekomme keine Fehlermeldung via PuTTY!

Bei mir funktioniert es so, sonst hätte ichs nicht geschrieben ;)
Dann machst du was mit den Hochkommas " und ' falsch, variiere da mal.

Manuel92x 10/12/2011 23:22

Quote:

Originally Posted by Tofus (Post 13326585)
Bei mir funktioniert es so, sonst hätte ichs nicht geschrieben ;)
Dann machst du was mit den Hochkommas " und ' falsch, variiere da mal.

Ich habe mir schon probiert Hilfe zu holen.
Leider ohne Erfolg.

[Only registered and activated users can see links. Click Here To Register...]

Wärst du bereit, mir deinen String zu senden?


All times are GMT +2. The time now is 07:47.

Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.