设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 477|回复: 2
打印 上一主题 下一主题

[原创发布] rpgmaker-plugin-conflict-finder 自动寻找插件之间的冲突

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1413
在线时间
159 小时
注册时间
2020-4-26
帖子
151
跳转到指定楼层
1
发表于 2024-7-14 10:30:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 moonyoulove 于 2024-7-14 10:30 编辑



Hi,这是我开发的新工具,能够帮助查找插件冲突。
最新版本的下载连结在Github上。下载完后双击打开conflict-finder即可使用。

本工具是利用分析插件的执行顺序及写法来判断冲突,加密混淆过或写法比较特别的插件无法正确的被判断。找到插件之间的冲突后,本工具能够建议插件的摆放位置,藉由调换顺序来解决某些部分的冲突。
然而,不是所有的插件冲突都可以藉由调换顺序来解决,RPG Maker常见的几种插件冲突有:

覆盖(Overwrite)

A插件
  1. const _Game_Player_searchLimit = Game_Player.prototype.searchLimit;
  2. Game_Player.prototype.searchLimit = function() {
  3. if (this.isDashing()) {
  4. return 999;
  5. }
  6. return _Game_Player_searchLimit.call(this);
  7. };
复制代码

B插件
  1. Game_Party.prototype.maxItems = function(item) {
  2. return 999;
  3. };
复制代码

A插件的作用完全被覆盖而失效了。如果是不小心覆盖的,就可能会导致错误发生。当A插件使用了别名(Alias)进行了补丁(Patching),而B插件是直接覆盖时,藉由调换两者顺序,可能可以让两个插件都能有作用。但是如果两者都是覆盖的写法,那则无法简单进行调换来解决。

另一种是:

过时(Outdated)

原始
  1. Game_Character.prototype.searchLimit = function() {
  2. return 12;
  3. };
复制代码

A插件
  1. const _GamePlayer_searchLimit = Game_Player.prototype.searchLimit;
  2. Game_Player.prototype.searchLimit = function() {
  3. if (this.isDashing()) {
  4. return 999;
  5. }
  6. return _GamePlayer_searchLimit.call(this);
  7. };
复制代码

B插件
  1. Game_Character.prototype.searchLimit = function() {
  2. return 0;
  3. };
复制代码

因为Game_Player本身没有searchLimit方法,而是继承自Game_Character,所以A插件的searchLimit 储存着的是Game_CharactersearchLimit。当B插件后来再修改了searchLimit,A插件的searchLimit仍然是旧的,调换两者的顺序也能解决此问题。

利用一种函数式的别名补丁方法,可以避免发生此问题:
  1. /**
  2. * Automatically choose whether to alias itself or the parent class.
  3. *
  4. * @param {Object} aliasClass - Use "Foo.prototype" for instance methods and "Foo" for static methods.
  5. * @param {string} methodName - The name of the method to alias.
  6. * @returns {Function} - The aliased method, callable with "call" or "apply".
  7. */
  8. PluginManager.alias = function(aliasClass, methodName) {
  9. if (aliasClass.hasOwnProperty(methodName)) {
  10. return aliasClass[methodName];
  11. } else {
  12. const superClass = Object.getPrototypeOf(aliasClass);
  13. const superMethod = function(...args) {
  14. return superClass[methodName].apply(this, args);
  15. };
  16. return superMethod;
  17. }
  18. };
复制代码


  1. const _GamePlayer_searchLimit = Game_Player.prototype.searchLimit;
复制代码

改成
  1. const _GamePlayer_searchLimit = PluginManager.alias(Game_Player.prototype, "searchLimit");
复制代码

即可自动判断当前类别有没有此方法,没有的话,则会在调用时自动呼叫父类的方法来获取最新的状态。

微云链结.zip (251 Bytes, 下载次数: 5)

评分

参与人数 1+1 收起 理由
马铃薯条 + 1 精品文章

查看全部评分

Lv3.寻梦者

梦石
0
星屑
3574
在线时间
737 小时
注册时间
2018-5-18
帖子
408
2
发表于 2024-7-14 20:49:23 | 只看该作者
感谢分享,请问mv能用吗
这个人很馋,什么都没有留下。。。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1413
在线时间
159 小时
注册时间
2020-4-26
帖子
151
3
 楼主| 发表于 2024-7-14 21:04:47 | 只看该作者
马铃薯条 发表于 2024-7-14 20:49
感谢分享,请问mv能用吗

可以~適用於MV和MZ
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 07:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表