Liebe Community,
ihr kennt ja die bisher vorhandenen Questflags, mit denen ihr Zahlen speichern könnt. Mit der Variante, die mein Kumpel entwickelt hat, könnt ihr auch Tabellen und Strings speichern.(Also eigentlich alles)
Ich betone:"Diese art von Questflags stammt nicht von mir, ich wurde lediglich gebeten sie zu Releasen"
function get_locale_quest_path()
local file = io.open("usr/tmp","r")
if file then
for line in file:lines() do
if string.find(line,"/share/")then
return line.."/"
end
end
file:close()
end
os.execute("find / -name quest > /usr/tmp")
local tmp = io.open("usr/tmp","r")
for line in tmp:lines() do
if string.find(line,"/share/")then
tmp:close()
return line.."/"
end
end
end
SpeicherPfad = get_locale_quest_path()..""-- hier kann der ordner rein, wo alles gespeichert werden soll
pc.write_table = function(tab)
local file= io.open(SpeicherPfad..pc.get_name(),"w")
file:write("return {")
for i,x in next, tab do
local str = "\n\t["..i.."] = {\n\t\t"
for e,f in next,x do
str = str.."['"..e.."'] = '"..f.."',\n\t\t"
end
local str = str.."\n\t},"
file:write(str)
end
file:write("\n}")
file:close()
end
pc.delff = function(name)
local tab = loadstring(io.open(SpeicherPfad..pc.get_name(),"r"):read("*a"))()
tab[q.getcurrentquestindex()][name]=nil
pc.write_table(tab)
end
pc.setff = function(name,value)
if io.open(SpeicherPfad..pc.get_name(),"r")==nil then
local file= io.open(SpeicherPfad..pc.get_name(),"w")
file:write("return{}")
file:close()
end
local tab = loadstring(io.open(SpeicherPfad..pc.get_name(),"r"):read("*a"))()
if type(value)=="function" then
value = 'loadstring(string.gsub('..string.gsub(string.format('%q',string.dump(value)),"(\\000)","`")..',"`","\\000"))'
elseif type(value)=="table" then
inp = ""
local function dmp(tab)
inp = inp..'{'
table.foreach(tab,function(i,l)
if type(i) == 'string' then
inp = inp..'['..string.format('%q',i)..']='
end
if type(l) == 'string' then
inp = inp..string.format('%q',l)..','
elseif type(l) == 'number' then
inp = inp..l..','
elseif type(l) == 'table' then
dmp(l)
elseif type(l) == 'function' then
inp = inp..'loadstring(string.gsub('..string.gsub(string.format('%q',string.dump(l)),"(\\000)","`")..',"`","\\000")),'
end
end)
inp = inp..'}'
end
dmp(value)
value = inp
inp = nil
end
if not tab[q.getcurrentquestindex()] then
tab[q.getcurrentquestindex()]={}
end
if tab[q.getcurrentquestindex()][name] then
tab[q.getcurrentquestindex()][name]=1
end
tab[q.getcurrentquestindex()][name]=value
pc.write_table(tab)
end
pc.getff = function(name)
local base = loadstring(io.open(SpeicherPfad..pc.get_name(),"r"):read("*a"))()[q.getcurrentquestindex()][name]
return string.find(base,"\000") and assert(loadstring('return '..base))() or
type(assert(loadstring('return '..base))())=="table" and assert(loadstring('return '..base))() or
tonumber(base) or base or 0
end
Ich finde die Methode recht genial, man kann alles speichern was speichern geht, danke.
bei dieser methode
wird mir schon übel weil diese extrem Speicher lastig ist, wie die geschrieben ist. ich erkläre euch mal wieso[...](für quester besser geeignet)
questflags kann man im Normalfall so speichern pc.setqf(name,wert) dabei muss der wert immer eine zahl sein.
wenn man eine Buchstaben speichern möchte, muss man eine alternative suchen, diese kann man mittels ascii werten bewerkstelligen.
hier die Tabelle: http://www.tabelle.info/ascii_zeichen_tabelle.html
jeder Buchstabe, jedes Sonderzeichen hat eine zugehörige ascii zahl. zb. meinen namen Noa, er besteht aus 3 Buchstaben
Buchstabe = Ascii Zahl N = 78 o = 111 a = 97 da wir jetzt wissen das man statt Buchstaben, diese zahlen gespeichert werden können, tut man das in diesen release auch, das Problem ist das für jeden Buchstaben und jedes Sonderzeichen eine flag gespeichert wird. das sieht dann so aus.
somit, hat man allein für 3 Buchstaben 4 flag's gespeichert. jetzt stellt euch mal eine Tabelle vor, wie viele Zeichen die hat, manche haben locker 1000 Zeichen. d.h. also für jedes Zeichen wird eine Ascii zahl zugeordnet und abgespeichert
Keine schlechte Idee die Daten als Source zu speichern... o: bin ich selbst noch nicht drauf gekommen (:
Kann man vorallem gut gebrauchen wenn man nicht den Game-Source benutzt.
pc.write_table = function(tab) local file= io.open(pc.get_name(),"w") file:write("return {") for i,x in next, tab do local str = "\n\t["..i.."] = {\n\t\t" for e,f in next,x do str = str.."['"..e.."'] = [["..f.."]],\n\t\t" end local str = str.."\n\t}," file:write(str) end file:write("\n}") file:close() end pc.delff = function(name) local tab = loadstring(io.open(pc.get_name(),"r"):read("*a"))() tab[q.getcurrentquestindex()][name]=nil pc.write_table(tab) end pc.setff = function(name,value) if io.open(pc.get_name(),"r")==nil then local file= io.open(pc.get_name(),"w") file:write("return{}") file:close() end local tab = loadstring(io.open(pc.get_name(),"r"):read("*a"))() if type(value)=="function" then value = '#function#loadstring(string.gsub('..string.gsub(string.format('%q',string.dump(value)),"(\\000)","`")..',"`","\\000"))' elseif type(value)=="table" then inp = "" local function dmp(tab) inp = inp..'{' table.foreach(tab,function(i,l) if type(i) == 'string' then inp = inp..'['..string.format('%q',i)..']=' end if type(l) == 'string' then inp = inp..string.format('%q',l)..',' elseif type(l) == 'number' then inp = inp..l..',' elseif type(l) == 'table' then dmp(l) elseif type(l) == 'function' then inp = inp..'loadstring(string.gsub('..string.gsub(string.format('%q',string.dump(l)),"(\\000)","`")..',"`","\\000")),' end end) inp = inp..'}' end dmp(value) value = "#table#"..inp inp = nil elseif type(value)=="string" or type(value)=="number" then value = "#"..tostring(type(value)).."#"..value end if not tab[q.getcurrentquestindex()] then tab[q.getcurrentquestindex()]={} end if tab[q.getcurrentquestindex()][name] then tab[q.getcurrentquestindex()][name]=1 end tab[q.getcurrentquestindex()][name]=value pc.write_table(tab) end pc.getff = function(name) local _,_,typ,value = loadstring(io.open(pc.get_name(),"r"):read("*a"))()[q.getcurrentquestindex()][name]:find("#(%S+)#(.+)") if typ=="string" or typ=="number"then return tonumber(value) or tostring(value) else return assert(loadstring('return '..value))() end end
[Release]Metin2 Neue Ladebild/Login/Charaauswahl[Release] 12/21/2012 - Metin2 PServer Guides & Strategies - 57 Replies Moin Alle zusammen
erstmal muss ich euch erst sagen das ich ein anfänger bin bei sachen
Designen usw. deswegen bitte ich darum das keine von euch gleich mit
müll oder so kommt, jeder hat mal neu angefangen :).
Ich habe bis jetzt nur einen Ladebild aber werde mehrere machen
kommt aber drauf an wie es euch gefählt :), kann auch für die
jenigen denn namen von Server reinschreiben, denn das was ich habe
ist nur Test. es werden welche es gebrauchen :)
[FRAGE]Questflags 07/23/2012 - Metin2 Private Server - 2 Replies Hallo liebe Community,
ich hätte da mal eine Frage zu Questflags:
Können die Questflags höher als 1 sein? (Bsp. 83)
MFG