Event Map + Quest + Dosya

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 36

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0


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.​
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt