GM 页改版:加回满疲劳/赞助页,去掉背包与邮件页和重复标题
- 角色页新增「回满疲劳」,走 POST /dnf/gm/characters/{id}/fatigue/refill(需角色下线)
- 新增「赞助」页:支付宝 / 微信收款码占位,图放 gmweb/qr/ 下即显示
- 删除背包页与邮件页(发到邮箱按钮保留在发物品页)
- 去掉页头「GM 控制台」文字(窗口标题栏已画标题,重复),页头只留连接状态
- serve.py 补 jpg/jpeg/gif/webp/bmp/svg 的 MIME
- 控制台宽度 1040 -> 920
This commit is contained in:
1 parent
7f41f9797a
commit
06558415da
6 files changed
+91
-103
No files matched your search
+31
-79
@@ -4,7 +4,7 @@
|
||||
'use strict';
|
||||
|
||||
var S = {
|
||||
charId: '', charName: '', chars: [], bagRows: [],
|
||||
charId: '', charName: '', chars: [],
|
||||
itemId: 0, itemName: '', picked: null, items: [],
|
||||
page: 1, pageSize: 20, total: 0
|
||||
};
|
||||
@@ -66,7 +66,6 @@
|
||||
for (var j = 0; j < panes.length; j++) {
|
||||
panes[j].className = 'pane' + (panes[j].id === 'pane-' + name ? ' on' : '');
|
||||
}
|
||||
if (name === 'bag') { loadBag(0); }
|
||||
}
|
||||
|
||||
function bindTabs() {
|
||||
@@ -156,6 +155,17 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
/* 一键回满疲劳:直接把库里 fatigue 写回上限。
|
||||
服务端要求角色已下线(在线时写库会被下一个存档覆盖),所以在线角色会报错。 */
|
||||
function refillFatigue() {
|
||||
if (!requireChar()) { return; }
|
||||
api('/dnf/gm/characters/' + S.charId + '/fatigue/refill', 'POST', {}, function (d) {
|
||||
if (!d) { return; }
|
||||
log('已回满 ' + S.charName + ' 的疲劳值', 'ok');
|
||||
loadChars();
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- 物品 */
|
||||
|
||||
/* 装备类型标签:PVF 里是 "[weapon]" 这种,去掉括号后映射成中文。 */
|
||||
@@ -384,10 +394,7 @@
|
||||
var data = d.data || {};
|
||||
log('已发 ' + S.itemName + ' ×' + n + optText(o) +
|
||||
(data.slot != null ? ',格位 ' + data.list_type + ':' + data.slot : ''), 'ok');
|
||||
// 发完立刻切到背包页并高亮这一行:到底有没有进包,玩家要看得见
|
||||
switchTab('bag');
|
||||
loadBag(S.itemId);
|
||||
setTimeout(function () { loadBag(S.itemId); }, 600);
|
||||
// 回游戏里看背包即可(客户端会自动刷新),这里不再切页打断操作
|
||||
});
|
||||
}
|
||||
|
||||
@@ -406,78 +413,22 @@
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- 背包 */
|
||||
/* ---------------------------------------------------------------- 赞助 */
|
||||
|
||||
/* 背包 / 穿戴的实时快照。GM 发完东西,玩家第一件事就是看它到底进没进包,
|
||||
所以这里按服务端实际存的行来列,不做任何本地猜测。 */
|
||||
function loadBag(highlightItemId) {
|
||||
if (!S.charId) {
|
||||
$('bag-list').innerHTML = '<div class="empty">先在「角色」页选一个角色</div>';
|
||||
$('bag-info').innerHTML = '-';
|
||||
return;
|
||||
}
|
||||
api('/local/dnf-gm/inventory/list?character_id=' + encodeURIComponent(S.charId),
|
||||
'GET', null, function (d) {
|
||||
if (!d) { return; }
|
||||
var data = d.data || {};
|
||||
S.bagRows = data.rows || [];
|
||||
renderBag(highlightItemId || 0);
|
||||
});
|
||||
}
|
||||
|
||||
function renderBag(highlightItemId) {
|
||||
var box = $('bag-list');
|
||||
var rows = S.bagRows || [];
|
||||
var bagCount = 0, wearCount = 0, i;
|
||||
for (i = 0; i < rows.length; i++) {
|
||||
if (rows[i].collection === 'wear') { wearCount++; } else { bagCount++; }
|
||||
}
|
||||
$('bag-info').innerHTML = '背包 ' + bagCount + ' 件 · 穿戴 ' + wearCount + ' 件';
|
||||
|
||||
if (!rows.length) {
|
||||
box.innerHTML = '<div class="empty">背包是空的</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
// 刚发进去的排在最前面,其余保持服务端顺序
|
||||
var ordered = [];
|
||||
if (highlightItemId) {
|
||||
for (i = 0; i < rows.length; i++) {
|
||||
if (rows[i].item_id === highlightItemId) { ordered.push(rows[i]); }
|
||||
}
|
||||
}
|
||||
for (i = 0; i < rows.length; i++) {
|
||||
if (!highlightItemId || rows[i].item_id !== highlightItemId) { ordered.push(rows[i]); }
|
||||
}
|
||||
|
||||
var h = [];
|
||||
for (i = 0; i < ordered.length; i++) {
|
||||
var r = ordered[i];
|
||||
var isNew = highlightItemId && r.item_id === highlightItemId;
|
||||
h.push('<div class="li' + (isNew ? ' on' : '') + '">' +
|
||||
'<span class="nm">' + esc(r.item_name || ('物品 ' + r.item_id)) +
|
||||
(isNew ? ' <em class="new">新</em>' : '') + '</span>' +
|
||||
'<span class="meta">' + (r.collection === 'wear' ? '穿戴' : '背包') +
|
||||
' · ' + esc(r.entry_key) + ' · id ' + esc(r.item_id) +
|
||||
(r.count > 1 ? ' ×' + esc(r.count) : '') + '</span></div>');
|
||||
}
|
||||
box.innerHTML = h.join('');
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- 邮件 */
|
||||
|
||||
function sendMail() {
|
||||
if (!requireChar()) { return; }
|
||||
var gold = parseInt($('in-goldmail').value, 10) || 0;
|
||||
api('/local/dnf-gm/mail', 'POST', {
|
||||
character_name: S.charName,
|
||||
title: $('in-title').value || 'GM 邮件',
|
||||
body: $('in-body').value || '',
|
||||
gold: gold,
|
||||
attachments: []
|
||||
}, function (d) {
|
||||
if (d) { log('邮件已发送给 ' + S.charName, 'ok'); }
|
||||
});
|
||||
/* 收款码图片是可选的:放了就显示,没放(404)就把占位提示顶上来。 */
|
||||
function bindQr(id) {
|
||||
var img = $(id);
|
||||
if (!img) { return; }
|
||||
img.onerror = function () {
|
||||
var box = this.parentNode;
|
||||
if (box) { box.className = 'qr-box miss'; }
|
||||
this.style.display = 'none';
|
||||
};
|
||||
img.onload = function () {
|
||||
var box = this.parentNode;
|
||||
if (box) { box.className = 'qr-box'; }
|
||||
this.style.display = '';
|
||||
};
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- 启动 */
|
||||
@@ -515,9 +466,8 @@
|
||||
bind('btn-prev', function () { if (S.page > 1) { loadItems(S.page - 1); } });
|
||||
bind('btn-next', function () { loadItems(S.page + 1); });
|
||||
bind('btn-grant', grantItem);
|
||||
bind('btn-bag', function () { loadBag(0); });
|
||||
bind('btn-mailitem', mailItem);
|
||||
bind('btn-mail', sendMail);
|
||||
bind('btn-fatigue', refillFatigue);
|
||||
|
||||
$('in-page-size').onchange = function () { loadItems(1); };
|
||||
$('in-group').onchange = function () { fillTypeOptions(); loadItems(1); };
|
||||
@@ -549,6 +499,8 @@
|
||||
};
|
||||
|
||||
fillTypeOptions();
|
||||
bindQr('qr-alipay');
|
||||
bindQr('qr-wechat');
|
||||
|
||||
renderPicked();
|
||||
forceIME();
|
||||
|
||||
Reference in new issue
Block a user