feat: 发布咸鱼喵喵全能助手,加入全收集地图与图文说明
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
// Renders only inventory thumbnails through the game's own UI icon mapping.
|
||||
// Data URLs stay in memory; no game textures are exported to the filesystem.
|
||||
async function readItemIcons(items) {
|
||||
if (typeof Sprite_ItemIcon === 'undefined') throw new Error('游戏图标组件尚未就绪');
|
||||
const bitmaps = new Map();
|
||||
for (const item of items) {
|
||||
if (!bitmaps.has(item.type)) bitmaps.set(item.type,Sprite_ItemIcon.prototype.itemBitmap(item.type));
|
||||
}
|
||||
await Promise.all([...new Set(bitmaps.values())].map(bitmap=>new Promise((resolve,reject)=>{
|
||||
if (bitmap.isReady()) return resolve();
|
||||
if (bitmap.isError?.()) return reject(new Error('物品图标加载失败'));
|
||||
const timer=setTimeout(()=>reject(new Error('物品图标加载超时,请重试')),8000);
|
||||
bitmap.addLoadListener(()=>{ clearTimeout(timer); resolve(); });
|
||||
})));
|
||||
const icons = {};
|
||||
for (const item of items) {
|
||||
const bitmap = bitmaps.get(item.type);
|
||||
let frame;
|
||||
const proxy = { _type:item.type, bitmap, setFrame(x,y,width,height) { frame={x,y,width,height}; } };
|
||||
Sprite_ItemIcon.prototype.refreshIdx.call(proxy,item.id);
|
||||
const {x,y,width,height} = frame;
|
||||
if (![x,y,width,height].every(Number.isFinite) || width <= 0 || height <= 0 || width > 512 || height > 512 ||
|
||||
x < 0 || y < 0 || x+width > bitmap.width || y+height > bitmap.height) throw new Error('物品图标裁切范围无效');
|
||||
const canvas=document.createElement('canvas'); canvas.width=width; canvas.height=height;
|
||||
const context=canvas.getContext('2d'); context.imageSmoothingEnabled=false;
|
||||
context.drawImage(bitmap.canvas,x,y,width,height,0,0,width,height);
|
||||
icons[item.type+':'+item.id]=canvas.toDataURL('image/png');
|
||||
}
|
||||
return {ok:true,icons};
|
||||
}
|
||||
module.exports = { readItemIcons };
|
||||
Reference in New Issue
Block a user