おひとり様一つ限り購入可能のようなプラグインを作りたい
Posted: 2025年3月05日(水) 12:01
ChatGPTでメモ欄に購入制限と書かれたものを購入した場合、ほかの購入制限とメモ欄に書かれたアイテムもすべて購入不可になり、次回ショップを開いた際にはそれがリセットされるお一人様1点限りプラグインを作りたかったのですがうまくいかず困っています
修正点をお教えいただければ幸いです
似たような質問を連投して申し訳ないですがよろしくお願いします
修正点をお教えいただければ幸いです
似たような質問を連投して申し訳ないですがよろしくお願いします
コード: 全て選択
(() => {
const parameters = PluginManager.parameters('BuyLimit');
const limitText = parameters['LimitText'] || '購入制限';
// 購入後に購入制限を適用したアイテムを保持する配列
let restrictedItems = [];
// アイテム購入時に購入制限を適用
const _Scene_Shop_onBuyItem = Scene_Shop.prototype.onBuyItem;
Scene_Shop.prototype.onBuyItem = function() {
// 購入するアイテム
const item = this._buyWindow.item();
// アイテムのメモ欄に「購入制限」が記載されているか確認
if (item && item.meta['購入制限']) {
// 購入制限を適用するため、制限対象アイテムIDを全てリストに追加
this.applyPurchaseRestriction(item);
}
// 通常の購入処理を実行
_Scene_Shop_onBuyItem.call(this);
};
// 購入制限を全アイテムに適用する関数
Scene_Shop.prototype.applyPurchaseRestriction = function(item) {
// 購入したアイテムをリストに追加
if (!restrictedItems.includes(item.id)) {
restrictedItems.push(item.id);
}
// すべてのアイテムに制限をかける
const buyWindowData = this._buyWindow._data;
if (buyWindowData) {
buyWindowData.forEach(i => {
if (i.meta['購入制限'] && !restrictedItems.includes(i.id)) {
restrictedItems.push(i.id);
}
});
}
};
// 購入後、制限を適用する(ショップ終了後にリセット)
const _Scene_Shop_terminate = Scene_Shop.prototype.terminate;
Scene_Shop.prototype.terminate = function() {
// ショップ終了時に制限リストをリセット
restrictedItems = [];
_Scene_Shop_terminate.call(this);
};
// 購入制限があるアイテムを購入不可にする処理
const _Window_ShopBuy_isEnabled = Window_ShopBuy.prototype.isEnabled;
Window_ShopBuy.prototype.isEnabled = function(item) {
// 購入制限リストにあるアイテムは購入できない
if (restrictedItems.includes(item.id)) {
return false;
}
return _Window_ShopBuy_isEnabled.call(this, item);
};
// 購入不可のアイテムに制限メッセージを表示
const _Window_ShopBuy_drawItemName = Window_ShopBuy.prototype.drawItemName;
Window_ShopBuy.prototype.drawItemName = function(item, x, y, width) {
_Window_ShopBuy_drawItemName.call(this, item, x, y, width);
// 購入制限されているアイテムにメッセージを表示
if (restrictedItems.includes(item.id)) {
this.changeTextColor(this.textColor(8)); // グレー
this.drawText(limitText, x + width - this.textWidth(limitText), y, width, 'right');
}
};
})();