Making a button common only effect events the player is touching.

Discussion in 'RPG Maker MV' started by Hahasea, Aug 13, 2019.

  1. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    I'm trying to set up a button common event, assigning a key to repels NPCs that the player is touching. So far I have it partially working - using the 'v' key while touching a NPC activates my repel common event, and the NPC is repelled, however - it also effects all other map NPCs (that have the switch call) simultaneously. How would I make it only repel NPCs the player is directly touching at the time? Have tried all sorts of things and I'm stumped. Am sure whatever the solution is will be stupidly obvious.

    (I'm using Yanfly's Button common events to tie the button to the my repel event.)

    upload_2019-8-13_16-33-28.png

    upload_2019-8-13_16-33-54.png
    (This second event page is where the repelling happens, by using the 'move away from player' command in custom route)

    upload_2019-8-13_16-36-9.png

    Thanks!
     
    Last edited: Aug 13, 2019
    #1
  2. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    You need to compare the location of the event to the player before you activate the event.
     
    #2
  3. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    Could you explain how to do that? I tried figuring out how to do that, but I couldn't make it work.
     
    #3
  4. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    Screenshot_80.png

    Save player x and y to a variable, save event's x and y to a different variable and compare them (or subtract x's from each other and y's from each other). If the difference between either x's or y's is NOT between 1 and -1, then they're not touching.
     
    #4
  5. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    @Poryg thanks, that all makes sense, except I'm getting tripped up figuring out how to do a conditional branch that compares 2 variables, or is there a way to have a new variable reference the result of the compared variables? Does that make sense?

    I've got the xy comparisons set up:
    upload_2019-8-13_18-21-52.png
    but not sure how to get that data into a conditional branch.
     
    #5
  6. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    If one of the two is either greater than 1 or less than -1, then they're not touching.
    So the push will fire only when the x is no more than 1 and no less than -1 and y is no more than 1 and no less than -1. That's 2 conditional branches for x and 2 for y.
     
    #6
  7. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    @Poryg I'm sorry, I feel stupid here. I understand the logic of it, I just don't see how to call the x and y difference variables in the program. I can't see a way to assign a new variable ID to the result of NPC X -= Event X in order to check for whether its value is between 1 and -1.
     
    #7
  8. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    You don't need to assign it to a new variable.
    You take var x of event
    subtract var x of hero from it. The result is saved inside the x of the event.
     
    #8
  9. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    @Poryg
    Ah ok. Is this what you mean? It's still triggering all events. It seems that regardless of what the restrictions are in order to trigger the NPC-PUSH control switch, once it's triggered it affects all events on the map that respond to the control switch.

    upload_2019-8-13_19-31-40.png

    Also tried putting it into the event, but same thing happens.
     

    Attached Files:

    #9
  10. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    Oh, stupid me!
    I forgot that if they are parallel events, they will fire the same commands at the same time. That means the variable and switch will get influenced for all of them.

    It might be better if you have a remote event that will check the positions of events and then pushes the appropriate ones. That may involve some scripting.


    Save this code as a plugin
    Code:
    _alias_pushplug_gi_plugincommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _alias_pushplug_gi_plugincommand.call(this, command, args);
        if (command === "pushevents") this.pushEvents(args);
    }
    
    Game_Interpreter.prototype.pushEvents = function (args) {
        for (var i in args) {
            var event = $gameMap.event(args[i]);
            if (Math.abs(event.x - $gamePlayer.x) <= 1 && Math.abs(event.y - $gamePlayer.y) <= 1) $gameSelfSwitches.setValue([this._mapId, args[i], "A"], true);
            else $gameSelfSwitches.setValue([this._mapId, args[i], "A"]), false;
        }
    }
    And then from a remote parallel process event call this plugin command:

    pushevents 1 2 3 4 5

    where numbers are your event IDs. You can have as many as you need.
    The plugin will set a self switch "A" to on if the event is next to player. If not, it will turn it off.

    So have the page with "A" set to parallel process.
    Also, have the movement at the bottom of the page, because parallel process events stop processing the moment they are turned off.
     
    Last edited: Aug 13, 2019
    #10
  11. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    Amazing, thanks @Poryg !

    So I'm getting the following error, but I'm not 100% sure I followed your instructions correctly.
    upload_2019-8-13_22-54-3.png

    - Plugin installed as instructed, that part is fine. (Named NPC-push.js)
    - Remote parallel process event - I think I know what you mean, but I just want to confirm that what you mean by a 'remote' event is just a separate event on the same map as the NPC events?
    - I don't actually have a page with A set, I was working with a switch called NPC-push, should I replace that with the self-switch, add it in addition to, or does that go somewhere else?
    - Leave in the X,Y stuff in the common event I assume?
    - Not sure what you mean to 'have the movement at the bottom of the page'? I currently have the movement set through the autonomous movement box of the event page itself.

    Thank you, I really appreciate your help.
     
    #11
  12. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    Yup. Although it looks like you can have it even in a common event, since the interpreter will still catch current map ID (and that is what we need).
    You should replace it with the self switch. If you turn the same exact switch for all events, then the exact same thing will happen for all events once it is activated. They have to be on a different switch so you don't move all events at once, that's why the self switch.
    Unnecessary to keep it there, the plugin will handle all calculation.
    I see, I thought you had the movement set like this (when the player is supposed to get pushed)
    Screenshot_83.png
     
    #12
  13. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    OK thanks.

    I've gone in and corrected those bits, I'm still getting this error message:

    upload_2019-8-15_11-54-56.png

    What am I missing? This is what I have in my events:
    upload_2019-8-15_11-56-58.png

    upload_2019-8-15_11-56-29.png

    upload_2019-8-15_11-57-39.png
     
    #13
  14. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    It looks like the plugin command has wrong arguments. You need to use event IDs for it to work. Can I see the plugin command?
     
    #14
  15. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    Oops sorry forgot to post a screenshot of that one!
    upload_2019-8-15_12-15-25.png
     
    #15
  16. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    The format looks fine.
    The only way I can replicate an error is if I use a wrong event ID as a parameter. Do all of the provided event IDs exist?

    If yes, here is an attempt to make it foolproof. Added a line of code to checks if the event exists and if not, skip it.

    Code:
    _alias_pushplug_gi_plugincommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _alias_pushplug_gi_plugincommand.call(this, command, args);
        if (command === "pushevents") this.pushEvents(args);
    }
    
    Game_Interpreter.prototype.pushEvents = function (args) {
        for (var i in args) {
            var event = $gameMap.event(args[i]) || null;
            if (!event) continue;
            if (Math.abs(event.x - $gamePlayer.x) <= 1 && Math.abs(event.y - $gamePlayer.y) <= 1) $gameSelfSwitches.setValue([this._mapId, args[i], "A"], true);
            else $gameSelfSwitches.setValue([this._mapId, args[i], "A"]), false;
        }
    }
     
    #16
  17. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    @Poryg, yeah they do, but the updated script fixed the issue!

    The only thing now is that the NPCs get repelled on touch, where I was trying to get them repelled by a keystroke trigger...

    Hey, do you have a Patreon, or a game for sale or something? You're spending so much time helping me, I'd love to support you somehow.
     
    #17
  18. Poryg

    Poryg Pixie of the Emvee kingdom, Ham of a Hamster Veteran

    Messages:
    3,856
    Likes Received:
    9,649
    Location:
    Czech Republic
    First Language:
    Czech
    Primarily Uses:
    RMMV
    A simple upgrade :D

    Code:
    Input.keyMapper[33] = 'pageup';
    _alias_pushplug_gi_plugincommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _alias_pushplug_gi_plugincommand.call(this, command, args);
        if (command === "pushevents") this.pushEvents(args);
    }
    
    Game_Interpreter.prototype.pushEvents = function (args) {
        for (var i in args) {
            var event = $gameMap.event(args[i]) || null;
            if (!event) continue;
            if (Input.isPressed("pageup") && Math.abs(event.x - $gamePlayer.x) <= 1 && Math.abs(event.y - $gamePlayer.y) <= 1) $gameSelfSwitches.setValue([this._mapId, args[i], "A"], true);
            else $gameSelfSwitches.setValue([this._mapId, args[i], "A"]), false;
        }
    }
    
    Replace the "pageup" (in both the keymapper and the Input.isPressed part) with the key you need. In order to find the correct key you'll need to open Yanfly's button common events plugin and search for the key. Then you copy the Input.keyMapper part and replace it inside the pushevents plugin. For example for q you'll copy
    Code:
    Input.keyMapper[81] = 'q';
    This will eliminate the need for the common event altogether and you can clear it from the Yanfly plugin's parameters.

    And I don't have patreon. Even if I had, I wouldn't be able to share it here (forum rules). This is a problem that's not too complex anyway though, I just made it more complex than I needed thanks to the fact that lately I've been fighting exhaustion due to job. It would feel as if I didn't earn the money properly.
     
    Last edited: Aug 16, 2019
    #18
  19. Hahasea

    Hahasea Veteran Veteran

    Messages:
    115
    Likes Received:
    13
    First Language:
    English
    Primarily Uses:
    RMMV
    @Poryg it's working!

    Thank you so much for your help and patience, especially since you've been exhausted. It's really very appreciated.

    Hope the job situation gets a bit better!
     
    #19

Share This Page