赞 | 25 |
VIP | 0 |
好人卡 | 0 |
积分 | 14 |
经验 | 0 |
最后登录 | 2024-11-20 |
在线时间 | 159 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1413
- 在线时间
- 159 小时
- 注册时间
- 2020-4-26
- 帖子
- 151
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 moonyoulove 于 2024-7-14 10:30 编辑
Hi,这是我开发的新工具,能够帮助查找插件冲突。
最新版本的下载连结在Github上。下载完后双击打开conflict-finder即可使用。
本工具是利用分析插件的执行顺序及写法来判断冲突,加密混淆过或写法比较特别的插件无法正确的被判断。找到插件之间的冲突后,本工具能够建议插件的摆放位置,藉由调换顺序来解决某些部分的冲突。
然而,不是所有的插件冲突都可以藉由调换顺序来解决,RPG Maker常见的几种插件冲突有:
覆盖(Overwrite)
A插件
- const _Game_Player_searchLimit = Game_Player.prototype.searchLimit;
- Game_Player.prototype.searchLimit = function() {
- if (this.isDashing()) {
- return 999;
- }
- return _Game_Player_searchLimit.call(this);
- };
复制代码
B插件
- Game_Party.prototype.maxItems = function(item) {
- return 999;
- };
复制代码
A插件的作用完全被覆盖而失效了。如果是不小心覆盖的,就可能会导致错误发生。当A插件使用了别名(Alias)进行了补丁(Patching),而B插件是直接覆盖时,藉由调换两者顺序,可能可以让两个插件都能有作用。但是如果两者都是覆盖的写法,那则无法简单进行调换来解决。
另一种是:
过时(Outdated)
原始
- Game_Character.prototype.searchLimit = function() {
- return 12;
- };
复制代码
A插件
- const _GamePlayer_searchLimit = Game_Player.prototype.searchLimit;
- Game_Player.prototype.searchLimit = function() {
- if (this.isDashing()) {
- return 999;
- }
- return _GamePlayer_searchLimit.call(this);
- };
复制代码
B插件
- Game_Character.prototype.searchLimit = function() {
- return 0;
- };
复制代码
因为Game_Player本身没有searchLimit方法,而是继承自Game_Character,所以A插件的searchLimit 储存着的是Game_Character的searchLimit。当B插件后来再修改了searchLimit,A插件的searchLimit仍然是旧的,调换两者的顺序也能解决此问题。
利用一种函数式的别名补丁方法,可以避免发生此问题:
- /**
- * Automatically choose whether to alias itself or the parent class.
- *
- * @param {Object} aliasClass - Use "Foo.prototype" for instance methods and "Foo" for static methods.
- * @param {string} methodName - The name of the method to alias.
- * @returns {Function} - The aliased method, callable with "call" or "apply".
- */
- PluginManager.alias = function(aliasClass, methodName) {
- if (aliasClass.hasOwnProperty(methodName)) {
- return aliasClass[methodName];
- } else {
- const superClass = Object.getPrototypeOf(aliasClass);
- const superMethod = function(...args) {
- return superClass[methodName].apply(this, args);
- };
- return superMethod;
- }
- };
复制代码
将
- const _GamePlayer_searchLimit = Game_Player.prototype.searchLimit;
复制代码
改成
- const _GamePlayer_searchLimit = PluginManager.alias(Game_Player.prototype, "searchLimit");
复制代码
即可自动判断当前类别有没有此方法,没有的话,则会在调用时自动呼叫父类的方法来获取最新的状态。
微云链结.zip
(251 Bytes, 下载次数: 5)
|
评分
-
查看全部评分
|