Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Yapan olur ise kanıt aktarırlarsa konuya dahil ederim arkadaşlar
Şimdiden teşekkür ederim iyi forumlar dilerim
Kod:
print('Questlib by Mijago | 22.03.2012') ql = {} col = {} zt = {} proc = {} -- Einstellungen zur Lib: mijago_include_compat = true do -- Zur Nutzung auf Windoof | MySQL funktioniert auf Windoof nicht! local old_print = print if number == nil then number = function(i,l) return math.random(i,l) end end if pc == nil then pc = {} pc.get_name = function() return '-name-' end pc.count_item = function() return 200 end pc.remove_item = function() return end pc.give_item = function(i,l) print('<GiveItem>',i,l) end pc.warp = function(i,l) print('<Warp>',i,l) end pc.warp_local = function(m,x,y) print('<Warp>',m,x,y) end pc.give_item2 = pc.give_item pc.get_map_index = function() return 1 end pc.get_local_y = function() return 200 end pc.get_local_x = function() return 400 end pc.get_empire = function() return 2 end pc.getqf = function() return 222313 end get_time = os.time end if cmdchat == nil then cmdchat = function() old_print('<cmdchat>') end end if wait == nil then wait = function () old_print('<wait>') end end if input == nil then input = function () old_print('<input>'); return 101 end end if say == nil then say = function (...) local st = '' table.foreachi(arg,function(i,l) st = st..l..'\t' end) old_print('<say>',st) end end if chat == nil then chat = function (txt) old_print('<Chat>',txt) end end if notice == nil then notice = function (txt) old_print('<notice>',txt) end end if setbg == nil then setbg = function (txt) old_print('<setbg>',txt) end end if say_size == nil then say_size = function (a,b) old_print('<say_size>',a,b) end end if notice_all == nil then notice_all = function (txt) old_print('<notice_all>',txt) end end if game == nil then game = {} game.set_event_flag = function(a,b) print('<game.set_event_flag>',a,b) end end if select == nil then select = function (...) local st = '' table.foreachi(arg,function(i,l) st = st..l..'\t' end) old_print('<select>',st) return math.random(0,table.getn(arg)) end end end doit = os.execute ql.mysql = { ["user"] = "root", ["pass"] = "", ["ip"] = "localhost", } ------------------------------------------------------------------------------- -- function select2(tab,...) arg.n = nil if type(tab) ~= "table" and type(tab) == 'number' then table.insert(arg,1,tab) tab = arg elseif type(tab) ~= "table" and type(tab) == 'string' then table.insert(arg,1,tab) table.insert(arg,1,8) tab = arg elseif type(tab) == "table" and type(tab[1]) == 'string' then table.insert(tab,1,8) end local max = tab[1]; table.remove(tab,1) local tablen,outputstr,outputcount,nextc,incit = table.getn(tab),"",0,0,0 table.foreach(tab, function(i,l) outputcount = outputcount + 1 if outputcount == 1 then outputstr=outputstr..'sel = select("'..l..'"' elseif outputcount == max and tablen > outputcount+incit then if tablen ~= outputcount+incit+1 then outputstr=outputstr..',"'..l..'","Nächste Seite") + '..incit..' ' if nextc > 0 then outputstr = outputstr..'end ' end outputstr=outputstr..'; if sel == '..(incit+max+1)..' then ' -- Anfangen der neuen Abfrage nextc, outputcount, incit= nextc+1,0,incit+max else outputstr=outputstr..',"'..l..'"' end else outputstr=outputstr..',"'..l..'"' end end ) outputstr = outputstr..') + '..incit if nextc > 0 then outputstr = outputstr..' end' end outputstr= outputstr.. '; return sel' print(outputstr) local sel = assert(loadstring(outputstr))() tablen,outputstr,outputcount,nextc,incit = nil,nil,nil,nil,nil -- Speicher freimachen return sel end function arraytoselect(arr,abbr) local d = 'sel = select(' local i = 0 for i=1,getn(arr),1 do d = d..'\\"'..arr[i]..'\\",' if abbr ~= nil then if i == getn(arr) then d = d..'\\"'..abbr..'\\"' end end end d = d..")\\nreturn sel" return assert(loadstring(d))() end function dostr(str) assert(loadstring(str))() end ------------------------------------------------------------------------------- -- Veränderte Lua-Funktionen do local old_tonumber = tonumber tonumber = function(str) if old_tonumber(str) == nil then return 0,false else return old_tonumber(str),true end end end ------------------------------------------------------------------------------- -- Datenspeicherung function writelog(text,var,file) if var == nil then var = 1 end if var == 1 then local data = io.open('syserr','a+') data:write(os.date()..'::\t'..text.."\n") data:close() elseif var == 2 then local data = io.open('syslog','a+') data:write(os.date()..'::\t'..text.."\n") data:close() elseif var == 3 then local data = io.open(file,'a+') data:write(os.date()..'::\t'..text.."\n") data:close() end end function watch_table(tab) local meta,myname,tabn = {},pc.get_name(),tostring(tab) local lo = function(typ,index,wert) writelog(tabn..' - '..myname..': '..typ..' ['..index..'] = '..wert,3,'tables') end meta.__newindex = function(ta,index,wert) --writelog(tabn..' - '..myname..': Newindex ['..index..'] = '..wert,3,'tables') lo('newindex',index,wert) rawset(ta,index,wert) end meta.__index = function(ta,index,wert) lo('index',index,wert) error('Fehlerhafter Zugriff bei '..index) end meta.__call = function(ta,index,wert) lo('call',index,wert) end setmetatable(tab, meta) end ------------------------------------------------------------------------------- -- account account = account or {} function account.set_pw(pw,ac) if pw == nil then error("Fehler... Passwort muss gesetzt werden!") end if ac == nil then ac = pc.get_account_id() end if type(ac) == "string" then mysql_query("UPDATE player.player,account.account SET account.password = password('"..pw.."') WHERE account.id = player.account_id and player.name = '"..ac.."' LIMIT 1") elseif type(ac) == "number" then mysql_query("UPDATE account.account SET account.password = password('"..pw.."') WHERE account.id = "..ac) end end ------------------------------------------------------------------------------- -- PCI pci = {} function pci:new(name) local out = {} if name == nil then name = pc.get_name() end local info = mysql_query("SELECT * FROM player.player WHERE name = \'"..name.."\' LIMIT 1",ql.mysql["user"],ql.mysql["pass"],ql.mysql["ip"]) local reich = mysql_query("select player_index.empire FROM player.player INNER JOIN player.player_index ON player.account_id = player_index.id WHERE player.name = '"..pc.get_name().."'",ql.mysql["user"],ql.mysql["pass"],ql.mysql["ip"]) out.name = name out.level = info.level[1] out.playtime = info.playtime[1] out.job = info.job[1] out.account_id = info.account_id[1] out.id = info.id[1] out.voice = info.voice[1] out.dir = info.dir[1] out.x = info.x[1] out.y = info.y[1] out.z = info.z[1] out.map_index = info.map_index[1] out.exit_y = info.exit_y[1] out.exit_x = info.exit_x[1] out.exit_map_index = info.exit_map_index[1] out.hp = info.hp[1] out.mp = info.mp[1] out.stamina = info.stamina[1] out.random_hp = info.random_hp[1] out.random_sp = info.random_sp[1] out.level_step = info.level_step[1] out.st = info.st[1] out.ht = info.ht[1] out.dx = info.dx[1] out.iq = info.iq[1] out.exp= info.exp[1] out.gold = info.gold[1] out.stat_point = info.stat_point[1] out.skill_point = info.skill_point[1] out.ip = info.ip[1] out.part_main = info.part_main[1] out.part_hair = info.part_hair[1] out.skill_group = info.skill_group[1] out.last_play = info.last_play[1] out.alignment = info.alignment[1] out.change_name = info.change_name[1] out.sub_skill_point = info.sub_skill_point[1] out.horse_skill_point = info.horse_skill_point[1] out.horse_riding = info.horse_riding[1] out.horse_hp_droptime = info.horse_hp_droptime[1] out.horse_level = info.horse_level[1] out.horse_stamina = info.horse_stamina[1] out.horse_hp = info.horse_hp[1] out.stat_reset_count = info.stat_reset_count[1] out.empire = reich.empire[1] setmetatable(out, { __index = pci }) print('Daten für '..name..' erfolgreich geladen!') return out end function pci:update() local info = mysql_query("SELECT * FROM player.player WHERE name = \'"..self.name.."\' LIMIT 1",ql.mysql["user"],ql.mysql["pass"],ql.mysql["ip"]) self.level = info.level[1] self.playtime = info.playtime[1] self.job = info.job[1] self.account_id = info.account_id[1] self.id = info.id[1] self.voice = info.voice[1] self.dir = info.dir[1] self.x = info.x[1] self.y = info.y[1] self.z = info.z[1] self.map_index = info.map_index[1] self.exit_y = info.exit_y[1] self.exit_x = info.exit_x[1] self.exit_map_index = info.exit_map_index[1] self.hp = info.hp[1] self.mp = info.mp[1] self.stamina = info.stamina[1] self.random_hp = info.random_hp[1] self.random_sp = info.random_sp[1] self.level_step = info.level_step[1] self.st = info.st[1] self.ht = info.ht[1] self.dx = info.dx[1] self.iq = info.iq[1] self.exp= info.exp[1] self.gold = info.gold[1] self.stat_point = info.stat_point[1] self.skill_point = info.skill_point[1] self.ip = info.ip[1] self.part_main = info.part_main[1] self.part_hair = info.part_hair[1] self.skill_group = info.skill_group[1] self.last_play = info.last_play[1] self.alignment = info.alignment[1] self.change_name = info.change_name[1] self.sub_skill_point = info.sub_skill_point[1] self.horse_skill_point = info.horse_skill_point[1] self.horse_riding = info.horse_riding[1] self.horse_hp_droptime = info.horse_hp_droptime[1] self.horse_level = info.horse_level[1] self.horse_stamina = info.horse_stamina[1] self.horse_hp = info.horse_hp[1] self.stat_reset_count = info.stat_reset_count[1] print('Daten für '..self.name..' erfolgreich geupdated!') end ------------------------------------------------------------------------------- -- Strings function rm_nlc(s) return string.gsub(s, "%A", "") end -- alles außer Buchstaben weg function rm_ndc(s) return string.gsub(s, "%D", "") end -- alles außer Zahlen weg function rm_lc(s) return string.gsub(s, "%a", "") end -- alle Buchstaben weg function rm_dc(s) return string.gsub(s, "%d", "") end -- alle Zahlen weg function rm_ucc(s) return string.gsub(s, "%u", "") end -- alle großgeschriebenen Buchstaben weg function rm_lcc(s) return string.gsub(s, "%l", "") end -- alle kleingeschriebenen Buchstaben weg function rm_nanc(s) return string.gsub(s, "%W", "") end -- alle nicht-alphanumerischen Zeichen weg function string.reverse(str) local se = '' for i=1,string.len(str) do se = string.sub(str,i,i)..se end return se end function num_format(num) if type(num) == "number" then num = tostring(num) end if string.len(num) <= 3 then return num end return string.reverse(string.gsub(string.reverse(num),'(%d%d%d)','%1.')) end function wartungsmodus(v) if v == 1 then mysql_query("UPDATE account.account SET account.status = 'SHUTDOWN' WHERE status = 'OK' and account.login NOT IN (SELECT mAccount FROM common.gmlist);") elseif v == 0 then mysql_query("UPDATE account.account SET account.status = 'OK' WHERE status = 'SHUTDOWN' and account.login NOT IN (SELECT mAccount FROM common.gmlist);") end end ------------------------------------------------------------------------------- --[[ iti iti = {} function iti:new(name) -- The constructor local out = {} local info = mysql_query_on("SELECT * FROM player.item WHERE vnum = "..name.." LIMIT 1") out.vnum = tonumber(name) setmetatable(out, { __index = iti }) -- Inheritance print('Daten für Item '..name..' erfolgreich geladen!') return out end --]] ------------------------------------------------------------------------------- -- Say CFG UNFINISHED - In Arbeit! --[[ sayer = {} function sayer:new() local out = {} out.maxlen = 50 out.maxlines = 15 out.lines=0 out.text = 'say("' self.sayopen = 1 setmetatable(out, { __index = sayer }) return out end function sayer:add(txt) if self.lines >= self.maxlines then self.lines = 0 self.text = self.text..'"); wait();' self.sayopen = 0 end if self.sayopen == 0 then self.text = self.text..' say("' self.sayopen = 1 end if self.lines ~= 0 then self.text = self.text ..'[ENTER]' end if string.len(txt) < self.maxlen then self.text = self.text ..txt end self.lines = self.lines+1 end function sayer:send() if self.sayopen == 1 then self.text = self.text..'"); ' self.sayopen = 1 end --assert(loadstring(self.text))() s.out=loadstring(self.text)() print(self.text) end function sayer:wait() if self.sayopen == 1 then self.text = self.text..'"); ' self.sayopen = 0 end self.text = self.text..' wait();' self.sayopen = 0 self.lines=0 end function sayer:input() if self.sayopen == 1 then self.text = self.text..'"); ' self.sayopen = 0 end self.text = self.text..'input();' self.sayopen = 0 self.lines=0 end function sayer:select(tab) if self.sayopen == 1 then self.text = self.text..'"); ' self.sayopen = 0 end local un = "'"..join("','",tab).."'" self.text = self.text..'select('..un..');' self.sayopen = 0 self.lines=0 end function sayer:clear() self.maxlen = 50 self.maxlines = 6 self.lines=0 self.text = 'say("' self.sayopen = 1 end --]] ------------------------------------------------------------------------------- -- MYSQL - FUNKTIONEN -- Einzelbefehle function mysql_escape(str) str = string.gsub(str,"%\\", "\\\\") -- str = string.gsub(str,"%\0", "\\0") Gibt einen fehler aus :o | Wer rausfindet, warum.. Bitte mir Schreiben (Mijago) str = string.gsub(str,"%\n", "\\n") str = string.gsub(str,"%\r", "\\r") str = string.gsub(str,"%\x1a", "\Z") str = string.gsub(str,"%\'", "\\'") str = string.gsub(str,'%\"', '\\"') return str end function backup_files() -- Backuppt den Share-Ordner local now = os.date('%d-%m-%Y_%H:%M:%S') -- Aus absicht einzelne Zeilen! (Zur besseren Kommentierung und dass nicht ein Fehler alle Scripts behindert) os.execute('mkdir /backup/ && mkdir /backup/share') -- Ordner erstellen, falls nicht vorhanden os.execute('tar -cvzf ./locale/ /backup/share/'..now..'_locale.tar.gz') -- Packen os.execute('tar -cvzf ./data/ /backup/share/'..now..'_data.tar.gz') -- Packen end function backup_main() -- Backuppt die Hauptdatenbanken local now = os.date('%d-%m-%Y_%H:%M:%S') -- Aus absicht einzelne Zeilen! (Zur besseren Kommentierung und dass nicht ein Fehler alle Scripts behindert) os.execute('mkdir /backup/ && mkdir /backup/main') -- Ordner erstellen, falls nicht vorhanden os.execute('mkdir /backup/main/'..now) -- Ordner für das Backup erstellen os.execute('mkdir /backup/main/'..now..'/player/') -- Player-DB vorbereiten os.execute('mkdir /backup/main/'..now..'/account/') -- Account-DB vorbereiten os.execute('cp /var/db/mysql/player/player* /backup/main/'..now..'/player/') -- Player DBs Kopieren os.execute('cp /var/db/mysql/player/quest.* /backup/main/'..now..'/player/') -- Quest DB Kopieren os.execute('cp /var/db/mysql/player/guild* /backup/main/'..now..'/player/') -- Guild DBs Kopieren os.execute('cp /var/db/mysql/account/account.* /backup/main/'..now..'/account/') -- Guild DBs Kopieren os.execute('tar -cvzf /backup/main/'..now..'/ /backup/main/'..now..'.tar.gz') -- Packen os.execute('rm -R /backup/main/'..now..'/') -- Daten wieder löschen end function backup() -- Backuppt alle Datenbanken local now = os.date('%d-%m-%Y_%H:%M:%S') -- Aus absicht einzelne Zeilen! (Zur besseren Kommentierung und dass nicht ein Fehler alle Scripts behindert) os.execute('mkdir /backup/ && mkdir /backup/all') -- Ordner erstellen, falls nicht vorhanden os.execute('mkdir /backup/all/'..now) -- Ordner für das Backup erstellen os.execute('tar -cvzf /var/db/mysql/ /backup/all/'..now..'.tar.gz') -- Packen end mysql_query = function(query) if not pre then local rt = io.open('CONFIG','r'):read('*all') pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4') end math.randomseed(os.time()) local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{} os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi); for i = 2, table.getn(t) do table.foreach(t[i],function(a,b) out[i-1] = out[i-1] or {} out[i-1][a] = tonumber(b) or b or 'NULL' out[t[1][a]] = out[t[1][a]] or {} out[t[1][a]][i-1] = tonumber(b) or b or 'NULL' end) end out.__lines = t[1] return out end mysql_query10 = function(query) if not pre then local rt = io.open('CONFIG','r'):read('*all') pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4') end math.randomseed(os.time()) local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{} os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi); for i = 2, table.getn(t) do table.foreach(t[i],function(a,b) out[i-1] = out[i-1] or {} out[i-1][a] = tostring(b) or b or 'NULL' out[t[1][a]] = out[t[1][a]] or {} out[t[1][a]][i-1] = tostring(b) or b or 'NULL' end) end out.__lines = t[1] return out end -- Für mehrere CFG's mysql = {} function mysql:connect(ip,user,passwd,db) local out = {} out.ip = ip out.user = user out.pass = passwd if db == nil then db = 'player' end out.db = db out.querycount = 0 out.querylist = {} out.ql = {} setmetatable(out, { __index = mysql }) return out end function mysql:query(query) self.lastquery = mysql_query(query,self.user,self.pass,self.db,self.ip) self.lq = self.lastquery self.querycount = self.querycount +1 self.querylist[self.querycount] = self.lq self.ql = self.querylist return self.lastquery, self.querycount end function mysql:setcfg(ip,user,pass,db) if ip ~= nil then self.ip = ip end if user ~= nil then self.user = user end if pass ~= nil then self.pass = pass end self.db = db end ------------------------------------------------------------------------------- -- FARBCODES col.list= { { 'lightcoral', 240,128,128 },{ 'rosybrown', 188,143,143 }, { 'indianred', 205,92,92 },{ 'red', 255,0,0 },{ 'firebrick', 178,34,34 },{ 'brown', 165,42,42 }, { 'darkred', 139,0,0 },{ 'maroon', 128,0,0 },{ 'mistyrose', 255,228,225 },{ 'salmon', 250,128,114 }, { 'tomato', 255,99,71 },{ 'darksalmon', 233,150,122 },{ 'coral', 255,127,80 },{ 'orangered', 255,69,0 }, { 'lightsalmon', 255,160,122 },{ 'sienna', 160,82,45 },{ 'seashell', 255,245,238 },{ 'chocolate', 210,105,30 }, { 'saddlebrown', 139,69,19 },{ 'sandybrown', 244,164,96 },{ 'peachpuff', 255,218,185 },{ 'peru', 205,133,63 }, { 'linen', 250,240,230 },{ 'bisque', 255,228,196 },{ 'darkorange', 255,140,0 },{ 'burlywood', 222,184,135 }, { 'antiquewhite', 250,235,215 },{ 'tan', 210,180,140 },{ 'navajowhite', 255,222,173 },{ 'blanchedalmond', 255,235,205 }, { 'papayawhip', 255,239,213 },{ 'moccasin', 255,228,181 },{ 'orange', 255,165,0 },{ 'wheat', 245,222,179 }, { 'oldlace', 253,245,230 },{ 'floralwhite', 255,250,240 },{ 'darkgoldenrod', 184,134,11 },{ 'goldenrod', 218,165,32 }, { 'cornsilk', 255,248,220 },{ 'gold', 255,215,0 },{ 'lemonchiffon', 255,250,205 },{ 'khaki', 240,230,140 }, { 'palegoldenrod', 238,232,170 },{ 'darkkhaki', 189,183,107 },{ 'ivory', 255,255,240 },{ 'lightyellow', 255,255,224 }, { 'beige', 245,245,220 },{ 'lightgoldenrodyellow', 250,250,210 },{ 'yellow', 255,255,0 },{ 'olive', 128,128,0 }, { 'olivedrab', 107,142,35 },{ 'yellowgreen', 154,205,50 },{ 'darkolivegreen', 85,107,47 },{ 'greenyellow', 173,255,47 }, { 'chartreuse', 127,255,0 },{ 'lawngreen', 124,252,0 },{ 'darkseagreen', 143,188,139 },{ 'honeydew', 240,255,240 }, { 'palegreen', 152,251,152 },{ 'lightgreen', 144,238,144 },{ 'lime', 0,255,0 },{ 'limegreen', 50,205,50 }, { 'forestgreen', 34,139,34 },{ 'green', 0,128,0 },{ 'darkgreen', 0,100,0 },{ 'seagreen', 46,139,87 }, { 'mediumseagreen', 60,179,113 },{ 'springgreen', 0,255,127 },{ 'mintcream', 245,255,250 },{ 'mediumspringgreen', 0,250,154 }, { 'mediumaquamarine', 102,205,170 },{ 'aquamarine', 127,255,212 },{ 'turquoise', 64,224,208 },{ 'lightseagreen', 32,178,170 }, { 'mediumturquoise', 72,209,204 },{ 'azure', 240,255,255 },{ 'lightcyan', 224,255,255 },{ 'paleturquoise', 175,238,238 }, { 'aqua', 0,255,255 },{ 'cyan', 0,255,255 },{ 'darkcyan', 0,139,139 },{ 'teal', 0,128,128 }, { 'darkslategray', 47,79,79 },{ 'darkturquoise', 0,206,209 },{ 'cadetblue', 95,158,160 },{ 'powderblue', 176,224,230 }, { 'lightblue', 173,216,230 },{ 'deepskyblue', 0,191,255 },{ 'skyblue', 135,206,235 },{ 'lightskyblue', 135,206,250 }, { 'steelblue', 70,130,180 },{ 'aliceblue', 240,248,255 },{ 'dodgerblue', 30,144,255 },{ 'lightslategray', 119,136,153 }, { 'slategray', 112,128,144 },{ 'lightsteelblue', 176,196,222 },{ 'cornflowerblue', 100,149,237 },{ 'royalblue', 65,105,225 }, { 'ghostwhite', 248,248,255 },{ 'lavender', 230,230,250 },{ 'blue', 0,0,255 },{ 'mediumblue', 0,0,205 }, { 'darkblue', 0,0,139 },{ 'midnightblue', 25,25,112 },{ 'navy', 0,0,128 },{ 'slateblue', 106,90,205 }, { 'darkslateblue', 72,61,139 },{ 'mediumslateblue', 123,104,238 },{ 'mediumpurple', 147,112,219 },{ 'blueviolet', 138,43,226 }, { 'indigo', 75,0,130 },{ 'darkorchid', 153,50,204 },{ 'darkviolet', 148,0,211 },{ 'mediumorchid', 186,85,211 }, { 'thistle', 216,191,216 },{ 'plum', 221,160,221 },{ 'violet', 238,130,238 },{ 'fuchsia', 255,0,255 }, { 'magenta', 255,0,255 },{ 'darkmagenta', 139,0,139 },{ 'purple', 128,0,128 },{ 'orchid', 218,112,214 }, { 'mediumvioletred', 199,21,133 },{ 'deeppink', 255,20,147 },{ 'hotpink', 255,105,180 },{ 'lavenderblush', 255,240,245 }, { 'palevioletred', 219,112,147 },{ 'crimson', 220,20,60 },{ 'pink', 255,192,203 },{ 'lightpink', 255,182,193 }, { 'white', 255,255,255 },{ 'snow', 255,250,250 },{ 'whitesmoke', 245,245,245 },{ 'gainsboro', 220,220,220 }, { 'lightgray', 211,211,211 },{ 'silver', 192,192,192 },{ 'darkgray', 169,169,169 },{ 'gray', 128,128,128 }, { 'dimgray', 105,105,105 },{ 'black', 0,0,0 },{ 'aliceblue', 240,248,255 },{ 'antiquewhite', 250,235,215 }, { 'aqua', 0,255,255 },{ 'aquamarine', 127,255,212 },{ 'azure', 240,255,255 },{ 'beige', 245,245,220 }, { 'bisque', 255,228,196 },{ 'black', 0,0,0 },{ 'blanchedalmond', 255,235,205 },{ 'blue', 0,0,255 }, { 'blueviolet', 138,43,226 },{ 'brown', 165,42,42 },{ 'burlywood', 222,184,135 },{ 'cadetblue', 95,158,160 }, { 'chartreuse', 127,255,0 },{ 'chocolate', 210,105,30 },{ 'coral', 255,127,80 },{ 'cornflowerblue', 100,149,237 }, { 'cornsilk', 255,248,220 },{ 'crimson', 220,20,60 },{ 'cyan', 0,255,255 },{ 'darkblue', 0,0,139 }, { 'darkcyan', 0,139,139 },{ 'darkgoldenrod', 184,134,11 },{ 'darkgray', 169,169,169 },{ 'darkgreen', 0,100,0 }, { 'darkkhaki', 189,183,107 },{ 'darkmagenta', 139,0,139 },{ 'darkolivegreen', 85,107,47 },{ 'darkorange', 255,140,0 }, { 'darkorchid', 153,50,204 },{ 'darkred', 139,0,0 },{ 'darksalmon', 233,150,122 },{ 'darkseagreen', 143,188,139 }, { 'darkslateblue', 72,61,139 },{ 'darkslategray', 47,79,79 },{ 'darkturquoise', 0,206,209 },{ 'darkviolet', 148,0,211 }, { 'deeppink', 255,20,147 },{ 'deepskyblue', 0,191,255 },{ 'dimgray', 105,105,105 },{ 'dodgerblue', 30,144,255 }, { 'firebrick', 178,34,34 },{ 'floralwhite', 255,250,240 },{ 'forestgreen', 34,139,34 },{ 'fuchsia', 255,0,255 }, { 'gainsboro', 220,220,220 },{ 'ghostwhite', 248,248,255 },{ 'gold', 255,215,0 },{ 'goldenrod', 218,165,32 }, { 'gray', 128,128,128 },{ 'green', 0,128,0 },{ 'greenyellow', 173,255,47 },{ 'honeydew', 240,255,240 }, { 'hotpink', 255,105,180 },{ 'indianred', 205,92,92 },{ 'indigo', 75,0,130 },{ 'ivory', 255,255,240 }, { 'khaki', 240,230,140 },{ 'lavender', 230,230,250 },{ 'lavenderblush', 255,240,245 },{ 'lawngreen', 124,252,0 }, { 'lemonchiffon', 255,250,205 },{ 'lightblue', 173,216,230 },{ 'lightcoral', 240,128,128 },{ 'lightcyan', 224,255,255 }, { 'lightgoldenrodyellow', 250,250,210 },{ 'lightgray', 211,211,211 },{ 'lightgreen', 144,238,144 },{ 'lightpink', 255,182,193 }, { 'lightsalmon', 255,160,122 },{ 'lightseagreen', 32,178,170 },{ 'lightskyblue', 135,206,250 },{ 'lightslategray', 119,136,153 }, { 'lightsteelblue', 176,196,222 },{ 'lightyellow', 255,255,224 },{ 'lime', 0,255,0 },{ 'limegreen', 50,205,50 }, { 'linen', 250,240,230 },{ 'magenta', 255,0,255 },{ 'maroon', 128,0,0 },{ 'mediumaquamarine', 102,205,170 }, { 'mediumblue', 0,0,205 },{ 'mediumorchid', 186,85,211 },{ 'mediumpurple', 147,112,219 },{ 'mediumseagreen', 60,179,113 }, { 'mediumslateblue', 123,104,238 },{ 'mediumspringgreen', 0,250,154 },{ 'mediumturquoise', 72,209,204 },{ 'mediumvioletred', 199,21,133 }, { 'midnightblue', 25,25,112 },{ 'mintcream', 245,255,250 },{ 'mistyrose', 255,228,225 },{ 'moccasin', 255,228,181 }, { 'navajowhite', 255,222,173 },{ 'navy', 0,0,128 },{ 'oldlace', 253,245,230 },{ 'olive', 128,128,0 }, { 'olivedrab', 107,142,35 },{ 'orange', 255,165,0 },{ 'orangered', 255,69,0 },{ 'orchid', 218,112,214 }, { 'palegoldenrod', 238,232,170 },{ 'palegreen', 152,251,152 },{ 'paleturquoise', 175,238,238 },{ 'palevioletred', 219,112,147 }, { 'papayawhip', 255,239,213 },{ 'peachpuff', 255,218,185 },{ 'peru', 205,133,63 },{ 'pink', 255,192,203 }, { 'plum', 221,160,221 },{ 'powderblue', 176,224,230 },{ 'purple', 128,0,128 },{ 'red', 255,0,0 }, { 'rosybrown', 188,143,143 },{ 'royalblue', 65,105,225 },{ 'saddlebrown', 139,69,19 },{ 'salmon', 250,128,114 }, { 'sandybrown', 244,164,96 },{ 'seagreen', 46,139,87 },{ 'seashell', 255,245,238 },{ 'sienna', 160,82,45 }, { 'silver', 192,192,192 },{ 'skyblue', 135,206,235 },{ 'slateblue', 106,90,205 },{ 'slategray', 112,128,144 }, { 'snow', 255,250,250 },{ 'springgreen', 0,255,127 },{ 'steelblue', 70,130,180 },{ 'tan', 210,180,140 }, { 'teal', 0,128,128 },{ 'thistle', 216,191,216 },{ 'tomato', 255,99,71 },{ 'turquoise', 64,224,208 }, { 'violet', 238,130,238 },{ 'wheat', 245,222,179 },{ 'white', 255,255,255 },{ 'whitesmoke', 245,245,245 }, { 'yellow', 255,255,0 },{ 'yellowgreen', 154,205,50 }} table.foreachi(col.list,function(a,b) col[b[1]] = function(text) return "[COLOR r;"..(b[2]/255.0).."|g;"..(b[3]/255.0).."|b;"..(b[4]/255.0).."]"..text..'[/COLOR]' end end) ------------------------------------------------------------------------------- -- ZEIT - FUNKTIONEN --- Tage zt.d_j = function(d) return d/365 end zt.d_mo = function(d) return d/12 end zt.d_h = function(d) return d*24 end zt.d_m = function(d) return d*24*60 end zt.d_s = function(d) return d*24*60*60 end zt.d_hs = function(d) return d*24*60*60*100 end zt.d_ms = function(d) return d*24*60*60*1000 end --- Stunden zt.h_j = function(h) return h/24/365 end zt.h_mo = function(h) return h/24/12 end zt.h_d = function(h) return h/24 end zt.h_m = function(h) return h*60 end zt.h_s = function(h) return h*60*60 end zt.h_hs = function(h) return h*60*60*100 end zt.h_ms = function(h) return h*60*60*1000 end --- Minuten zt.m_j = function(m) return m/60/24/365 end zt.m_mo = function(m) return m/60/24/12 end zt.m_d = function(m) return m/60/24 end zt.m_h = function(m) return m/60 end zt.m_s = function(m) return m*60 end zt.m_hs = function(m) return m*60*100 end zt.m_ms = function(m) return m*60*1000 end --- Sekunden zt.s_j = function(s) return s/60/60/24/365 end zt.s_mo = function(s) return s/60/60/24/12 end zt.s_d = function(s) return s/60/60/24 end zt.s_h = function(s) return s/60/60 end zt.s_m = function(s) return s/60 end zt.s_hs = function(s) return s*100 end zt.s_ms = function(s) return s*1000 end ------------------------------------------------------------------------------- -- PC - Funktionen function local_pc_warp(name, x, y,mid) local target = find_pc_by_name(name) local t = pc.select(target) if mid == nil then mid = pc.get_map_index() end pc.warp_local(mid, x*100, y*100) pc.select(t) end function pc.warp_to(vid) if vid == nil then error"VID muss gesetzt sein! (pc.warp_to)" elseif type(vid) == "string" then vid = find_pc_by_name(vid) if vid == 0 then error"Spieler nicht gefunden" end end local me = pc.select(vid) local x,y = pc.get_x()*100,pc.get_y()*100 pc.select(me) pc.warp(x,y) end function pc.trans(vid) if vid == nil then error"VID muss gesetzt sein! (pc.warp_to)" elseif type(vid) == "string" then vid = find_pc_by_name(vid) if vid == 0 then error"Spieler nicht gefunden" end end local x,y = pc.get_x()*100,pc.get_y()*100 local me = pc.select(vid) pc.warp(x,y) pc.select(me) end function local_pc_setqf(name, qf,wert) -- Für die aktuelle Quest local target = find_pc_by_name(name) local t = pc.select(target) pc.setqf(qf,wert) pc.select(t) end function do_for_other(name,ding) local t = pc.select(find_pc_by_name(name)) assert(loadstring(ding))() pc.select(t) end function pc.check_inventory_place(size) if size <= 0 or size > 3 then return -1 end function check(c) for i = 0,size-1 do item.select_cell(e[c+(5*i)]) if item.get_id() ~= 0 then return false end end return true end for i = 0,89 do if check(i) then return i end end return -1 end ------------------------------------------------------------------------------- -- ALLGEMEINE FUNKTIONEN function dot(x)-- Führt alles zwischen $ $ aus. Verschachtelungen nicht in einem Aufruf möglich. return string.gsub(x, "%$(.-)%$", function (s) return loadstring(s)() end) end function download(url) os.execute("cd data && fetch "..url.." && cd ..") end ql.test = function() print('Die Lib Funktioniert!') chat('Die Lib Funktioniert!') end ql.about = function() print('Diese Lib wurde von Mijago programmiert.') chat('Diese Lib wurde von Mijago programmiert.') end function note(text) notice_all('|>~ '..text) end function split(str, delim, maxNb) if str == nil then return str end if string.find(str, delim) == nil then return { str } end if maxNb == nil or maxNb < 1 then maxNb = 0 end local result = {} local pat = "(.-)" .. delim .. "()" local nb = 0 local lastPos for part, pos in string.gfind(str, pat) do nb = nb + 1 result[nb] = part lastPos = pos if nb == maxNb then break end end if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end return result end function getn(list) local i = 0 table.foreachi(list, function(a,b) i = i+1 end) return i end function join(delimiter, list) local len = getn(list) if len == 0 then return "" end local string = list[1] for i = 2, len do string = string .. delimiter .. list[i] end return string end function is_table(var) if (type(var) == "table") then return true else return false end end function is_number(var) if (type(var) == "number") then return true else return false end end function is_string(var) if (type(var) == "string") then return true else return false end end function in_table ( e, t ) for _,v in pairs(t) do if (v==e) then return true end end return false end function in_text(str,te) for i = 0,string.len(str) do if string.sub(str, i,i+string.len(te)-1) == te then return i end end return -1 end function machweg(str,weg) while in_text(str,weg) == true do for i = 0,string.len(str) do if string.sub(str, i,i+string.len(weg)-1) == weg then str = string.sub(str,0,i-1)..string.sub(str,i+string.len(weg),string.len(str)) end end end return str end -- string.gsub(str,weg,'') reicht auch xD function numlen(num) return string.len(tostring(num)) end function delay_s(delay) delay = delay or 1 local time_to = os.time() + delay while os.time() < time_to do end end function distance(x1,y1,x2,y2) dx=x2-x1 dy=y2-y1 dist=math.sqrt(math.pow(dx,2)+math.pow(dy,2)) return dist end function makereadonly(t) -- the metatable local mt = { __index = t, __newindex = function(t, k, v) error("trying to modify constant field " .. tostring(k), 2) end } return setmetatable({}, mt) end function allwords () local line = io.read() local pos = 1 return function() while line do local s, e = string.find(line, "%w+", pos) if s then pos = e + 1 return string.sub(line, s, e) else line = io.read() pos = 1 end end return nil end end function case(wert,...) arg.n = nil for _,b in arg do if b[1] == wert or b[1] == nil then return b[2]() end end end function is(n, f) return {n, f} end function def(f) return {nil, f} end ------------------------------------------------------------------------------- -- Iniparser & -writer do -- Funktionen: -- var = ini.new() -- var = ini.open(path) -- var:write_str(sub,name,wert) -- var:write_int(sub,name,wert) -- var:write_bool(sub,name,boolean) -- var:clear() -- var:read_str(sub,name,norm) -- Gibt einen String zurück. -| -- var:read_int(sub,name,norm) -- Gibt eine zahl zurück -| norm wird zurückgegeben, wenn sub[name] nicht existiert. -- var:read_bool(sub,name,norm) -- Gibt true / False zurück -| -- var:delete_key(sub,nm) -- var:delete_section(sub) local ini_f = {} ini = {} function ini_f:append(sub,nm,wert) if nm == '' or nm == nil then return end self:parse() if self.sub[sub] == nil then self.sub[sub] = {} end self.sub[sub][nm] = wert self:writeit() end function ini_f:write_str(sub,nm,wert) self:append(sub,nm,wert) end function ini_f:write_int(sub,nm,wert) self:append(sub,nm,wert) end function ini_f:write_bool(sub,nm,bool) if not type(bool) == "boolean" then return end local bin = 0 if bool == true then bin = 1 end self:append(sub,nm,bin) return bin end function ini_f:clear() self.sub = {} self.path = '' end function ini_f:writeit() local out = '' table.foreach(self.sub, function(i,l) out = out..'['..i..']\n' table.foreach(l, function(i2,l2) out=out..i2..'='..l2..'\n' end ) end ) local d = io.open(self.path,'w') d:write(out) d:close() end function ini_f:delete_key(sub,nm) if sub == '' or nm == '' or sub == nil or nm == nil then return end self:parse() self.sub[sub][nm] = nil self:writeit() end function ini_f:delete_section(sub) if sub == '' or sub == nil then return end self:parse() self.sub[sub]= nil self:writeit() end function ini_f:parse() self.sub = {} if self.path == '' or self.path == nil then return end local d,i = io.open(self.path,"r"),'non' if d == nil then d = io.open(self.path,"w") end for line in d:lines() do if string.sub(line,1,1) == "[" then i = string.sub(line,2,string.len(line)-1) self.sub[i] = {} else local inp = split(line,'=') self.sub[i][inp[1]] = inp[2] end end d:close() end function ini_f:read_str(sub,nm,norm) if sub == '' or nm == '' or sub == nil or nm == nil then return end self:parse() if self.sub[sub] == nil then return norm end if self.sub[sub][nm] == nil then return norm else return self.sub[sub][nm] end end function ini_f:read_int(sub,nm,norm) if sub == '' or nm == '' or sub == nil or nm == nil then return end self:parse() if self.sub[sub] == nil then return norm end if self.sub[sub][nm] == nil then return norm else return tonumber(self.sub[sub][nm]) end end function ini_f:read_bool(sub,nm,norm) -- Norm wird zurückgegeben, wenn der Key nm nicht existiert if sub == '' or nm == '' or sub == nil or nm == nil then return end self:parse() if self.sub[sub] == nil then return norm end if self.sub[sub][nm] == nil then return norm end if self.sub[sub][nm] == "1" then return true else return false end end function ini_f:open(path) self.path = path self:parse() end function ini.new() local out = {} out.path = '' out.sub = {} setmetatable(out, { __index = ini_f }) return out end function ini.open(path) local dat = ini.new() dat:clear() dat.path=path dat:open(path) return dat end end ------------------------------------------------------------------------------- -- Programmsteuerung proc.apache_start = function() os.execute('apachectl start') end proc.apache_stop = function() os.execute('apachectl stop') end proc.apache_restart = function() os.execute('apachectl restart') end proc.apache_graceful = function() os.execute('apachectl graceful') end proc.ts3_start = function(path) os.execute('cd '..path..' && sh ts3server_startscript.sh start') end proc.ts3_stop = function(path) os.execute('cd '..path..' && sh ts3server_startscript.sh stop') end proc.ts3_restart = function(path) os.execute('cd '..path..' && sh ts3server_startscript.sh restart') end ------------------------------------------------------------------------------- --[[ Funktionsliste download(url) -> lädt die Datei in den Data-Ordner ql.test() -> gibt einen Teststring aus. (Zum testen, ob die Lib funktionert) ql.about() -> Gibt Informationen über das Script aus col.[FARBNAME] -> Gibt Text in say() farbig aus. Englische Farbnamen! (Beinhaltet 281 Farben) [String] note(text) -> Entspricht notice_all('|>~ TEXT') local_pc_setqf(name,qf,wert) -> Setzt bei einem Anderen Spieler eine Quest-flag local_pc_warp(name, x, y,mid) -> Teleportiert den Spieler NAME an die Kooridinaten x & y auf der Map mit dem index mid. mid kann auch leer bleiben do_for_other(name,dot) -> Führt die Befehle in dot für den Spieler name aus. Mit ; trennen writelog(text,var,file) -> Füllt die Logs. 1 = syserr, 2 = syslog, 3 = "file" doit(cmd) -> Führt einen FreeBSD Befehl aus (auch Befehlsketten mit &&) --- Spezielle pci:new(name) -> erstellt auf der genutzten Variable (zb pt = pci:new('[SA]Mijago') ) eine Liste mit allen Info's über den Spieler (alle Spalten aus player.player) pci:update -> updatet die mit pci:new erstellte Variable select2(tab) -> Sortiert eine Tabelle in Selects; auf Seiten aufgeteilt. Der erste Tabelleneintrag muss eine Zahl sein; Sie gibt die maximale Anzahl der Select-Einträg / Seite an. --- MySQL mysql_query(query,user,pw,db,ip) -> wie php mysql_query (gibt es auch so aus: out.id[1] = 7754 zB) mysql_query2(query,user,pw,db,ip) -> NUR für Query's wie Update, Insert etc. mysql_escape(str) -> Equivalent mit dem aus PHP bekannten mysql_escape_real_string backup() -> Backuppt alle MySQL-Datenbanken backup_main() -> Backuppt die wichtigsten MySQL-Datenbanken backup_files() -> Backuppt den Share - Ordner --- Lua-erweiterung watch_table(tab) -> Schreibt alle Änderungen an der Tabelle in eine Datei. arraytoselect(array,abbr) -> erstellt aus einem Array eine Select()-Abfrage und gibt deren Auswahl zurück. Wenn "abbr" gesetzt ist, fügt die Funktion einen eintrag mit dem Wert von "abbr" ein. is_table(var) -> Prüft, ob eine Variable eine Tabelle ist [boolean] is_string(var) -> Prüft, ob eine Variable ein String ist [boolean] is_number(var) -> Prüft, ob eine Variable eine Zahl ist [boolean] in_table(e,t) -> Prüft, ob e in dem Array t vorhanden ist. [boolean] in_table(str,te) -> Prüft, ob te in dem string str vorhanden ist. [boolean] machweg(str,weg) -> Entfernt alle 'weg' aus 'str' [string] split(str, delim, maxNb) -> Teilt den Text 'str' mit dem Delimenter 'delim' auf (in maximal 'maxNb' Teile). maxNb kann leer gelassen werden. [Array] join(delimiter, list) -> Gegenteil von Split. List ist ein Array. Bsp: s = join('|',{'a','b'}) -> s = 'a|b' getn(array) -> Gibt die Anzahl der Einträge eines Array's aus. [Integer] delay_s(delay) -> Scriptpause für -delay- Sekunden numlen(num) -> gibt die Anzahl der Ziffern in der Zahl num an [Integer] distance(x1,y1,x2,y2) -> Distanz zwischen 2 Punkten [Integer] makereadonly(t) -> Sperrt die Tabelle (ReadOnly) allwords() -> Liest alle Wörter aus einer Datei und gibt sie zurück. Vorher io.open! --- Zeitrechnungen zt.d_j(d) -> Tage zu Jahre zt.d_mo(d) -> Tage zu Monate zt.d_h(d) -> Tage zu Stunden zt.d_m(d) -> Tage zu Minuten zt.d_s(d) -> Tage zu Sekunden zt.d_hs(d) -> Tage zu Hunderstelsekunden zt.d_ms(d) -> Tage zu Millisekunden zt.h_j(h) -> Stunden zu Jahre zt.h_mo(h) -> Stunden zu Monate zt.h_d(h) -> Stunden zu Tage zt.h_m(h) -> Stunden zu Minuten zt.h_s(h) -> Stunden zu Sekunden zt.h_hs(h) -> Stunden zu Hunderstelsekundne zt.h_ms(h) -> Stunden zu Millisekunden zt.m_j(m) -> Minuten zu Jahre zt.m_mo(m) -> Minuten zu Monate zt.m_d(m) -> Minuten zu Tage zt.m_h(m) -> Minuten zu Stunden zt.m_s(m) -> Minuten zu Sekunden zt.m_hs(m) -> Minuten zu Hunderstelsekunden zt.m_ms(m) -> Minuten zu Millisekunden zt.s_j(s) -> Sekunden zu Jahre zt.s_mo(s) -> Sekunden zu Monate zt.s_d(s) -> Sekunden zu Tage zt.s_h(s) -> Sekunden zu Stunden zt.s_m(s) -> Sekunden zu Minuten zt.s_hs(s) -> Sekunden zu Hunderstelsekunden zt.s_ms(s) -> Sekunden zu Millisekunden --- Programmbasierende Befehle proc.apache_start() -> Startet Apache proc.apache_stop() -> Stoppt Apache proc.apache_restart() -> Startet Apache neu proc.apache_graceful() -> Startet Apache neu, ohne vorhandene Verbindungen zu kappen proc.ts3_start(path) -> Startet den Teamspeak3 Server im Pfad 'path' proc.ts3_stop(path) -> Startet den Teamspeak3 Server im Pfad 'path' neu proc.ts3_restart(path) -> Stopp den Teamspeak3 Server im Pfad 'path' --]] makereadonly(col) makereadonly(zt) makereadonly(proc) makereadonly(ql) -- Compat 5.1 Release 5 Einbindung if mijago_include_compat then -- -- Compat-5.1 -- Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat) -- According to Lua 5.1 -- $Id: compat-5.1.lua,v 1.22 2006/02/20 21:12:47 carregal Exp $ -- _COMPAT51 = "Compat-5.1 R5" local LUA_DIRSEP = '/' local LUA_OFSEP = '_' local OLD_LUA_OFSEP = '' local POF = 'luaopen_' local LUA_PATH_MARK = '?' local LUA_IGMARK = ':' local assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type = assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub -- -- avoid overwriting the package table if it's already there -- package = package or {} local _PACKAGE = package package.path = LUA_PATH or os.getenv("LUA_PATH") or ("./?.lua;" .. "./pack/?.lua;" .. "/usr/local/share/lua/5.0/?.lua;" .. "/usr/local/share/lua/5.0/?/?.lua;" .. "/usr/local/share/lua/5.0/?/init.lua" ) package.cpath = LUA_CPATH or os.getenv("LUA_CPATH") or "./?.so;" .. "./pack/?.so;" .. "./l?.so;" .. "/usr/local/lib/lua/5.0/?.so;" .. "/usr/local/lib/lua/5.0/l?.so" -- -- make sure require works with standard libraries -- package.loaded = package.loaded or {} package.loaded.debug = debug package.loaded.string = string package.loaded.math = math package.loaded.io = io package.loaded.os = os package.loaded.table = table package.loaded.base = _G package.loaded.coroutine = coroutine local _LOADED = package.loaded -- -- avoid overwriting the package.preload table if it's already there -- package.preload = package.preload or {} local _PRELOAD = package.preload -- -- looks for a file `name' in given path -- local function findfile (name, pname) name = gsub (name, "%.", LUA_DIRSEP) local path = _PACKAGE[pname] assert (type(path) == "string", format ("package.%s must be a string", pname)) for c in gfind (path, "[^;]+") do c = gsub (c, "%"..LUA_PATH_MARK, name) local f = io.open (c) if f then f:close () return c end end return nil -- not found end -- -- check whether library is already loaded -- local function loader_preload (name) assert (type(name) == "string", format ( "bad argument #1 to `require' (string expected, got %s)", type(name))) assert (type(_PRELOAD) == "table", "`package.preload' must be a table") return _PRELOAD[name] end -- -- Lua library loader -- local function loader_Lua (name) assert (type(name) == "string", format ( "bad argument #1 to `require' (string expected, got %s)", type(name))) local filename = findfile (name, "path") if not filename then return false end local f, err = loadfile (filename) if not f then error (format ("error loading module `%s' (%s)", name, err)) end return f end local function mkfuncname (name) name = gsub (name, "^.*%"..LUA_IGMARK, "") name = gsub (name, "%.", LUA_OFSEP) return POF..name end local function old_mkfuncname (name) --name = gsub (name, "^.*%"..LUA_IGMARK, "") name = gsub (name, "%.", OLD_LUA_OFSEP) return POF..name end -- -- C library loader -- local function loader_C (name) assert (type(name) == "string", format ( "bad argument #1 to `require' (string expected, got %s)", type(name))) local filename = findfile (name, "cpath") if not filename then return false end local funcname = mkfuncname (name) local f, err = loadlib (filename, funcname) if not f then funcname = old_mkfuncname (name) f, err = loadlib (filename, funcname) if not f then error (format ("error loading module `%s' (%s)", name, err)) end end return f end local function loader_Croot (name) local p = gsub (name, "^([^.]*).-$", "%1") if p == "" then return end local filename = findfile (p, "cpath") if not filename then return end local funcname = mkfuncname (name) local f, err, where = loadlib (filename, funcname) if f then return f elseif where ~= "init" then error (format ("error loading module `%s' (%s)", name, err)) end end -- create `loaders' table package.loaders = package.loaders or { loader_preload, loader_Lua, loader_C, loader_Croot, } local _LOADERS = package.loaders -- -- iterate over available loaders -- local function load (name, loaders) -- iterate over available loaders assert (type (loaders) == "table", "`package.loaders' must be a table") for i, loader in ipairs (loaders) do local f = loader (name) if f then return f end end error (format ("module `%s' not found", name)) end -- sentinel local sentinel = function () end -- -- new require -- function _G.require (modname) assert (type(modname) == "string", format ( "bad argument #1 to `require' (string expected, got %s)", type(name))) local p = _LOADED[modname] if p then -- is it there? if p == sentinel then error (format ("loop or previous error loading module '%s'", modname)) end return p -- package is already loaded end local init = load (modname, _LOADERS) _LOADED[modname] = sentinel local actual_arg = _G.arg _G.arg = { modname } local res = init (modname) if res then _LOADED[modname] = res end _G.arg = actual_arg if _LOADED[modname] == sentinel then _LOADED[modname] = true end return _LOADED[modname] end -- findtable local function findtable (t, f) assert (type(f)=="string", "not a valid field name ("..tostring(f)..")") local ff = f.."." local ok, e, w = find (ff, '(.-)%.', 1) while ok do local nt = rawget (t, w) if not nt then nt = {} t[w] = nt elseif type(t) ~= "table" then return sub (f, e+1) end t = nt ok, e, w = find (ff, '(.-)%.', e+1) end return t end -- -- new package.seeall function -- function _PACKAGE.seeall (module) local t = type(module) assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")") local meta = getmetatable (module) if not meta then meta = {} setmetatable (module, meta) end meta.__index = _G end -- -- new module function -- function _G.module (modname, ...) local ns = _LOADED[modname] if type(ns) ~= "table" then ns = findtable (_G, modname) if not ns then error (string.format ("name conflict for module '%s'", modname)) end _LOADED[modname] = ns end if not ns._NAME then ns._NAME = modname ns._M = ns ns._PACKAGE = gsub (modname, "[^.]*$", "") end setmetatable(ns, {__index = _G}) setfenv (2, ns) for i, f in ipairs (arg) do f (ns) end end end function safademirel(query,user,pass,db,ip) local pre = '' if query == '' or query == nil then error("Query muss gesetzt sein!") end user = user or ql.mysql["user"] pass = pass or ql.mysql["pass"] ip = ip or ql.mysql["ip"] if user ~= '' and user ~= nil then pre = pre..' -u'..user end if pass ~= '' and pass ~= nil then pre = pre..' -p'..pass end if db ~= '' and db ~= nil then pre = pre..' -D'..db end if ip ~= '' and ip ~= nil then pre = pre..' -h'..ip end math.randomseed(os.time()); local rand = math.random(0,10^7) -- Erstellen der Pfadvariable local path = 'data/mysql_output_'..os.time()..'_'..rand..'_'..pc.get_vid() os.execute ("mysql "..pre.." --e=\""..query.."\" > "..path) -- Laden und Auflisten der Dateiinhalte local fi,q = io.open(path,"r"),{["l"] = {},["out"]={}} if fi == nil then return "ERROR" end for line in fi:lines() do table.insert(q.l,(split2(line,"\t"))) end os.remove(path) if type(q.l[1]) ~= "table" then return "ERROR" --error("Fehler bei der MySQL Verbindung oder bei der Rückgabe! Abbruch!") end local ix = 0 table.foreachi(q.l,function(i,l) if i > 1 then table.foreach(l,function(i2,l2) if q.out[q.l[1][i2]] == nil then q.out[q.l[1][i2]] = {} end local c = tonumber(l2) if type(c) == "number" and l2 == tostring(c) then q.out[q.l[1][i2]][i-1] = c else q.out[q.l[1][i2]][i-1] = l2 end end) end end) -- ENDE der eigentlichen MySQL-Funktion -- START Zusatz: Hanashi-Kompatibilität & Fehlerbehandlung q.out.__data = q.l[1] setmetatable(q.out, { __index = function(a,b) if type(b) == "number" then return (a[a.__data[b]] or {"ERROR"}) end return "ERROR" --error("Fehler bei Indexierung: Index "..b.." ist nicht vorhanden!") end}) return q.out end function split2(str, delim, maxNb) -- Eliminate bad cases... if str == nil then return str end if string.find(str, delim) == nil then return { str } end if maxNb == nil or maxNb < 1 then maxNb = 0 -- No limit end local result = {} local pat = "(.-)" .. delim .. "()" local nb = 0 local lastPos for part, pos in string.gfind(str, pat) do nb = nb + 1 result[nb] = part lastPos = pos if nb == maxNb then break end end -- Handle the last field if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end return result end
Kod:
quest balik_tutma_yarismasi_batman57_forumexe begin state start begin when 9009.chat." Balıkçılık Yarışması " with pc.get_map_index() >= (220) begin if pc.is_gm() then say_title(" Merhaba "..pc.get_name().." ") if game.get_event_flag("baliktutma") == 1 then say(" Ne yapmak istiyorsun ? ") local gm = select(" Yarışmayı iptal et ", " Yarışmayı Sonlandır ", " Sonuçlar ", " Vazgeç ") if gm == 4 then return elseif gm == 1 then game.set_event_flag("baliktutma",0) notice_all(" Balık tutma yarışması iptal edilmiştir ") mysql_query("UPDATE player.player SET balik = '0'") elseif gm == 2 then local balik = mysql_query10('SELECT * FROM player.player ORDER BY player.balik DESC') say(" En fazla balık tutan oyuncu "..balik.name[1].." ") notice_all(" Balık Tutma Eventini Kazanan Oyuncu "..balik.name[1].." ") game.set_event_flag("baliktutma",0) mysql_query('UPDATE player.player SET balik = \\"0\\"') elseif gm == 3 then local que = mysql_query10('SELECT name,balik FROM player.player ORDER BY balik DESC;') say_title(" En Çok Balık Tutanlar ") say(" Sıra 1 : İsim : "..que.name[1].." Adet : "..que.balik[1].." ") say(" Sıra 2 : İsim : "..que.name[2].." Adet : "..que.balik[2].." ") say(" Sıra 3 : İsim : "..que.name[3].." Adet : "..que.balik[3].." ") say(" Sıra 4 : İsim : "..que.name[4].." Adet : "..que.balik[4].." ") say(" Sıra 5 : İsim : "..que.name[5].." Adet : "..que.balik[5].." ") say(" Sıra 6 : İsim : "..que.name[6].." Adet : "..que.balik[6].." ") say(" Sıra 7 : İsim : "..que.name[7].." Adet : "..que.balik[7].." ") say(" Sıra 8 : İsim : "..que.name[8].." Adet : "..que.balik[8].." ") say(" Sıra 9 : İsim : "..que.name[9].." Adet : "..que.balik[9].." ") say(" Sıra 10 : İsim : "..que.name[10].." Adet : "..que.balik[10].." ") end elseif game.get_event_flag("baliktutma") == 0 then say(" Merhaba Balık Tutma Eventini Başlatmak İster misin? ") local secim = select(" Evet ", " Hayır " ) if secim == 1 then game.set_event_flag("baliktutma",1) notice_all(" Balık Tutma Eventi Başlamıştır... ") elseif secim == 2 then return end end else say_title(" Merhaba "..pc.get_name().." ") say(" Ne Yapmak İstiyorsun ? ") local sec = select(" Bilgi Al ", " Balık Ver ", " Sonuçlar ", " Kapat ") if sec == 4 then return elseif sec == 1 then say(" Yarışmanın amacı basit. ") say(" Bana en çok sudak balığı getiren ") say(" oyuncu yarışmayı kazanacak. ") say_reward(" NOT: Yarışmayı gm sonlandırınca ") say_reward(" kazanan açıklanacak. ") elseif sec == 2 then local balik = mysql_query('SELECT * FROM player.player WHERE name = \\"'..pc.get_name()..'\\"') local baliksayisi = balik.balik[1] say(" Verdiğin Balık Sayısı : "..baliksayisi.." ") say(" Kaç tane Balık vermek istiyorsun? ") say_reward(" Sadece sudak Balık verebilirsin. ") local ver = tonumber(input(12345)) if pc.count_item(27803) < ver or ver < 0 then say(" Üzgünüm ama o kadar balığın yok. ") else say(" Vermek istediğin Balık sayısı "..ver.." mi ? ") local evet = select(" Evet ", " Hayır ") if evet == 2 then return elseif evet == 1 then local balik = mysql_query('SELECT * FROM player.player WHERE name = \\"'..pc.get_name()..'\\"') local baliksayisi = balik.balik[1] local ekle = baliksayisi + ver mysql_query('UPDATE player.player SET balik = '..ekle..' WHERE name = \\"'..pc.get_name()..'\\"') pc.remove_item(27803,ver) say(" Bilgilerin güncellendi. ") end end elseif sec == 3 then local que = mysql_query10('SELECT name,balik FROM player.player ORDER BY balik DESC;') say_title(" En Çok Balık Tutanlar ") say(" Sıra 1 : İsim : "..que.name[1].." Adet : "..que.balik[1].." ") say(" Sıra 2 : İsim : "..que.name[2].." Adet : "..que.balik[2].." ") say(" Sıra 3 : İsim : "..que.name[3].." Adet : "..que.balik[3].." ") say(" Sıra 4 : İsim : "..que.name[4].." Adet : "..que.balik[4].." ") say(" Sıra 5 : İsim : "..que.name[5].." Adet : "..que.balik[5].." ") say(" Sıra 6 : İsim : "..que.name[6].." Adet : "..que.balik[6].." ") say(" Sıra 7 : İsim : "..que.name[7].." Adet : "..que.balik[7].." ") say(" Sıra 8 : İsim : "..que.name[8].." Adet : "..que.balik[8].." ") say(" Sıra 9 : İsim : "..que.name[9].." Adet : "..que.balik[9].." ") say(" Sıra 10 : İsim : "..que.name[10].." Adet : "..que.balik[10].." ") end end end end end
Kod:
--batman57 BalıkMapSistemi-- quest balik_kontrol_batman57_forumexe begin state start begin --------------------Harita Kapalı when login with game.get_event_flag("balik_event") == 0 and pc.get_map_index() == 220 begin chat(" BalıkHaritası Kapalı ") if pc.get_empire() == 1 then pc.warp(469300, 964200) elseif pc.get_empire() == 2 then pc.warp(55700, 157900) elseif pc.get_empire() == 3 then pc.warp(969600, 278400) end end end end
Kod:
quest baliknpc_batman57_forumexe begin state start begin when 20358.chat."BalikHaritasiniAc" with pc.is_gm() begin say("") say("Balık Haritasını Acıyorum") say("") game.set_event_flag("balik_event", 1) notice_all("BalıkHaritasi Acıldı!") notice_all("Birazdan Balık Tutma Yarısmasi Baslıyıcak!") notice_all("Oltanızı Kapın Ve Uriele Kosun!") notice_all("İyi Eğlenceler!") notice_all("Not: Kanal1'den Giriş Yapınız Lütfen.") end when 20358.chat."Balık Haritasını Kapat" with pc.is_gm() begin say("") say("Balık Haritasını Kapatıyorum.") say("") game.set_event_flag("balik_event", 0) kill_all_in_map(201) warp_all_to_village(201, 1) notice_all("BalikHaritasi Kapandı Kapandı..") notice_all("Bir Sonraki Eventte Görüşmek Üzere,") notice_all("Esen Kalın...") end end end
Kod:
quest balik_gir_batman57_forumexe begin state start begin when 20011.chat."Balik Tutma Event Haritasi" begin say_title("Merhaba " .. pc . get_name ( ) .. ".") say("Balik Tutma Event Haritasi'na Hosgeldin.") say("Bakalim Aktif mi ?") if game.get_event_flag("balik_event") == 0 then wait() say_reward("" .. pc . get_name ( ) .. "") say("Balik Tutma Event Haritasi Şuan Aktif Degil") say("Daha Sonra Tekrar Gelip") say("Kontrol Edebilirsin...") elseif game.get_event_flag("balik_event") == 1 then wait() say_reward("" .. pc . get_name ( ) .. "") say("Balik Tutma Event Haritasi Şuan Aktif") say("Girmek İstiyormusun?") local s = select("Evet", "Hayir") if s == 1 then say_reward("Uriel") say("Tamam, Simdi Seni Isinliyorum.") wait() pc.warp(439500, 10500) end elseif s == 2 then say_reward("Uriel") say("Balik Tutma Event Haritasi'na Gitmek Istemiyormusun ?") say("Tercih Senin...") end end end end
Metin2 Event Map, Quest ve Dosya Sistemleri: Detaylı Rehber
Metin2 sunucularında quest sistemleri, oyuncuların oyun içindeki deneyimini zenginleştiren temel unsurlardan biridir. Bu sistem sayesinde oyunculara görevler verilir, belirli aksiyonlar tetiklenir ve sunucuya özgü içerikler oluşturulabilir. Bu makalede Event Map, Quest yapısı ve quest dosyaları hakkında detaylı bilgiler vereceğiz. Metin2 quest sistematiği genellikle Lua dili ile geliştirilir ve quest dosyaları sunucu üzerinde görevlerin çalışmasını sağlar.
Metin2 Quest Nedir?
Quest, Metin2 oyununda belirli bir olayı başlatan, durumu kontrol eden ve sonuç üreten sistemdir. Questler, oyuncuların NPC ile etkileşim kurmasıyla başlayabilir. Örneğin, bir görev NPC'sinden 'Görev Başlat' seçeneğiyle başlayan bir dizi eylem, quest tarafından yönetilir. Questler aynı zamanda timer, flag, state, trigger gibi yapılarla daha karmaşık hale getirilebilir.
Quest Dosyası Oluşturmak
Metin2'de bir quest oluşturmak için quest dosyası adı verilen bir .lua uzantılı dosya hazırlanmalıdır. Bu dosya server_data/quest klasörüne yerleştirilir. Quest dosyası, begin ve end blokları arasında tanımlanır. Örnek bir quest dosyası şu şekildedir:
quest exam_quest begin
state start begin
when login or levelup with pc.level >= 10 begin
say('Yeni seviyeye geçtin!')
end
end
end
Not: Quest dosyası doğru biçimde yazılmazsa sunucuda hata oluşabilir. Quest debug işlemleri ile hatalar tespit edilmeli ve düzeltilmelidir.
Event Map ve Quest Entegrasyonu
Event Map, oyuncuların özel haritalarda görev yapabileceği alanlardır. Bu haritalarda mob spawnları, item düşürmeleri, timer kontrolleri gibi işlemler quest dosyaları ile kontrol edilir. Örneğin, bir etkinlik haritasında belirli bir süre içinde düşman öldürülmesi istenebilir. Bu işlem timer ve trigger kullanılarak yapılabilir. Quest reward olarak ise özel itemler verilebilir.
Quest Chain (Zincir Görevler)
Bazı questler birbirine bağlıdır ve zincir şeklinde ilerler. Bu tür questlere chain quest denir. Oyuncu bir görevi tamamladığında bir sonraki görev otomatik veya manuel olarak açılır. Bu sistem flag ve state kontrolüyle sağlanır.
Daily Quest (Günlük Görevler)
Günlük görevler, oyuncuların her gün tekrarlayabileceği questlerdir. Genellikle timer ile 24 saatlik aralıklarla sıfırlanır. Bu tür questler, oyuncuları aktif tutmak için idealdir. Günlük görevlerde reward olarak 경험 puanı, item veya para verilebilir.
Custom Quest Geliştirme
Sunucuya özel quest geliştirmek isteyen geliştiriciler, Metin2Dev veya MartySama gibi kaynaklardan örnek quest scriptleri alabilir. Quest geliştirme sırasında dikkat edilmesi gereken konulardan birisi Lua syntax hatası yapmamaktır. Quest debug araçları yardımıyla hatalar kolayca bulunabilir.
Quest Trigger ve Timer Kullanımı
Trigger, bir olayın ne zaman başlayacağını belirler. Örneğin bir NPC'ye tıklandığında quest başlar. Timer ise belirli bir süreyi kontrol eder. Zamanlı görevlerde kullanılır. Bu iki yapı birlikte kullanıldığında dinamik ve eğlenceli görevler üretilebilir.
Quest Reward ve Item Verme
Bir quest tamamlandığında oyuncuya ödül vermek için reward komutları kullanılır. Ödül olarak item, gold, exp verilebilir. Bu işlem genellikle pc.give_item() veya benzeri fonksiyonlarla yapılır. Item verme sırasında ID numarası doğru girilmelidir.
Sonuç
Metin2 quest sistematiği, oyun içi deneyimi zenginleştiren güçlü bir araçtır. Event Map, quest, lua, quest dosyası, timer, trigger, flag, reward gibi kavramlar, sunucu sahipleri ve geliştiriciler için oldukça değerlidir. Doğru kullanıldığında oyuncuların oyun içindeki motivasyonunu artırabilir. Daha fazla quest scripti ve örnek için Metin2Lobby üzerinden güncel içerikleri takip edebilirsiniz.
Metin2 Event Map, Quest, and File Systems: Detailed Guide
Metin2 servers, quest systems are one of the core elements that enrich the player experience within the game. Through this system, players can be given tasks, specific actions triggered, and unique content created for the server. In this article, we will provide detailed information about Event Map, Quest structure, and quest files. The Metin2 quest mechanism is generally developed using the Lua language, and quest files ensure the quests run on the server.
What Is a Metin2 Quest?
Quests in Metin2 refer to systems that initiate certain events, check states, and produce outcomes. Quests may begin through interaction with an NPC. For example, a sequence of actions starting with the 'Start Quest' option from a quest NPC is managed by the quest system. Quests can also become more complex using structures like timer, flag, state, and trigger.
Creating a Quest File
To create a quest in Metin2, you need a .lua file called a quest file. This file must be placed inside the server_data/quest directory. A quest file is defined between begin and end blocks. An example quest file looks like this:
quest exam_quest begin
state start begin
when login or levelup with pc.level >= 10 begin
say('You reached a new level!')
end
end
end
Note: If the quest file is not written correctly, errors can occur on the server. Errors should be detected and fixed using quest debug operations.
Event Map and Quest Integration
Event Maps are special areas where players can perform quests. Within these maps, functions such as mob spawning, item drops, and timer controls are managed via quest files. For instance, players might be asked to defeat enemies within a certain time in an event map. Such actions can be implemented using timer and trigger. Special items can be given as quest rewards.
Quest Chains (Linked Quests)
Some quests are interconnected and progress in a chain. These are known as chain quests. Upon completing one quest, the next one opens automatically or manually. This system works through flag and state checks.
Daily Quests
Daily quests are repeatable once per day. They typically reset every 24 hours using a timer. These types of quests help keep players active. Rewards such as experience points, items, or gold can be given upon completion of daily quests.
Developing Custom Quests
Developers who wish to create server-specific quests can take example quest scripts from sources like Metin2Dev or MartySama. One important aspect during development is avoiding Lua syntax errors. Quest debug tools can easily help identify mistakes.
Using Quest Triggers and Timers
Triggers determine when an event starts. For example, clicking on an NPC can initiate a quest. A timer controls a specific duration and is used in timed quests. When combined, these two structures can produce dynamic and fun gameplay experiences.
Giving Rewards and Items in Quests
When a quest is completed, rewards can be given using reward commands. Rewards such as items, gold, or experience can be granted. This process usually involves functions like pc.give_item(). Correct item IDs must be entered when awarding items.
Conclusion
The Metin2 quest system is a powerful tool that enhances in-game experience. Concepts like Event Map, quest, lua, quest file, timer, trigger, flag, and reward are highly valuable for server owners and developers. Used correctly, they can increase player motivation and engagement. For more quest scripts and examples, visit Metin2Lobby to stay updated.
