Prevent Unequip

Discussion in 'RPG Maker MV' started by Kitdan7, Jan 13, 2019.

Thread Status:
Not open for further replies.
  1. Kitdan7

    Kitdan7 Villager Member

    Messages:
    16
    Likes Received:
    2
    First Language:
    English
    Primarily Uses:
    RMMV
    OK, I tried my best to figure this out, but I don't have the mental energy to search any more.

    I want the option for players to change clothes, but I don't want them to be able to go without clothes. Is there a way, whether command script or plugin, that I can prevent the "Body" slot from being unequipped without locking what's equipped there? I'd settle for an event trick to force equip random or optimized valid clothes (preferably optimized) if they're not wearing anything.
     
    #1
  2. Zevia

    Zevia Veteran Veteran

    Messages:
    599
    Likes Received:
    305
    First Language:
    English
    Primarily Uses:
    RMMV
    You can give this a Plugin a try, if you'd like. Make sure to save it as "PreventBlankEquip.js" or download the file attached to this post:

    Code:
    /*:
    * @plugindesc This plugin allows users to specify equipment slots on an Actor that cannot be unequipped
    * in a way that would leave them empty.
    * @author Zevia
    *
    * @help If the option to prevent all actors from unequipping items without replacing
    * them is true, then this Plugin does not require any further configuration and no
    * Actor will be able to unequip an item without replacing it.
    * If the option is false, then within an Actor's note box, you can specify which
    * slot IDs should not be unequippable without a replacement. By default, the
    * slots are:
    * 0: Weapon
    * 1: Shield
    * 2: Head
    * 3: Body
    * 4: Accessory
    *
    * So, if you wanted an Actor to always require an item in the Body slot, you would
    * put <preventBlankEquip: 3>. You can prevent multiple slots by comma-separating
    * each slot ID. If you want to prevent unequipping without replacements for the
    * weapon and shield slot, you would put <preventBlankEquip: 0, 1>
    *
    * If the Prevent All Actors & Slots option is true, then the clear command will be
    * removed from the equip menu.
    *
    * @param shouldPreventAll
    * @text Prevent All Actors & Slots
    * @type boolean
    * @desc Whether every Actor should be unable to unequip an item without a replacement for all equipment slots.
    * @default false
    */
    
    (function(module) {
        'use strict';
    
        module.Zevia = module.Zevia || {};
        var PreventBlankEquip = module.Zevia.PreventBlankEquip = {};
        var shouldPreventAll = !!PluginManager.parameters('PreventBlankEquip').shouldPreventAll.match(/true/i);
    
        PreventBlankEquip.shouldPreventEquip = function(actor, slotId) {
            if (shouldPreventAll) { return true; }
    
            var meta = $dataActors[actor._actorId].meta.preventBlankEquip;
            if (!meta) { return false; }
    
            var slotIds = meta.match(/\d+/g);
            if (!slotIds || !slotIds.length) { return false; }
    
            return slotIds.indexOf('' + slotId) !== -1;
        };
    
        PreventBlankEquip.onItemOk = Scene_Equip.prototype.onItemOk;
        Scene_Equip.prototype.onItemOk = function() {
            if (this._itemWindow.item() || !PreventBlankEquip.shouldPreventEquip(this._actor, this._slotWindow.index())) {
                PreventBlankEquip.onItemOk.call(this);
                return;
            }
    
            SoundManager.playBuzzer();
            this._itemWindow.activate();
        };
    
        PreventBlankEquip.clearEquipments = Game_Actor.prototype.clearEquipments;
        Game_Actor.prototype.clearEquipments = function() {
            var maxSlots = this.equipSlots().length;
            for (var i = 0; i < maxSlots; i++) {
                if (this.isEquipChangeOk(i) && !PreventBlankEquip.shouldPreventEquip(this, i)) {
                    this.changeEquip(i, null);
                }
            }
        };
    
        PreventBlankEquip.makeCommandList = Window_EquipCommand.prototype.makeCommandList;
        Window_EquipCommand.prototype.makeCommandList = function() {
            if (!shouldPreventAll) {
                PreventBlankEquip.makeCommandList.call(this);
                return;
            }
    
            this.addCommand(TextManager.equip2, 'equip');
            this.addCommand(TextManager.optimize, 'optimize');
        };
    })(window);
    
    There's one configurable parameter, and that's whether or not you want to prevent all Actors from unequipping any slot without having a replacement item or not. By default, it's false, but you can set it to true if you want to just blanket prevent everyone from having blank slots.

    If it is false, then you can put notetags in Actors' note boxes with the format <preventBlankEquip: x, y, z...>, where x, y, z, etc. are slot IDs you want to prevent a user from changing to a blank equip. As an example, if you want to prevent an Actor from unequipping the Body slot without replacing the item, you would do:
    Code:
    <preventBlankEquip: 3>
    
    You'll still be able to force the item slots to be empty through event commands, however. This Plugin will only prevent the user from unequipping an item via the Equip Scene.
     

    Attached Files:

    Last edited: Jan 14, 2019
    #2
  3. TWings

    TWings The Dragon Whisperer Veteran

    Messages:
    294
    Likes Received:
    563
    Location:
    Kyoto
    First Language:
    French
    Primarily Uses:
    RMMV
    Alternatively, Yanfly Equip Core can do it too.
     
    #3
  4. Kitdan7

    Kitdan7 Villager Member

    Messages:
    16
    Likes Received:
    2
    First Language:
    English
    Primarily Uses:
    RMMV
    It almost works. Unfortunately it doesnt prevent unequipping with the "Clear" button on the equip screen.

    I didn't know Yanfly Equip Core could do that. I sort of just lazily glossed over the plugin in my search because the reliability of Yanfly Cores is spotty at best for me (I think there's a conflict with one of my other plugins, not sure which one) but this one seems to work fine, and it doesn't have the glitch that Zevia's suggestion has. Thanks for the help! (now if only I could use any core that effects how battles look or work)
     
    #4
  5. Zevia

    Zevia Veteran Veteran

    Messages:
    599
    Likes Received:
    305
    First Language:
    English
    Primarily Uses:
    RMMV
    If you were still interested in using the one I wrote, I modified it and updated my previous post to prevent the clear command from unequipping slots specified in Actor notetags. If the "Prevent All Actors & Slots" configuration is true, then the clear command is removed from the Equip menu.
     
    #5
  6. Kitdan7

    Kitdan7 Villager Member

    Messages:
    16
    Likes Received:
    2
    First Language:
    English
    Primarily Uses:
    RMMV
    Thanks, but Yanfly Equip Core is working, and it comes with other features for me to explore too. This thread is resolved.
     
    #6
  7. slimmmeiske2

    slimmmeiske2 Little Red Riding Hood Moderator

    Messages:
    5,197
    Likes Received:
    3,931
    Location:
    Belgium
    First Language:
    Dutch
    Primarily Uses:
    RMXP

    This thread is being closed, due to being solved. If for some reason you would like this thread re-opened, please report this post and leave a message why. Thank you.

     
    #7
Thread Status:
Not open for further replies.

Share This Page