Register for your free account! | Forgot your password?

You last visited: Today at 10:46

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



LUA I/O & mysql (via os.execute)

Discussion on LUA I/O & mysql (via os.execute) within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
elite*gold: 439
Join Date: May 2009
Posts: 1,502
Received Thanks: 880
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
LordMampf2 is offline  
Thanks
22 Users
Old 09/11/2011, 16:36   #2
 
elite*gold: 32
Join Date: Dec 2010
Posts: 1,294
Received Thanks: 862
Erstmal überflogen und sieht hilfreich aus. Werde mich mal weiter mit auseinandersetzen. Danke!
√π. is offline  
Old 09/11/2011, 16:39   #3

 
IgorGlock's Avatar
 
elite*gold: 1862
Join Date: Jan 2009
Posts: 3,725
Received Thanks: 7,671
Unnötig für i-welchen Ranglisten die Festplatte zu beschreiben.
Das geht alles mit setqf und MySQL SELECT.
:P
IgorGlock is offline  
Old 09/11/2011, 16:39   #4
 
elite*gold: 439
Join Date: May 2009
Posts: 1,502
Received Thanks: 880
Quote:
Originally Posted by √π. View Post
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 View Post
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
LordMampf2 is offline  
Thanks
1 User
Old 09/11/2011, 16:55   #5
 
elite*gold: 252
Join Date: Mar 2008
Posts: 3,111
Received Thanks: 3,911
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...^^
.Alessa is offline  
Thanks
2 Users
Old 09/11/2011, 17:00   #6
 
elite*gold: 439
Join Date: May 2009
Posts: 1,502
Received Thanks: 880
Quote:
Originally Posted by .Alessa View Post
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
LordMampf2 is offline  
Thanks
3 Users
Old 09/11/2011, 17:18   #7
 
elite*gold: 6
Join Date: May 2010
Posts: 1,227
Received Thanks: 1,629
Quote:
Originally Posted by LordMampf2 View Post
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
RealFreak is offline  
Old 09/11/2011, 18:06   #8
 
elite*gold: 252
Join Date: Mar 2008
Posts: 3,111
Received Thanks: 3,911
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 Ich verrate auch nicht mehr Dass das hier epvpers hat, ist eigentlich schon schlimm genug :x xD
.Alessa is offline  
Thanks
2 Users
Old 09/11/2011, 19:27   #9
 
elite*gold: 17
Join Date: Jan 2009
Posts: 2,538
Received Thanks: 2,405
nice nice, so kann man mysql etwas entlasten , danke!
Perfection- is offline  
Old 09/11/2011, 23:32   #10
 
[SGA]Jango's Avatar
 
elite*gold: 3
Join Date: Oct 2010
Posts: 390
Received Thanks: 463
Könntest du vieleicht mal ein Select beispiel machen vieleicht auhc mit ner while oder for schleife! kriegst ein thx
[SGA]Jango is offline  
Old 09/12/2011, 01:12   #11
 
.Resistance's Avatar
 
elite*gold: 17
Join Date: Jul 2009
Posts: 1,562
Received Thanks: 478
Wäre es damit möglich, einen Ingame Itemshop zu machen, der die Coins aus der Account Tabelle auslesen kann?
.Resistance is offline  
Old 09/12/2011, 01:47   #12
 
elite*gold: 0
Join Date: Sep 2011
Posts: 57
Received Thanks: 2
ja du kannst dann auf php ausführen via osexecute!!
TehImpulse is offline  
Old 09/12/2011, 03:52   #13
 
Mashkin's Avatar
 
elite*gold: 44
Join Date: May 2010
Posts: 2,053
Received Thanks: 1,747
Quote:
Originally Posted by TehImpulse View Post
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.
Mashkin is offline  
Thanks
2 Users
Old 09/12/2011, 06:55   #14

 
elite*gold: 0
Join Date: Feb 2008
Posts: 2,754
Received Thanks: 1,748
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?
Computerfreek is offline  
Old 09/12/2011, 07:48   #15
 
elite*gold: 80
Join Date: Dec 2007
Posts: 2,225
Received Thanks: 4,765
Quote:
Originally Posted by Computerfreek View Post
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
Prσfizσcker94 is offline  
Reply


Similar Threads Similar Threads
[MYSQL dont Start]su: unknown login: mysql
05/08/2011 - Metin2 Private Server - 2 Replies
Moin Leute und zwar hab ich ein Problem das ich bis heute noch nie hatte, Ich hab mein Root Server neu gestartet und dabei bemerkt das der Mysql Server nicht wieder mit hoch gefahren ist..... Dann hab ich versucht per: ihn wieder zu starten aber es gibt mir nur das hier aus: Die Frage ist jetzt an was liegt das? Danke schonmal.
[ERROR] Mysql can't connect to local Mysql server through socket
11/06/2010 - Metin2 Private Server - 5 Replies
I just recently tried to configure a DNS server for MT2.. It came up with this error ERROR: 2002 (HY000): Can't connect to local Mysql server through socket '/tmp/mysql.sock' (2) Do I need to do a fresh installation of FBSD? :S Thanks.
MySQL Navicat 1130-Host'5.xxx.xx.xxx' is not allowed to connect to the MySQL Server
08/07/2010 - Metin2 Private Server - 14 Replies
Hallo com, ich habe ein Problem mit Navicat. Undzwar habe ich diesen Fehler hier : "1130-Host'5.xxx.xx.xxx' is not allowed to connect to the MySQL Server" seid gestern. Ich dachte mir mal ich änder mein Navicat Passwort um... Als ich dies getan habe, und meinen Server rebootet habe und Navicat neugestartet habe, und ich mich wieder in Navicat einloggen wollte kam diese Fehlermeldung. Nun habe ich das Problem das ich mich nicht mehr mit Navicat connecten kann. Habe schon alles versucht...



All times are GMT +2. The time now is 10:46.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.