{"id":12,"date":"2026-10-07T15:13:22","date_gmt":"2026-10-07T07:13:22","guid":{"rendered":"http:\/\/121.41.81.251\/index.php\/servers\/"},"modified":"2026-10-24T05:18:26","modified_gmt":"2026-10-23T21:18:26","slug":"servers","status":"publish","type":"page","link":"https:\/\/worldcraft.com.cn\/index.php\/servers\/","title":{"rendered":"\u670d\u52a1\u5668\u5217\u8868"},"content":{"rendered":"<p>\u5b98\u7f51\u76ee\u5f55\u7531\u670d\u52a1\u7aef\u5b9e\u65f6\u4e0b\u53d1\uff0c\u53ef\u641c\u7d22\u3001\u6392\u5e8f\u548c\u67e5\u770b\u8be6\u60c5\uff1b\u7248\u672c \/ \u52a0\u8f7d\u5668 \/ \u73a9\u6cd5\u7b5b\u9009\u3001\u6536\u85cf\u3001\u5386\u53f2\u3001\u8d44\u6e90\u4e0b\u8f7d\u4e0e\u76f4\u8fde\u8fdb\u670d\u8bf7\u5728\u542f\u52a8\u5668\u4e2d\u4f7f\u7528\u3002<a href=\"\/download\/\">\u4e0b\u8f7d\u542f\u52a8\u5668<\/a><\/p>\n<style>\n\t.mcsl-sv__bar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:12px}\n\t.mcsl-sv__bar input{flex:1 1 260px;min-width:200px}\n\t.mcsl-sv__bar input,.mcsl-sv__bar select{height:42px;border:1px solid var(--mcsl-border);border-radius:var(--mcsl-radius-md);padding:0 12px;background:var(--mcsl-card);color:var(--mcsl-text);font-family:var(--mcsl-font);font-size:14px}\n\t.mcsl-sv__bar input:focus,.mcsl-sv__bar select:focus{outline:0;border-color:var(--mcsl-accent);box-shadow:0 0 0 3px var(--mcsl-accent-soft)}\n\t\/* \u5e7f\u544a\u5173\u95ed\u65f6\u53ea\u4fdd\u7559\u5355\u5217\u5217\u8868\u3002 *\/\n\t.mcsl-sv-layout{display:grid;grid-template-columns:1fr;gap:18px;align-items:start}\n\t@media (min-width:1280px){.mcsl-sv-layout--with-ads{grid-template-columns:190px minmax(0,1fr) 190px}}\n\t.mcsl-sv-rail{display:none}\n\t@media (min-width:1280px){.mcsl-sv-layout--with-ads .mcsl-sv-rail{display:block;position:sticky;top:90px}}\n\t.mcsl-sv-layout--no-ads{grid-template-columns:minmax(0,1fr) !important}\n\t.mcsl-sv-layout--no-ads .mcsl-sv-rail{display:none !important}\n\t.mcsl-sv-rail .mcsl-sv-card{font-size:13px}\n\t.mcsl-sv__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}\n\t@media (max-width:820px){.mcsl-sv__grid{grid-template-columns:1fr}}\n\t.mcsl-sv-card{background:var(--mcsl-card);border:1px solid var(--mcsl-border);border-radius:var(--mcsl-radius-lg);padding:18px;cursor:pointer;\n\t\ttransition:border-color 150ms ease-out;text-align:left;box-shadow:var(--mcsl-shadow-sm)}\n\t.mcsl-sv-card:hover{border-color:var(--mcsl-border-strong)}\n\t.mcsl-sv-card__head{display:flex;gap:10px;align-items:center}\n\t.mcsl-sv-card__icon{width:40px;height:40px;border-radius:var(--mcsl-radius-md);background:var(--mcsl-bg-soft);flex:0 0 auto;object-fit:cover}\n\t.mcsl-sv-card__name{font-weight:600;display:flex;align-items:center;gap:6px}\n\t.mcsl-sv-card__addr{color:var(--mcsl-muted);font-size:12px;word-break:break-all}\n\t.mcsl-sv-card__right{margin-left:auto;text-align:right;flex:0 0 auto}\n\t.mcsl-sv-card__players{font-weight:600;color:var(--mcsl-text);font-variant-numeric:tabular-nums}\n\t.mcsl-sv-card__sig{font-size:12px;color:var(--mcsl-muted)}\n\t.mcsl-sv-card__motd{margin-top:8px;font-size:12px;color:var(--mcsl-text-2);line-height:1.55;height:38px;overflow:hidden;white-space:pre-line}\n\t.mcsl-sv-card__motd b{font-weight:700}\n\t.mcsl-sv-card__motd i{font-style:italic}\n\t.mcsl-sv-tags{margin-top:8px;display:flex;gap:6px;flex-wrap:wrap}\n\t.mcsl-sv-tags span{background:var(--mcsl-bg-soft);color:var(--mcsl-text-2);border-radius:var(--mcsl-radius-sm);padding:2px 7px;font-size:11px}\n\t.mcsl-sv-badge{background:var(--mcsl-accent-soft);color:var(--mcsl-accent);border:1px solid var(--mcsl-border);border-radius:var(--mcsl-radius-sm);padding:1px 6px;font-size:11px}\n\t.mcsl-sv-note{color:var(--mcsl-muted);font-size:12px;margin-bottom:10px}\n\t.mcsl-sv-more{display:block;margin:16px auto 0;padding:10px 26px}\n\t.mcsl-sv-modal{position:fixed;inset:0;background:#0008;display:flex;align-items:center;justify-content:center;z-index:9999;padding:16px}\n\t.mcsl-sv-modal__box{background:var(--mcsl-card);border:1px solid var(--mcsl-border);border-radius:var(--mcsl-radius-lg);max-width:640px;width:100%;max-height:86vh;overflow:auto;padding:24px}\n\t.mcsl-sv-modal__row{display:flex;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px solid var(--mcsl-border);font-size:14px}\n\t.mcsl-sv-modal__row b{font-weight:600;color:var(--mcsl-text-2);font-size:13px}\n\t.mcsl-sv-btn{display:inline-block;padding:9px 18px;border-radius:var(--mcsl-radius-md);background:var(--mcsl-accent);color:#fff;text-decoration:none;margin:10px 8px 0 0;cursor:pointer;border:none;font-size:14px;font-family:var(--mcsl-font)}\n\t.mcsl-sv-btn--ghost{background:transparent;color:var(--mcsl-text);border:1px solid var(--mcsl-border-strong)}\n\t<\/style><div id=\"mcsl-servers\" data-config=\"{&quot;api&quot;:&quot;https:\\\/\\\/worldcraft.com.cn\\\/mcsl-server&quot;,&quot;key&quot;:&quot;mcsl-local-dev-key&quot;,&quot;showAds&quot;:false,&quot;download&quot;:&quot;https:\\\/\\\/worldcraft.com.cn\\\/downloads\\\/WBL.exe&quot;,&quot;strings&quot;:{&quot;search&quot;:&quot;\\u641c\\u7d22\\u670d\\u52a1\\u5668\\u540d\\u79f0\\u6216\\u5730\\u5740&quot;,&quot;sortPlayers&quot;:&quot;\\u6309\\u5728\\u7ebf\\u4eba\\u6570&quot;,&quot;sortName&quot;:&quot;\\u6309\\u540d\\u79f0&quot;,&quot;sortSignal&quot;:&quot;\\u6309\\u4fe1\\u53f7&quot;,&quot;sortHeat&quot;:&quot;\\u6309\\u70ed\\u5ea6&quot;,&quot;moreFilters&quot;:&quot;\\u66f4\\u591a\\u7b5b\\u9009&quot;,&quot;loadMore&quot;:&quot;\\u52a0\\u8f7d\\u66f4\\u591a&quot;,&quot;loading&quot;:&quot;\\u6b63\\u5728\\u8f7d\\u5165\\u670d\\u52a1\\u5668\\u5217\\u8868\\u2026&quot;,&quot;empty&quot;:&quot;\\u6ca1\\u6709\\u5339\\u914d\\u7684\\u670d\\u52a1\\u5668&quot;,&quot;failed&quot;:&quot;\\u5217\\u8868\\u6682\\u65f6\\u52a0\\u8f7d\\u4e0d\\u51fa\\u6765\\uff08\\u670d\\u52a1\\u7aef\\u4e0d\\u53ef\\u8fbe\\uff09\\uff0c\\u8bf7\\u7a0d\\u540e\\u5237\\u65b0\\uff1b\\u4f60\\u4e5f\\u53ef\\u4ee5\\u5148\\u4e0b\\u8f7d\\u542f\\u52a8\\u5668\\u3002&quot;,&quot;promoted&quot;:&quot;\\u63a8\\u5e7f&quot;,&quot;copy&quot;:&quot;\\u590d\\u5236\\u5730\\u5740&quot;,&quot;copied&quot;:&quot;\\u5df2\\u590d\\u5236&quot;,&quot;downloadLauncher&quot;:&quot;\\u4e0b\\u8f7d\\u542f\\u52a8\\u5668&quot;,&quot;downloadClient&quot;:&quot;\\u4e0b\\u8f7d\\u5ba2\\u6237\\u7aef&quot;,&quot;hiddenHint&quot;:&quot;\\u5df2\\u9690\\u85cf %d \\u53f0\\u6ca1\\u6709\\u91c7\\u6837\\u7ed3\\u679c\\u7684\\u670d\\u52a1\\u5668\\uff08\\u5728\\u641c\\u7d22\\u6846\\u91cc\\u641c\\u5c31\\u80fd\\u770b\\u5230\\uff09&quot;,&quot;count&quot;:&quot;\\u5171 %d \\u53f0\\u670d\\u52a1\\u5668&quot;,&quot;filtersHint&quot;:&quot;\\u5b98\\u7f51\\u53ea\\u63d0\\u4f9b\\u641c\\u7d22\\u4e0e\\u6392\\u5e8f\\uff1b\\u7248\\u672c \\\/ \\u52a0\\u8f7d\\u5668 \\\/ \\u73a9\\u6cd5\\u7b49\\u5b8c\\u6574\\u7b5b\\u9009\\u8bf7\\u7528\\u542f\\u52a8\\u5668\\u3002&quot;,&quot;good&quot;:&quot;\\u826f\\u597d&quot;,&quot;fair&quot;:&quot;\\u4e00\\u822c&quot;,&quot;poor&quot;:&quot;\\u8f83\\u5dee&quot;,&quot;offline&quot;:&quot;\\u79bb\\u7ebf&quot;,&quot;unknown&quot;:&quot;\\u5f85\\u91c7\\u6837&quot;,&quot;noAddress&quot;:&quot;\\u672a\\u516c\\u5f00\\u5730\\u5740&quot;}}\"><div class=\"mcsl-sv__bar\"><input id=\"mcsl-sv-q\" type=\"search\" placeholder=\"\u641c\u7d22\u670d\u52a1\u5668\u540d\u79f0\u6216\u5730\u5740\" \/><select id=\"mcsl-sv-sort\"><option value=\"players\">\u6309\u5728\u7ebf\u4eba\u6570<\/option><option value=\"name\">\u6309\u540d\u79f0<\/option><option value=\"signal\">\u6309\u4fe1\u53f7<\/option><option value=\"heat\">\u6309\u70ed\u5ea6<\/option><\/select><button type=\"button\" class=\"mcsl-sv-btn mcsl-sv-btn--ghost\" id=\"mcsl-sv-filters\">\u66f4\u591a\u7b5b\u9009<\/button><\/div><div class=\"mcsl-sv-note\" id=\"mcsl-sv-note\">\u6b63\u5728\u8f7d\u5165\u670d\u52a1\u5668\u5217\u8868\u2026<\/div><div class=\"mcsl-sv-layout mcsl-sv-layout--no-ads\"><aside class=\"mcsl-sv-rail\" id=\"mcsl-sv-rail-left\"><\/aside><div><div class=\"mcsl-sv__grid\" id=\"mcsl-sv-grid\"><\/div><button type=\"button\" class=\"mcsl-sv-btn mcsl-sv-more\" id=\"mcsl-sv-load\" hidden>\u52a0\u8f7d\u66f4\u591a<\/button><\/div><aside class=\"mcsl-sv-rail\" id=\"mcsl-sv-rail-right\"><\/aside><\/div><\/div><script>(function(){\n  var root = document.getElementById('mcsl-servers');\n  if(!root || root.dataset.ready === '1') return;\n  root.dataset.ready = '1';\n  var cfg = JSON.parse(root.dataset.config);\n  var T = cfg.strings, API = cfg.api.replace(\/\\\/+$\/, '');\n  var BATCH = 60;\n  var servers = [], statusMap = {}, heatMap = {}, ads = [], list = [], rendered = 0, keyword = '';\n\n  var grid = document.getElementById('mcsl-sv-grid');\n  var note = document.getElementById('mcsl-sv-note');\n  var loadBtn = document.getElementById('mcsl-sv-load');\n  var qBox = document.getElementById('mcsl-sv-q');\n  var sortBox = document.getElementById('mcsl-sv-sort');\n  var filtersBtn = document.getElementById('mcsl-sv-filters');\n\n  function esc(s){ return (s == null ? '' : String(s)).replace(\/[&<>\"']\/g, function(c){\n    return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n\n  function signal(level){\n    if(level === 'good') return [T.good, 4];\n    if(level === 'fair') return [T.fair, 3];\n    if(level === 'poor') return [T.poor, 2];\n    if(level === 'offline') return [T.offline, 1];\n    if(level === 'no-address') return [T.noAddress, 0];\n    return [T.unknown, 0];\n  }\n\n  function deviceId(){\n    try{\n      var v = localStorage.getItem('mcsl_device_id');\n      if(!v){ v = 'web-' + Math.random().toString(36).slice(2) + Date.now().toString(36); localStorage.setItem('mcsl_device_id', v); }\n      return v;\n    }catch(e){ return 'web-anon'; }\n  }\n\n  function json(url){\n    return fetch(url, {headers:{'Accept':'application\/json'}}).then(function(r){\n      if(!r.ok) throw new Error(url + ' -> ' + r.status);\n      return r.json();\n    });\n  }\n\n  function report(campaignId, adId, slot, type){\n    if(!cfg.showAds || !cfg.key) return;\n    try{ fetch(API + '\/api\/v1\/ads\/event', {\n      method:'POST',\n      headers:{'Content-Type':'application\/json','X-Client-Key':cfg.key},\n      body: JSON.stringify({adId:String(adId), campaignId:Number(campaignId), slot:slot, eventType:type,\n        deviceId:deviceId(), sessionId:null, timestamp:Math.floor(Date.now()\/1000), nonce:'', sign:null})\n    }).catch(function(){}); }catch(e){}\n  }\n\n  function exposureOnce(campaignId){\n    var key = 'mcsl_ad_seen_' + campaignId;\n    try{\n      var last = parseInt(localStorage.getItem(key) || '0', 10);\n      if(last && Date.now() - last < 86400000) return false;\n      localStorage.setItem(key, String(Date.now()));\n      return true;\n    }catch(e){ return true; }\n  }\n\n  function levelOf(id){ var s = statusMap[id]; return s ? s.level : 'unknown'; }\n\n  \/\/ \u670d\u52a1\u7aef\u4e0b\u53d1\u7684 ServerEntry \u91cc endPoint \u662f [JsonIgnore]\uff0c\u8981\u81ea\u5df1\u6309 address + port \u62fc\n  function endpointOf(e){\n    if(!e || !e.address) return '';\n    return (e.port && e.port !== 25565) ? (e.address + ':' + e.port) : e.address;\n  }\n\n  \/\/ ---------- \u6587\u672c\u6e32\u67d3\uff082026-10-08 \u7b2c\u56db\u5341\u4e03\u8f6e\uff1aMOTD \u8981\u4e0a\u8272\u3001\u4ecb\u7ecd\u8981\u89e3\u6790 HTML\/Markdown\uff09 ----------\n  var MC_COLORS = {'0':'#000000','1':'#0000AA','2':'#00AA00','3':'#00AAAA','4':'#AA0000','5':'#AA00AA',\n    '6':'#FFAA00','7':'#AAAAAA','8':'#555555','9':'#5555FF','a':'#55FF55','b':'#55FFFF',\n    'c':'#FF5555','d':'#FF55FF','e':'#FFFF55','f':'#FFFFFF'};\n  var SECTION = '\\u00a7';\n\n  \/\/ \u628a\u5e26 \u00a7 \u4ee3\u7801\u7684 MOTD \u6e32\u67d3\u6210\u5f69\u8272 HTML\uff0816 \u539f\u8272 + \u00a7l\/\u00a7o\/\u00a7n\/\u00a7m + \u00a7#RRGGBB + \u00a7x\u00a7R\u2026\uff1b\u6587\u5b57\u5168\u90e8\u8f6c\u4e49\uff09\n  function motdHtml(text, baseColor){\n    if(!text) return '';\n    var s = String(text), out = '', buf = '', st = {color:null,b:false,i:false,u:false,s:false};\n    function flush(){\n      if(!buf) return;\n      var t = esc(buf), style = st.color ? 'color:' + st.color + ';' : (baseColor ? 'color:' + baseColor + ';' : '');\n      if(st.b) t = '<b>' + t + '<\/b>';\n      if(st.i) t = '<i>' + t + '<\/i>';\n      if(st.u) t = '<u>' + t + '<\/u>';\n      if(st.s) t = '<s>' + t + '<\/s>';\n      out += style ? '<span style=\"' + style + '\">' + t + '<\/span>' : t;\n      buf = '';\n    }\n    for(var k = 0; k < s.length; k++){\n      if(s[k] !== SECTION){ buf += s[k]; continue; }\n      var d = (s[k+1] || '').toLowerCase();\n      \/\/ \u00a7x\u00a7R\u00a7R\u00a7G\u00a7G\u00a7B\u00a7B\uff0814 \u5b57\uff09\n      if(d === 'x' && k + 13 < s.length){\n        var hex = '';\n        for(var q = 0; q < 6; q++){ hex += s[k + 3 + q * 2]; }\n        if(\/^[0-9a-f]{6}$\/i.test(hex)){ flush(); st.color = '#' + hex.toUpperCase(); k += 13; continue; }\n      }\n      \/\/ \u00a7#RRGGBB\n      if(s[k+1] === '#' && k + 7 < s.length){\n        var hex2 = s.substr(k + 2, 6);\n        if(\/^[0-9a-f]{6}$\/i.test(hex2)){ flush(); st.color = '#' + hex2.toUpperCase(); k += 7; continue; }\n      }\n      if(MC_COLORS[d]){ flush(); st = {color:MC_COLORS[d], b:false, i:false, u:false, s:false}; k++; continue; }\n      if(d === 'l'){ flush(); st.b = true; k++; continue; }\n      if(d === 'o'){ flush(); st.i = true; k++; continue; }\n      if(d === 'n'){ flush(); st.u = true; k++; continue; }\n      if(d === 'm'){ flush(); st.s = true; k++; continue; }\n      if(d === 'r'){ flush(); st = {color:null,b:false,i:false,u:false,s:false}; k++; continue; }\n      if(d === 'k'){ k++; continue; } \/\/ \u4e71\u7801\uff1a\u4e22\u6389\u4ee3\u7801\n      \/\/ \u5176\u5b83\u672a\u77e5\u4ee3\u7801\uff1a\u539f\u6837\u4fdd\u7559\u5b57\u7b26\n    }\n    flush();\n    return out;\n  }\n\n  function stripColorCodes(text){\n    return String(text || '').replace(\/\\u00a7x(\\u00a7[0-9a-f]){6}\/gi, '')\n      .replace(\/\\u00a7#[0-9a-f]{6}\/gi, '').replace(\/\\u00a7[0-9a-fk-or]\/gi, '');\n  }\n\n  \/\/ \u4ecb\u7ecd\uff1a\u5148\u53bb\u6389\u989c\u8272\u7801\u3001\u6574\u4f53\u8f6c\u4e49\uff0c\u518d\u653e\u884c\u767d\u540d\u5355\u6807\u7b7e\uff08b\/strong\/i\/em\/u\/br\uff09+ \u6700\u57fa\u7840 Markdown\n  function renderRich(text){\n    if(!text) return '';\n    var s = esc(stripColorCodes(text));\n    s = s.replace(\/&lt;(\\\/?)(b|strong|i|em|u|br)\\s*\\\/?&gt;\/gi, function(m, slash, tag){\n      tag = tag.toLowerCase();\n      if(tag === 'br') return '<br\/>';\n      if(tag === 'strong') tag = 'b';\n      if(tag === 'em') tag = 'i';\n      return '<' + slash + tag + '>';\n    });\n    s = s.replace(\/\\*\\*([^*\\n]+)\\*\\*\/g, '<b>$1<\/b>');\n    s = s.replace(\/(^|[^*])\\*([^*\\n]+)\\*\/g, '$1<i>$2<\/i>');\n    return s.replace(\/\\n\/g, '<br\/>');\n  }\n\n  function build(){\n    var out = servers.slice();\n    if(keyword){\n      var k = keyword.toLowerCase();\n      out = out.filter(function(s){\n        return (s.name || '').toLowerCase().indexOf(k) >= 0 || (s.address || '').toLowerCase().indexOf(k) >= 0; });\n    } else {\n      \/\/ \u4e0e\u5ba2\u6237\u7aef\u4e00\u81f4\uff1a\u6ca1\u641c\u7d22\u65f6\u9690\u85cf\"\u5f85\u91c7\u6837 \/ \u672a\u516c\u5f00\u5730\u5740\"\n      out = out.filter(function(s){ var l = levelOf(s.id); return l !== 'unknown' && l !== 'no-address'; });\n    }\n\n    var mode = sortBox.value;\n    out.sort(function(a, b){\n      var sa = statusMap[a.id] || {}, sb = statusMap[b.id] || {};\n      if(mode === 'name') return (a.name || '').localeCompare(b.name || '');\n      if(mode === 'signal') return signal(sb.level || 'unknown')[1] - signal(sa.level || 'unknown')[1];\n      if(mode === 'heat') return (heatMap[b.id] || 0) - (heatMap[a.id] || 0);\n      return (sb.playersOnline || -1) - (sa.playersOnline || -1);\n    });\n\n    if(cfg.showAds && !keyword) out = insertAds(out);\n    return out;\n  }\n\n  function insertAds(natural){\n    if(natural.length < 10) return natural;\n    \/\/ \u5b98\u7f51\u7528**\u5b98\u7f51\u4e13\u5c5e**\u5e7f\u544a\u4f4d\uff08web_after_*\uff09\uff0c\u4e0e\u5ba2\u6237\u7aef\u7684 list_after_* \u62c6\u5f00\u5356\uff08\u7b2c\u4e94\u5341\u8f6e\uff09\n    var slots = [{after:4, slot:'web_after_4'}];\n    if(natural.length >= 40){ slots.push({after:20, slot:'web_after_20'}); slots.push({after:40, slot:'web_after_40'}); }\n    var bySlot = {};\n    ads.forEach(function(a){ if(!bySlot[a.slot]) bySlot[a.slot] = a; });\n    var out = [];\n    for(var i = 0; i < natural.length; i++){\n      out.push({kind:'server', entry:natural[i]});\n      slots.forEach(function(s){\n        if(s.after === i + 1 && bySlot[s.slot]) out.push({kind:'ad', ad:bySlot[s.slot]});\n      });\n    }\n    return out;\n  }\n\n  function cardHtml(item){\n    if(item.kind === 'ad'){\n      var a = item.ad, s = statusMap[a.serverId] || {};\n      return '<article class=\"mcsl-sv-card\" data-ad=\"' + a.campaignId + '\" data-slot=\"' + esc(a.slot) + '\">'\n        + '<div class=\"mcsl-sv-card__head\">'\n        + iconHtml(a.iconUrl, a.serverId)\n        + '<div><div class=\"mcsl-sv-card__name\"><span class=\"mcsl-sv-badge\">' + esc(T.promoted) + '<\/span>' + esc(a.title) + '<\/div>'\n        + '<div class=\"mcsl-sv-card__addr\">' + esc(a.serverIp || '') + (a.serverPort && a.serverPort !== 25565 ? ':' + a.serverPort : '') + '<\/div><\/div>'\n        + '<div class=\"mcsl-sv-card__right\"><div class=\"mcsl-sv-card__players\">' + players(s) + '<\/div>'\n        + '<div class=\"mcsl-sv-card__sig\">' + esc(signal(s.level || 'unknown')[0]) + '<\/div><\/div><\/div>'\n        + (a.description ? '<div class=\"mcsl-sv-card__motd\">' + esc(a.description) + '<\/div>' : '')\n        + tagsHtml(a.tags || [])\n        + '<\/article>';\n    }\n    var e = item.entry, st = statusMap[e.id] || {};\n    var motd = motdHtml(st.motd);\n    return '<article class=\"mcsl-sv-card\" data-id=\"' + esc(e.id) + '\">'\n      + '<div class=\"mcsl-sv-card__head\">'\n      + iconHtml(e.iconUrl, e.id)\n      + '<div><div class=\"mcsl-sv-card__name\">' + esc(e.name) + '<\/div>'\n      + '<div class=\"mcsl-sv-card__addr\">' + esc(endpointOf(e)) + '<\/div><\/div>'\n      + '<div class=\"mcsl-sv-card__right\"><div class=\"mcsl-sv-card__players\">' + players(st) + '<\/div>'\n      + '<div class=\"mcsl-sv-card__sig\">' + esc(signal(st.level || 'unknown')[0]) + '<\/div><\/div><\/div>'\n      + (motd ? '<div class=\"mcsl-sv-card__motd\">' + motd + '<\/div>' : '')\n      + tagsHtml([e.version, e.loader, e.region].filter(function(x){ return !!x; }))\n      + '<\/article>';\n  }\n\n  function iconHtml(iconUrl, id){\n    var src = iconUrl ? iconUrl : (API + '\/api\/v1\/icon\/' + encodeURIComponent(id));\n    return '<img decoding=\"async\" class=\"mcsl-sv-card__icon\" loading=\"lazy\" alt=\"\" src=\"' + esc(src) + '\" onerror=\"this.style.visibility=\\'hidden\\'\" \/>';\n  }\n\n  function players(st){\n    if(!st || st.playersOnline == null) return '\u2014 \/ \u2014';\n    return st.playersOnline + ' \/ ' + (st.playersMax == null ? '?' : st.playersMax);\n  }\n\n  function tagsHtml(tags){\n    if(!tags || !tags.length) return '';\n    return '<div class=\"mcsl-sv-tags\">' + tags.slice(0, 5).map(function(t){\n      return '<span>' + esc(t) + '<\/span>'; }).join('') + '<\/div>';\n  }\n\n  function render(){\n    list = build();\n    rendered = 0;\n    grid.innerHTML = '';\n    renderBatch();\n    var hidden = servers.length - list.filter(function(i){ return i.kind === 'server'; }).length;\n    note.textContent = T.count.replace('%d', servers.length)\n      + (keyword ? '' : (hidden > 0 ? ' \u00b7 ' + T.hiddenHint.replace('%d', hidden) : ''));\n    if(!list.length){ grid.innerHTML = '<div class=\"mcsl-sv-note\">' + esc(T.empty) + '<\/div>'; }\n  }\n\n  function renderBatch(){\n    var slice = list.slice(rendered, rendered + BATCH);\n    var html = slice.map(cardHtml).join('');\n    grid.insertAdjacentHTML('beforeend', html);\n    rendered += slice.length;\n    loadBtn.hidden = rendered >= list.length;\n    scheduleExposures();\n  }\n\n  function scheduleExposures(){\n    var cards = grid.querySelectorAll('[data-ad]');\n    for(var i = 0; i < cards.length; i++){\n      var card = cards[i];\n      if(card.dataset.exposureScheduled === '1') continue;\n      card.dataset.exposureScheduled = '1';\n      (function(el){\n        setTimeout(function(){\n          if(!document.body.contains(el)) return;\n          var id = Number(el.dataset.ad);\n          if(exposureOnce(id)) report(id, id, el.dataset.slot, 'exposure');\n        }, 1000);\n      })(card);\n    }\n  }\n\n  \/\/ ---------- \u5de6\u53f3\u4fa7\u680f\u5e7f\u544a\u4f4d\uff08\u53ea\u6709\u5bbd\u5c4f\u663e\u793a\uff1b\u6ca1\u6709\u5728\u6295\u5e7f\u544a\u5c31\u7559\u7a7a\uff09 ----------\n  function renderRails(){\n    if(!cfg.showAds) return;\n    var left = document.getElementById('mcsl-sv-rail-left');\n    var right = document.getElementById('mcsl-sv-rail-right');\n    function fill(box, slot){\n      if(!box) return;\n      var ad = ads.filter(function(a){ return a.slot === slot; })[0];\n      if(!ad){ box.innerHTML = ''; return; }\n      var st = statusMap[ad.serverId] || {};\n      box.innerHTML = '<article class=\"mcsl-sv-card\" data-ad=\"' + ad.campaignId + '\" data-slot=\"' + esc(ad.slot) + '\">'\n        + '<div class=\"mcsl-sv-card__name\"><span class=\"mcsl-sv-badge\">' + esc(T.promoted) + '<\/span><\/div>'\n        + '<div style=\"font-weight:600;margin-top:6px\">' + esc(ad.title) + '<\/div>'\n        + '<div class=\"mcsl-sv-card__addr\">' + esc(ad.serverIp || '') + '<\/div>'\n        + (ad.description ? '<div class=\"mcsl-sv-card__motd\" style=\"height:auto;max-height:none\">' + motdHtml(ad.description) + '<\/div>' : '')\n        + '<div class=\"mcsl-sv-card__sig\">' + esc(signal(st.level || 'unknown')[0]) + ' \u00b7 ' + players(st) + '<\/div>'\n        + '<\/article>';\n      exposureOnce(ad.campaignId) && setTimeout(function(){\n        if(box.querySelector('[data-ad]')) report(ad.campaignId, ad.campaignId, ad.slot, 'exposure');\n      }, 1000);\n    }\n    fill(left, 'web_rail_left');\n    fill(right, 'web_rail_right');\n  }\n\n  function findServer(id){ for(var i = 0; i < servers.length; i++){ if(servers[i].id === id) return servers[i]; } return null; }\n\n  function openDetail(id){\n    var e = findServer(id);\n    if(!e) return;\n    var st = statusMap[id] || {};\n    var rows = [];\n    rows.push(['\u7248\u672c', e.version || '\u2014']);\n    rows.push(['\u52a0\u8f7d\u5668', e.loader || '\u2014']);\n    rows.push(['\u5730\u533a', e.region || '\u2014']);\n    rows.push(['\u4fe1\u53f7', signal(st.level || 'unknown')[0]]);\n    rows.push(['\u5728\u7ebf\u4eba\u6570', players(st)]);\n    rows.push(['\u6b63\u7248\u9a8c\u8bc1', e.requirePremium === true ? '\u9700\u6b63\u7248' : (e.requirePremium === false ? '\u65e0\u6b63\u7248\u9a8c\u8bc1' : '\u672a\u6807\u6ce8')]);\n    rows.push(['\u767d\u540d\u5355', e.whitelist === true ? '\u9700\u767d\u540d\u5355' : (e.whitelist === false ? '\u65e0\u767d\u540d\u5355' : '\u672a\u6807\u6ce8')]);\n    if(e.loginMode) rows.push(['\u767b\u5f55\u65b9\u5f0f', e.loginMode]);\n    if(e.serverType) rows.push(['\u670d\u52a1\u5668\u7c7b\u578b', e.serverType]);\n    if(e.lines && e.lines.length) rows.push(['\u7ebf\u8def', e.lines.join(' \/ ')]);\n    if(e.rating != null) rows.push(['\u8bc4\u5206', e.rating + ' \u5206']);\n    if(e.sourceName) rows.push(['\u6570\u636e\u6765\u6e90', e.sourceName]);\n    var richIntro = renderRich(e.longDescription || e.description);\n    var clientUrl = '';\n    if(e.requiresCustomClient){\n      if(e.clientDownloads && e.clientDownloads.length){ clientUrl = e.clientDownloads[0].url || ''; }\n      else if(e.clientDownloadUrl){ clientUrl = e.clientDownloadUrl; }\n    }\n    var downloadHref = clientUrl || cfg.download;\n    var downloadLabel = clientUrl ? T.downloadClient : T.downloadLauncher;\n\n    var addr = (e.addresses && e.addresses.length ? e.addresses : [{label:'\u4e3b\u7ebf\u8def', endPoint:endpointOf(e)}]).map(function(a){\n      return '<div class=\"mcsl-sv-modal__row\"><span>' + esc(a.label || '') + '<\/span><b>' + esc(a.endPoint || '') + '<\/b><\/div>'; }).join('');\n\n    var modal = document.createElement('div');\n    modal.className = 'mcsl-sv-modal';\n    modal.innerHTML = '<div class=\"mcsl-sv-modal__box\">'\n      + '<h3 style=\"margin:0 0 4px\">' + esc(e.name) + '<\/h3>'\n      + '<div class=\"mcsl-sv-note\">' + esc(endpointOf(e)) + '<\/div>'\n      + addr\n      + (st.motd ? '<div class=\"mcsl-sv-modal__row\"><b>MOTD<\/b><span style=\"white-space:pre-line\">' + motdHtml(st.motd) + '<\/span><\/div>' : '')\n      + rows.map(function(r){ return '<div class=\"mcsl-sv-modal__row\"><b>' + esc(r[0]) + '<\/b><span>' + esc(r[1]) + '<\/span><\/div>'; }).join('')\n      + (richIntro ? '<div style=\"margin-top:10px\"><b style=\"font-size:13px;color:#4a5a6a\">\u4ecb\u7ecd<\/b>'\n          + '<div style=\"margin-top:6px;font-size:14px;line-height:1.85;color:#41505f\">' + richIntro + '<\/div><\/div>' : '')\n      + '<div style=\"margin-top:14px\">'\n      + '<a class=\"mcsl-sv-btn\" href=\"' + esc(downloadHref) + '\">' + esc(downloadLabel) + '<\/a>'\n      + (endpointOf(e) ? '<button class=\"mcsl-sv-btn mcsl-sv-btn--ghost\" id=\"mcsl-sv-copy\">' + esc(T.copy) + '<\/button>' : '')\n      + (e.officialSite ? '<a class=\"mcsl-sv-btn mcsl-sv-btn--ghost\" href=\"' + esc(e.officialSite) + '\" target=\"_blank\" rel=\"noopener\">\u5b98\u7f51<\/a>' : '')\n      + '<button class=\"mcsl-sv-btn mcsl-sv-btn--ghost\" id=\"mcsl-sv-close\">\u5173\u95ed<\/button>'\n      + '<\/div><\/div>';\n    document.body.appendChild(modal);\n    modal.addEventListener('click', function(ev){ if(ev.target === modal) modal.remove(); });\n    var close = modal.querySelector('#mcsl-sv-close');\n    if(close) close.onclick = function(){ modal.remove(); };\n    var copy = modal.querySelector('#mcsl-sv-copy');\n    if(copy) copy.onclick = function(){\n      try{\n        navigator.clipboard.writeText(endpointOf(e));\n        copy.textContent = T.copied;\n    var seenAd = cfg.showAds ? ads.find(function(a){ return a.serverId === e.id; }) : null;\n        if(seenAd) report(seenAd.campaignId, seenAd.campaignId, seenAd.slot, 'click_copy_ip');\n      }catch(err){}\n    };\n  }\n\n  \/\/ \u7528 document \u7ea7\u59d4\u6258\uff1a\u4e2d\u95f4\u7684\u5217\u8868\u5361\u4e0e\u5de6\u53f3\u4fa7\u680f\u5e7f\u544a\u5361\u90fd\u80fd\u70b9\u5f00\u8be6\u60c5\n  document.addEventListener('click', function(ev){\n    var card = ev.target.closest ? ev.target.closest('.mcsl-sv-card') : null;\n    if(!card) return;\n    if(card.dataset.ad){\n      report(Number(card.dataset.ad), Number(card.dataset.ad), card.dataset.slot, 'click_detail');\n      var ad = ads.find(function(a){ return String(a.campaignId) === card.dataset.ad; });\n      if(ad && ad.serverId) openDetail(ad.serverId);\n      return;\n    }\n    openDetail(card.dataset.id);\n  });\n\n  qBox.addEventListener('input', function(){ keyword = qBox.value.trim(); render(); });\n  sortBox.addEventListener('change', render);\n  loadBtn.addEventListener('click', renderBatch);\n  filtersBtn.addEventListener('click', function(){\n    var modal = document.createElement('div');\n    modal.className = 'mcsl-sv-modal';\n    modal.innerHTML = '<div class=\"mcsl-sv-modal__box\"><h3 style=\"margin:0 0 8px\">' + esc(T.moreFilters) + '<\/h3>'\n      + '<p style=\"line-height:1.8;color:#4a5a6a\">' + esc(T.filtersHint) + '<\/p>'\n      + '<div style=\"margin-top:14px\"><a class=\"mcsl-sv-btn\" href=\"' + esc(cfg.download) + '\">' + esc(T.downloadLauncher) + '<\/a>'\n      + '<button class=\"mcsl-sv-btn mcsl-sv-btn--ghost\" id=\"mcsl-sv-close2\">\u5173\u95ed<\/button><\/div><\/div>';\n    document.body.appendChild(modal);\n    modal.addEventListener('click', function(ev){ if(ev.target === modal) modal.remove(); });\n    var close = modal.querySelector('#mcsl-sv-close2');\n    if(close) close.onclick = function(){ modal.remove(); };\n  });\n\n  var requests = [\n    json(API + '\/api\/v1\/catalog'),\n    json(API + '\/api\/v1\/status')\n  ];\n  if(cfg.showAds){\n    requests.push(json(API + '\/api\/v1\/ads?slots=web_after_4,web_after_20,web_after_40,web_rail_left,web_rail_right&limit=1').catch(function(){ return {data:[]}; }));\n  } else {\n    requests.push(Promise.resolve({data:[]}));\n  }\n  requests.push(json(API + '\/api\/v1\/heat?limit=200').catch(function(){ return []; }));\n  Promise.all(requests).then(function(res){\n    servers = (res[0] && res[0].servers) ? res[0].servers : [];\n    (res[1] || []).forEach(function(s){ statusMap[s.id] = s; });\n    ads = (res[2] && res[2].data) ? res[2].data : [];\n    (res[3] || []).forEach(function(h){ heatMap[h.id] = h.score; });\n    if(!ads.length){\n      var layout = document.querySelector('.mcsl-sv-layout');\n      if(layout) layout.classList.add('mcsl-sv-layout--no-ads');\n    }\n    render();\n    renderRails();\n  }).catch(function(){\n    note.textContent = T.failed;\n  });\n})();<\/script>\n<h2>\u6536\u5f55\u6807\u51c6<\/h2>\n<ul>\n<li>\u6709\u516c\u5f00\u53ef\u67e5\u7684\u5ba3\u4f20\u8d34\u6216\u5b98\u7f51\uff1b<\/li>\n<li>\u5730\u5740\u53ef\u76f4\u8fde\uff08\u6216\u660e\u786e\u8bf4\u660e\u901a\u8fc7\u4e13\u5c5e\u5ba2\u6237\u7aef\u8fdb\u5165\uff09\uff1b<\/li>\n<li>\u4e0d\u6536\u5f55\u5916\u6302\u670d\u3001\u8d4c\u670d\u4e0e\u8fdd\u53cd Minecraft \u4f7f\u7528\u6761\u6b3e\u7684\u670d\u52a1\u5668\u3002<\/li>\n<\/ul>\n<h2>\u60f3\u628a\u81ea\u5df1\u7684\u670d\u52a1\u5668\u52a0\u8fdb\u6765\uff1f<\/h2>\n<p>\u524d\u5f80<a href=\"\/advertiser\/\">\u670d\u4e3b\u5165\u53e3<\/a>\u767b\u5f55\u540e\u63d0\u4ea4\u6216\u8ba4\u9886\u670d\u52a1\u5668\uff1b\u5ba1\u6838\u901a\u8fc7\u540e\u4f1a\u540c\u6b65\u5230\u5b98\u7f51\u4e0e\u542f\u52a8\u5668\u76ee\u5f55\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5b98\u7f51\u76ee\u5f55\u7531\u670d\u52a1\u7aef\u5b9e\u65f6\u4e0b\u53d1\uff0c\u53ef\u641c\u7d22\u3001\u6392\u5e8f\u548c\u67e5\u770b\u8be6\u60c5\uff1b\u7248\u672c \/ \u52a0\u8f7d\u5668 \/ \u73a9\u6cd5\u7b5b\u9009 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-12","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/pages\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":7,"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/pages\/12\/revisions"}],"predecessor-version":[{"id":91,"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/pages\/12\/revisions\/91"}],"wp:attachment":[{"href":"https:\/\/worldcraft.com.cn\/index.php\/wp-json\/wp\/v2\/media?parent=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}