ページ 11

おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月05日(水) 12:01
by Iron
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');
        }
    };
})();

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月06日(木) 00:54
by DoujinRuis
こんにちは、今回の件をYoutubeで動画にしてみました。
もしよければご確認ください

リンク
https://www.youtube.com/watch?v=5RAXf7kqiiY

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月06日(木) 09:47
by Iron
動画拝見させていただきました
こちらの説明不足で誤解を与えてしまったようなのですが制作いただいたものは私が求めている形と少し違うようです
私が求めているのはメモ欄に購入制限と記載された1商品を購入した際にほかの購入制限と書かれたすべての商品が購入できなくなる(A,B,C,D4つの商品があり、うちA,B,Cのメモ欄に購入制限と記載されている場合、Aを購入した際にB,Cも同時に購入できなくなりDのみ購入可能な状態になります。反対にDを購入した場合は引き続きすべての商品が購入可能です)

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月06日(木) 13:42
by DoujinRuis
すいません、タイトルの文だけで作っちゃいました

3つの商品の中から一つだけという認識で大丈夫ですか?

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月06日(木) 15:25
by Iron
例ではそうなりますね、購入制限のタグが付いたものの中から一つだけ、といった形です
また、次回ショップ画面展開時にはそれがリセットされていて再び購入可能になる(つまり一度の来店で一つの商品のみ)ようにしたいです

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月07日(金) 09:03
by DoujinRuis
Discordにアップしておきました。
空のプロジェクトでは動作問題なかったです。
試してみてください

Re: おひとり様一つ限り購入可能のようなプラグインを作りたい

Posted: 2025年3月07日(金) 10:53
by Iron
無事想定通りの挙動になっていました
ありがとうございます