求助,读取最后一个使用的物品的ID
rpgmakermv吧
全部回复
仅看楼主
level 6
竹开0001 楼主
想做一个处理物品的公共事件,
但是,这个公共事件需要读取团队内“刚刚使用”的这个物品的ID,
网上查了脚本后发现跑不通,不知道是不是自己的用法错了,还是格式错了,还是缺哪些先决条件。
烦请各位大佬解答一二!
2025年07月22日 01点07分 1
level 6
竹开0001 楼主
我用的是MV版本,谢谢大佬的分情况解答,接下来我试一试。
2025年07月22日 22点07分 3
level 6
竹开0001 楼主
确实是能找到,在负责菜单界面的rpg_windows.js里。
这样推测的话,大概指的是“菜单界面”里,那种选择后,第二次进入菜单就直接选的功能,我看看正常的RPGMv能不能复现吧。
2025年07月22日 23点07分 4
level 6
竹开0001 楼主
和你这边提的一样。
RPGMv的菜单栏会记录你上一个使用的物品,我这边打开菜单后,使用了一个物品,然后关闭菜单。
再次打开后,菜单就自动弹到了那个物品的位置处,说明这段代码有效。
$gameParty.lastItem()
接下来我再试试该怎么用的更多一点。
2025年07月22日 23点07分 5
level 6
竹开0001 楼主
呃...程序没有崩溃,就说明逻辑能跑通,问题就在于结果不太对劲...
目前的程序是:
效果是:
2025年07月22日 23点07分 6
level 6
竹开0001 楼主
调整了$gameParty.lastItem(0)也是这样,没有让变量4正确读到物品ID
目前的程序是:
效果是:
2025年07月22日 23点07分 7
level 6
竹开0001 楼主
如果去掉那一行,直接给代码赋值的话,就会得到一个物品名称。
目前的程序是:
实际效果:
2025年07月22日 23点07分 8
level 6
竹开0001 楼主
直接用this._data.indexOf($gameParty.lastItem(1))的话,得到的结果是程序没有跑出来
目前的程序是:
实际效果:
2025年07月22日 23点07分 9
草好像是我少复制了1个),我补上)再试一试。
2025年07月22日 23点07分
level 6
竹开0001 楼主
把程序代码补上“)”后,继续运行,这边就立马表示找不到“indexOf”这条代码的定义了。
目前程序:
实现效果:
2025年07月22日 23点07分 10
level 6
竹开0001 楼主
虽然前面都失败了,但是证明了lastItem确实是开发Mv时用的“上一个物品”的代码,于是我多找了几个Js代码搜了一下,结果发现也有两条。
首先是控制“菜单场景类别”的scenes文件,这里发现了两行带lastItem的代码,这很可能是我看到的“选择上一个物品”。
然后是控制“团队信息”的代码,这里似乎会记录金币和道具,那么也可能是咱在找的东西。
2025年07月23日 00点07分 11
level 6
竹开0001 楼主
所以咱已经知道了lastItem是能调用物品ID的语句,问题就在于怎么用这行代码,
这边再试试吧。
2025年07月23日 00点07分 12
@写给妖精的情诗 OK好的,等回家再试一试[你懂的]
2025年07月23日 10点07分
level 6
竹开0001 楼主
喜报,成功了!
我直接让DeepSeek帮我写了一个插件!
让它成功监听了Game_Party.prototype.lastItem = function()这一系的代码,
让我能显示正确的物品ID名!
2025年07月23日 15点07分 14
level 6
竹开0001 楼主
【以下是DeepSeek帮我写的插件代码,分享给大家】
【复制到——游戏项目\js\plugins里新建的——LastUsedItem.js——即可使用】
//=============================================================================
// LastItemToVariable.js
//=============================================================================
/*:
* @plugindesc 将队伍最后使用的道具ID记录到4号变量
* @Author DeepSeek
*
* @help 此插件会在不修改核心代码的情况下,将最后使用的道具ID存储到4号游戏变量
*
* 插件命令:
* 无需插件命令,自动生效
* 注意:
*
* 这个插件必须等物品【使用结束】后才能检测到物品ID,
* 换句话说,它不能用到使用物品时触发的公共事件上,
* 否则会出现错误。
*
* 处理方法也很简单:
*
* S1物品使用时触发1个公共事件,这个公共事件会开启1个开关。
* S2开启的开关会启动另1个公共事件,它的变量就能保存【最后使用的物品ID】。
* S3展示一个文本,内容为\ni[\v[4]]——————验证你有没有读到正确的物品名称。
*
* @param Variable ID
* @贴吧用户_0t83NWe960 用于存储最后使用道具ID的变量编号 (默认:4)
* @type number
* @min 1
* @default 4
*
*/
(() => {
// 读取插件参数
const parameters = PluginManager.parameters('LastItemToVariable');
const TARGET_VARIABLE_ID = Number(parameters['Variable ID'] || 4);
// 核心方法:更新变量
const updateVariable = item => {
if (item && DataManager.isItem(item)) {
$gameVariables.setValue(TARGET_VARIABLE_ID, item.id);
}
};
// 方法1: 通过别名重写setLastItem
const _Game_Party_setLastItem = Game_Party.prototype.setLastItem;
Game_Party.prototype.setLastItem = function(item) {
_Game_Party_setLastItem.call(this, item);
updateVariable(item);
};
// 方法2: 战斗中使用道具的监听
const _Game_Action_useItem = Game_Action.prototype.useItem;
Game_Action.prototype.useItem = function() {
const item = this.item();
updateVariable(item);
return _Game_Action_useItem.apply(this, arguments);
};
// 方法3: 菜单中使用道具的监听
const _Window_ItemList_callOkHandler = Window_ItemList.prototype.callOkHandler;
Window_ItemList.prototype.callOkHandler = function() {
const item = this.item();
updateVariable(item);
return _Window_ItemList_callOkHandler.call(this);
};
})();
2025年07月23日 15点07分 15
level 6
竹开0001 楼主
AI太伟大了[太开心]
让我一个不会写代码的人,也能通过硬翻游戏中原有的代码,整出一个能用的插件!
多亏了Mv引擎的拓展性,和DeepSeek的写代码功能!
2025年07月23日 15点07分 16
level 1
你要的是物品id,lastitem返回的是物品对象,如果你知道id是对象的一个键值直接写就行了
2025年07月23日 15点07分 17
1