查看: 940|回复: 10

[有事请教] 为什么负重插件MrTS_LimitedInventory.js一直出现错误?

[复制链接]
梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
发表于 2024-4-22 21:09:57 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
这是关于负重系统的插件,使用上很简单,本来测试也没什么问题

但最近才发现,装备穿回的时候就会出现错误,游戏崩溃,道具栏新增删除都没有问题

就只有装备穿回的时候,游戏就崩溃

螢幕擷取畫面 2024-04-22 204955.jpg

[pre lang="javascript"]//=============================================================================
// MrTS_LimitedInventory.js
//=============================================================================

/*:
* @plugindesc Limits inventory space by weight or item numbers.
* @author Mr. Trivel
*
* @param Limit Mode
* @desc Which mode to use? weight/number
* Default: number
* @default number
*
* @param Default Limit
* @desc Inventory limit.
* Default: 30
* @default 30
*
* @param Default Weight
* @desc If using 'weight' mode, how much items weight by default?
* Default: 1
* @default 1
*
* @param Show Window
* @desc Show inventory limit window in item menu? true/false
* Default: True
* @default True
*
* @param Limit Text
* @desc How will limit be named in Window?
* Default: Limit:
* @default Limit:
*
* @help
* --------------------------------------------------------------------------------
* Terms of Use
* --------------------------------------------------------------------------------
* Don't remove the header or claim that you wrote this plugin.
* Credit Mr. Trivel if using this plugin in your project.
* Free for commercial and non-commercial projects.
* --------------------------------------------------------------------------------
* Version 1.0
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Item Tags
* --------------------------------------------------------------------------------
* <Weight: [AMOUNT]>
* If using 'weight' mode, use the following to determine the weight of item.
*
* Example:
* <Weight: 5>
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Equipment Tags
* --------------------------------------------------------------------------------
* <InvLimitChange: [AMOUNT]>
* Changes inventory limit by AMOUNT while item is equipped. Works for both modes.
*
* <InvLimitChange: -5>
* <InvLimitChange: 10>
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Plugin Commands
* --------------------------------------------------------------------------------
* InventoryLimit Add [AMOUNT] - Adds Amount to limit.
* InventoryLimit Sub [AMOUNT] - Removes Amount from limit.
* InventoryLimit Ignore - Ignores inventory limit when adding items
* InventoryLimit StopIgnore - Stops ignoring inventory limit when adding items
*
* Examples:
* InventoryLimit Add 10
* InventoryLimit Sub 5
* InventoryLimit Ignore
* InventoryLimit StopIgnore
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Script Calls
* --------------------------------------------------------------------------------
* $gameParty.getInventorySpaceLeft() - returns amount of space left
* $gameParty.getInventorySpaceTotal() - returns total amount of space
* $gameParty.getInventorySpaceUsed() - returns used amount of space
* --------------------------------------------------------------------------------
*
* --------------------------------------------------------------------------------
* Version History
* --------------------------------------------------------------------------------
* 1.0 - Release
*/

(function() {
        var parameters = PluginManager.parameters('MrTS_LimitedInventory');
        var paramLimitMode = String(parameters['Limit Mode'] || "number");
        var paramDefaultLimit = Number(parameters['Default Limit'] || 30);
        var paramDefaultWeight = Number(parameters['Default Weight'] || 1);
        var paramShowWindow = (parameters['Show Window'] || "true").toLowerCase() === "true";
        var paramLimitText = String(parameters['Limit Text'] || "Limit:");

        //--------------------------------------------------------------------------
        // Game_Interpreter
        //
       
        var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
        Game_Interpreter.prototype.pluginCommand = function(command, args) {
                _Game_Interpreter_pluginCommand.call(this, command, args);
                if (command.toLowerCase() === "inventorylimit") {
                        switch (args[0].toUpperCase())
                        {
                                case 'ADD':
                                {
                                        $gameParty.increaseInventorySpace(Number(args[1]));
                                } break;
                                case 'SUB':
                                {
                                        $gameParty.decreaseInventorySpace(Number(args[1]));
                                } break;
                                case 'IGNORE':
                                {
                                        $gameParty._ignoreInvLimit = true;
                                } break;
                                case 'STOPIGNORE':
                                {
                                        $gameParty._ignoreInvLimit = false;
                                } break;                               
                        }
                }
        };

        //--------------------------------------------------------------------------
        // Game_Party

        var _Game_Party_initialize = Game_Party.prototype.initialize;
        Game_Party.prototype.initialize = function() {
                _Game_Party_initialize.call(this);
                this._inventorySpace = paramDefaultLimit;
                this._modifiedInvSpace = 0;
                this._ignoreInvLimit = false;
        };

        Game_Party.prototype.increaseInventorySpace = function(amount) {
                this._modifiedInvSpace += amount;
        };

        Game_Party.prototype.decreaseInventorySpace = function(amount) {
                this.increaseInventorySpace(-amount);
        };

        Game_Party.prototype.getInventorySpaceTotal = function() {
                var base = this._inventorySpace;
                var mod = this._modifiedInvSpace;
                var equipment = 0;
                for (var i = 0; i < this.members().length; i++) {
                        equipment += this.members().getInventorySpaceBonus();
                }
                return Math.max(0, (base+mod+equipment));
        };

        Game_Party.prototype.getInventorySpaceUsed = function() {
                var used = 0;
                for (var i = 0; i < this.allItems().length; i++) {
                        switch(paramLimitMode)
                        {
                                case 'number':
                                {
                                        used += this.numItems(this.allItems());
                                } break;
                                case 'weight':
                                {
                                        var weight = this.allItems().meta.Weight ? Number(this.allItems().meta.Weight) : paramDefaultWeight;
                                        used += this.numItems(this.allItems()) * weight;
                                } break;
                               
                        }
                }
                return used;
        };

        Game_Party.prototype.getInventorySpaceLeft = function() {
                return this.getInventorySpaceTotal() - this.getInventorySpaceUsed();
        };

        Game_Party.prototype.getItemWeight = function(item) {
                switch(paramLimitMode)
                {
                        case 'number':
                        {
                                return 1;
                        } break;
                        case 'weight':
                        {
                                var weight = item.meta.Weight ? Number(item.meta.Weight) : paramDefaultWeight;
                                return weight;
                        } break;
                       
                }
                return 1;
        };

        var _Game_Party_gainItem = Game_Party.prototype.gainItem;
        Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
                if (amount < 0 || this._ignoreInvLimit) _Game_Party_gainItem.call(this, item, amount, includeEquip);
                else
                {
                        var weight = this.getItemWeight(item);
                        var tWeight = weight * amount;
                        var aWeight = this.getInventorySpaceLeft();
                        if ((aWeight - tWeight) >= 0) _Game_Party_gainItem.call(this, item, amount, includeEquip);
                        else
                        {
                                var newAmount = Math.floor(aWeight/weight);
                                if (newAmount > 0)
                                        _Game_Party_gainItem.call(this, item, newAmount, includeEquip);
                        }
                }
        };

        Game_Actor.prototype.getInventorySpaceBonus = function() {
                var bonus = 0;
                for (var i = 0; i < this.equips().length; i++) {
                        if (!this.equips()) continue;
                        if (this.equips().meta.InvLimitChange)
                                bonus += Number(this.equips().meta.InvLimitChange);
                }
                return bonus;
        };

        //--------------------------------------------------------------------------
        // Window_InventoryLimit
        //
        // Shows how much is left.
       
        function Window_InventoryLimit() {
                this.initialize.apply(this, arguments);       
        };
       
        Window_InventoryLimit.prototype = Object.create(Window_Base.prototype);
        Window_InventoryLimit.prototype.constructor = Window_InventoryLimit;
       
        Window_InventoryLimit.prototype.initialize = function(x, y, w, h) {
                Window_Base.prototype.initialize.call(this, x, y, w, h);
                this.refresh();
        };
       
        Window_InventoryLimit.prototype.refresh = function() {
                this.contents.clear();
                var u = $gameParty.getInventorySpaceUsed();
                var t = $gameParty.getInventorySpaceTotal();
                this.drawText(paramLimitText + " " + u + "/" + t, 0, 0);
        };

        //--------------------------------------------------------------------------
        // Scene_Item
        //

        var _Scene_Item_create = Scene_Item.prototype.create;
        Scene_Item.prototype.create = function() {
                _Scene_Item_create.call(this);
                if (paramShowWindow)
                        this.createLimitWindow();
        };

        Scene_Item.prototype.createLimitWindow = function() {
                var wx = this._itemWindow.x;
                var ww = this._itemWindow.width;
                var wh = this._itemWindow.fittingHeight(1);
                this._itemWindow.height = this._itemWindow.height - wh;
                this._itemWindow.refresh();
                var wy = this._itemWindow.y + this._itemWindow.height;
                this._invLimitWindow = new Window_InventoryLimit(wx, wy, ww, wh);
                this.addWindow(this._invLimitWindow);
        };

        var _Scene_Item_useItem = Scene_Item.prototype.useItem;
        Scene_Item.prototype.useItem = function() {
                _Scene_Item_useItem.call(this);
                if (this._invLimitWindow) this._invLimitWindow.refresh();
        };
})();
[/pre]

这是跳出错误代码的位置

[pre lang="javascript"]                        {
                                var weight = item.meta.Weight ? Number(item.meta.Weight) : paramDefaultWeight;
                                return weight;
                        } break;
                       
                }
                return 1;
        };

        var _Game_Party_gainItem = Game_Party.prototype.gainItem;
        Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
                if (amount < 0 || this._ignoreInvLimit) _Game_Party_gainItem.call(this, item, amount, includeEquip);
                else[/pre]


拜托了,真是完全找不到原因

点评

如果想治标不治本的话可以把问号前面的 "item.meta.Weight" 改成 "item&&item.meta&&item.meta.Weight" 这种连锁检查的写法。  发表于 2024-4-23 16:15
梦石
0
星屑
1333
在线时间
471 小时
注册时间
2012-4-8
回帖
314
发表于 2024-4-22 21:20:24 | 显示全部楼层
可能是 Scene_Equip.prototype.onItemOk 获取了错误的 item ?
可以看看 this.actor().changeEquip(this._slotWindow.index(), this._itemWindow.item());
看看 _itemWindow Window_EquipItem 究竟给了什么,干了什么
pokemon 和 digimon 正在路上
回复

使用道具 举报

梦石
0
星屑
10274
在线时间
1919 小时
注册时间
2020-1-2
回帖
1043
发表于 2024-4-22 21:55:49 | 显示全部楼层
这是另一个重量你尝试看看如果需要仓库的我到时候再发但是是不同作者的插件

DEX_WeightLimit.zip

3.15 KB, 下载次数: 11

B站没人气的夏目漠漠,直播间:5378938实用插件教程点击红字传送
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-22 22:32:25 | 显示全部楼层
xiamumomo 发表于 2024-4-22 21:55
这是另一个重量你尝试看看如果需要仓库的我到时候再发但是是不同作者的插件 ...

谢谢,感觉用起来差不多,但这个没出错误

仓库的插件我也满需要的...目前是用PH_Warehouse,就介面稍嫌不满意
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-22 22:47:24 | 显示全部楼层
505681468 发表于 2024-4-22 21:20
可能是 Scene_Equip.prototype.onItemOk 获取了错误的 item ?
可以看看 this.actor().changeEquip(this._s ...

谢谢帮忙,但这我看不懂...还是想修好这个错误...
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-22 23:48:52 | 显示全部楼层
xiamumomo 发表于 2024-4-22 21:55
这是另一个重量你尝试看看如果需要仓库的我到时候再发但是是不同作者的插件 ...

研究很久有两个小问题...
1.刚进入游戏他不会运行,要点一次道具栏才会启动,很奇怪
2.游戏内没办法提高负重上限...
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-23 01:03:10 | 显示全部楼层
var weight = item.meta.Weight ? Number(item.meta.Weight) : paramDefaultWeight;
return weight;

var weight = this.getItemWeight(item);
var tWeight = weight * amount;

不管怎么修永远都会出现194跟207的错误...这是插件的BUG吗....
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-23 01:30:18 | 显示全部楼层
好吧,不是插件BUG

我重开专案只装负重插件就一切正常
我以为有插件冲突,所以把原专案的插件全都关闭,问题依旧
可能以前有动到基本程式,所以把新专案的js档案盖上,问题依旧
游戏内有事件脚本写错? 我把事件全部关闭,问题依旧

................我能关的都关完了,还有哪里有可能出问题阿....
回复

使用道具 举报

梦石
0
星屑
1333
在线时间
471 小时
注册时间
2012-4-8
回帖
314
发表于 2024-4-23 03:19:06 | 显示全部楼层
本帖最后由 505681468 于 2024-4-23 03:27 编辑

[原因]
穿脱装备的时候,会脱空装备,脚本做的判断漏判了
也可能是版本更新的原因,导致的错误

[解决]
试试在脚本后面补一句

[测试]
简单看了下穿脱,没发现啥,原理应该就是这样,而且环境不一样,有其他问题可以说说

  1.         var _Game_Party_gainItem_fix = Game_Party.prototype.gainItem;
  2.         Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
  3.             var container = this.itemContainer(item);
  4.             if (container) {
  5.                 _Game_Party_gainItem_fix.call(this, item, amount, includeEquip)
  6.             }
  7.         };
复制代码




另外,这个好像是背包负重?一开始还以为是装备负重
pokemon 和 digimon 正在路上
回复

使用道具 举报

梦石
0
星屑
268
在线时间
33 小时
注册时间
2024-4-10
回帖
33
 楼主| 发表于 2024-4-23 19:52:36 | 显示全部楼层
最后我发现还是插件的问题,当Limit Mode选择weight的时候就会出现,选择number的时候运作就正常,最后修改后的答案是这个,假设以后还有人有一样的问题希望能帮到你

  1. Game_Party.prototype.getItemWeight = function(item) {
  2.     switch(paramLimitMode) {
  3.         case 'number':
  4.             return 1;
  5.             break;
  6.         case 'weight':
  7.             if (item && item.meta && item.meta.Weight) {
  8.                 return parseFloat(item.meta.Weight) || paramDefaultWeight;
  9.             } else {
  10.                 return paramDefaultWeight;
  11.             }
  12.             break;
  13.     }
  14.     return 1;
  15. };
复制代码

评分

参与人数 1赞 +1 收起 理由
505681468 + 1 塞糖

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部