Project1
标题: 关于成就插件:実績プラグインさん脚本使用的问题 求助! [打印本页]
作者: 初学者ax 时间: 2020-6-2 19:55
标题: 关于成就插件:実績プラグインさん脚本使用的问题 求助!
插件:https://torigoya.hatenadiary.jp/entry/achievement_mv
这个插件里实现了成就系统,更新公告里写了有成就删除的功能(介绍里没写)
打开看了一下,可以用指令 実績削除 来删除成就
试了一下发现一个问题,只能删除“所有成就里最后一个成就”,不知道这个情况怎么造成的,有没有高手解决一下,感谢!!!
-
-
Torigoya_Achievement.zip
8.15 KB, 下载次数: 50
作者: shmily0725 时间: 2020-6-3 00:03
我有用过这个插件
但还真的没用过这个功能
好奇是什么情况需要用到这个功能
作者: 初学者ax 时间: 2020-6-3 00:55
主要是测试游戏的时候,因为是全局储存成就嘛,有什么改动之类的看能不能正常解锁,方便测试,全部重置成就也有些麻烦
作者: moonyoulove 时间: 2020-6-3 07:26
你是不是看錯指令了
作者: 开关关 时间: 2020-6-3 07:59
本帖最后由 开关关 于 2020-6-3 08:41 编辑
测试前把 save\achievements.rpgsave 删掉就可以了。
这个插件也提供了插件指令 実績リセット ,用于重置所有成就。
[line]3[/line]
在大约428行的地方,有这样一段代码。它的作用是写入存档。
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
这段代码标注出的那一行逻辑有问题,它的意思是,当原存档中i号成就已解锁时,就保留原存档的成就,否则写入新存档的成就。但是这个逻辑存在缺陷,如果原存档中i号成就已解锁而新存档的i号成就是未解锁,它依然会保留原存档。
改进后的代码如下。其实就改了一行。
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
// this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
// this._achievements[i] = (oldData[i] ? oldData[i] && this._achievements[i] : this._achievements[i]);
this._achievements[i] = (this._achievements[i]);//Kgg:这行与上面被注释掉的那行效果相同,可以选一个使用。作者之所以搞出这个错误,似乎是为了兼容另一个插件“多重起動”,因此上面那行保留了oldData(虽然不知道意义何在)。但是仍然可能有不可预知的bug。
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
// this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
// this._achievements[i] = (oldData[i] ? oldData[i] && this._achievements[i] : this._achievements[i]);
this._achievements[i] = (this._achievements[i]);//Kgg:这行与上面被注释掉的那行效果相同,可以选一个使用。作者之所以搞出这个错误,似乎是为了兼容另一个插件“多重起動”,因此上面那行保留了oldData(虽然不知道意义何在)。但是仍然可能有不可预知的bug。
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
现在逻辑变成了,无论如何写入新存档。简单粗暴地解决了问题。
作者: 初学者ax 时间: 2020-6-3 10:42
谢谢大家!!!
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |