じ☆ve冰风 发表于 2026-8-2 09:20:16

Region Restricted Movement

Region Restricted Movement





Overview
This script lets you create regions on the map that the player/events can't pass through.
You can specific the forbidden regions for each event individually or all of them(globally), as well
as having multiple forbidden regions per event/player if you desire.

Install
Paste the script in the Script Editor under Materials and above Main.

Usage

SpoilerPlease see the attached demo below if any of this is confusing.

First create regions on the map you don't want crossed.

Use any of the following script calls within a movement route,
(note these work for both player and event and are for use in a movement routes only):
move_down_region(region)- where region is the id of the region

You can also have up to 6 forbidden regions per script call, and do all direction and random:
move_down_region(region1,region2,....region6)
move_left_region(region1,region2,....region6)
move_right_region(region1,region2,....region6)
move_up_region(region1,region2,....region6)
move_random_region(region1,region2,....region6)

You can also use globally forbidden regions on either all events, the player, or both.
You can add as many as you want.
Use any of the following script calls, these will work outside of movement route:
---for forbidding the player
player_forbid_region_add(region)
player_forbid_region_remove(region)
player_forbid_region_reset

---for forbidding all events
events_forbid_region_add(region)
events_forbid_region_remove(region)
events_forbid_region_reset
---for forbidding all events and player
all_forbid_region_add(region)
all_forbid_region_remove(region)
all_forbid_region_reset



Script
Spoiler#===============================================================================# Region Restricted Movement Script By pizzacat# v1# July 19, 2015#===============================================================================## ---Description---## This script lets you create regions that the player/events can't pass/through# Using this script you can set specific regions for specific events or the player# with movement routes as well as on a global level.#-------------------------------------------------------------------------------## ---Installation---# place this script below Materials and above Main in the Script Editor.#-------------------------------------------------------------------------------## ------How to use in movement routes-------# ------------------------------------------# First draw a region(s) on the map you don't want to the event/player to pass,# you can create as many regions as you want, the following supports up to 6 per# event/player.# Second, in a movement route for the Event, choose script and use # any of the follow methods:##   move_down_region(forbidden_region)#   move_left_region(forbidden_region)#   move_right_region(forbidden_region)#   move_up_region(forbidden_region)#   move_random_region(forbidden_region)## forbidden_region is the ID number of the region you don't want the # event/player to pass.# have up to 6 forbidden regions per method above, like:# move_down_region(forbidden_region1,forbidden_region2,......,forbidden_region6)# Event/player will not pass any forbidden regions## ------How to use globally--------# ---------------------------------# You can also simply forbid all movement pass regions# You can have as many globally forbidden regions as you want# use the following script calls(can be done outside a movement route):## ---for forbidding the player#player_forbid_region_add(region)#player_forbid_region_remove(region)#player_forbid_region_reset## ---for forbidding all events#events_forbid_region_add(region)#events_forbid_region_remove(region)#events_forbid_region_reset## ---for forbidding all events and player#all_forbid_region_add(region)#all_forbid_region_remove(region)#all_forbid_region_reset## use methods with "add" to forbid a region, "remove" to re-allow a region,# "reset" to allow all regions again.#-------------------------------------------------------------------------------###code starts belowmodule PIZZAmodule REGION    ####below are used to set GLOBAL regions to forbid all from passing   #Can be set while is running with script calls using      # Creates an empty array to hold player forbidden regions.    FP = Array[]    # Creates an empty array to hold events forbidden regions.    FE = Array[]    # Creates an empty array to hold All(Player+Event) forbidden regions.    FA = Array[]    endendclass Game_Interpreter##creates methods    def player_forbid_region_add(region)    #forbids the player to move in a region    PIZZA::REGION::FP.push(region)end    def player_forbid_region_remove(region)    #removes a previously added forbidden regions    PIZZA::REGION::FP.delete(region)end    def player_forbid_region_reset    #removes all forbidden regions    while (PIZZA::REGION::FP.empty? == false)      PIZZA::REGION::FP.pop()    endend    def events_forbid_region_add(region)    #forbids the player to move in a region    PIZZA::REGION::FE.push(region)end    def events_forbid_region_remove(region)    #removes a previously added forbidden regions    PIZZA::REGION::FE.delete(region)end    def events_forbid_region_reset    #removes all forbidden regions    while (PIZZA::REGION::FE.empty? == false)      PIZZA::REGION::FE.pop()    endend    def all_forbid_region_add(region)    #forbids the player to move in a region    PIZZA::REGION::FA.push(region)end    def all_forbid_region_remove(region)    #removes a previously added forbidden regions    PIZZA::REGION::FA.delete(region)end    def all_forbid_region_reset    #removes all forbidden regions    while (PIZZA::REGION::FA.empty? == false)      PIZZA::REGION::FA.pop()    endendendclass Game_Character < Game_CharacterBase##----------------------------------------------#handles global regions##----------------------------------------------#alias method to passable?alias pizza_passable passable?def passable?(x, y, d)    return false if (passable_region?(d) == false)    return pizza_passable(x, y, d)end    #checks if passable global regionsdef passable_region?(d)    if (self.is_a?(Game_Player) == true)      region = region_get(d)      PIZZA::REGION::FP.each_index do |index|          return false if (region == PIZZA::REGION::FP)      end      PIZZA::REGION::FA.each_index do |index|          return false if (region == PIZZA::REGION::FA)      end      elsif (self.is_a?(Game_Event) == true)      region = region_get(d)      PIZZA::REGION::FE.each_index do |index|          return false if (region == PIZZA::REGION::FE)      end      PIZZA::REGION::FA.each_index do |index|          return false if (region == PIZZA::REGION::FA)      end   end    return trueend    ##----------------------------------------------#Methods for player/indivdual events#All methods below are to be used with#movement routes##----------------------------------------------    def move_random_region(freg1=1,freg2=-1,freg3=-1,freg4=-1,freg5=-1,freg6=-1)    #checks if not moving to a forbidden region(s), moves randomly if none    #freg is short for forbidden region, set to -1 to not use extras    d = 2 + rand(4) * 2 #new random direction    region = region_get(d)    #moves if it doesn't hit forbidden region    if ((region != freg1) and (region != freg2) and (region != freg3) and       (region != freg4) and (region != freg5) and (region != freg6))      #moves if not in a disallowed region      move_straight(d, false)    else      #waits if can't move that direction      @wait_count = 60    endend    def move_down_region(freg1=1,freg2=-1,freg3=-1,freg4=-1,freg5=-1,freg6=-1)    #moves down if doesn't pass a region that is forbidden    d = 2    region = region_get(d)    #moves if it doesn't hit forbidden region    if ((region != freg1) and (region != freg2) and (region != freg3) and       (region != freg4) and (region != freg5) and (region != freg6))      #moves if not in a disallowed region      move_straight(d, false)    else      #waits if can't move that direction      @wait_count = 60    endend    def move_left_region(freg1=1,freg2=-1,freg3=-1,freg4=-1,freg5=-1,freg6=-1)    #moves left if doesn't pass a region that is forbidden    d = 4    region = region_get(d)    #moves if it doesn't hit forbidden region    if ((region != freg1) and (region != freg2) and (region != freg3) and       (region != freg4) and (region != freg5) and (region != freg6))      #moves if not in a disallowed region      move_straight(d, false)    else      #waits if can't move that direction      @wait_count = 60    endend    def move_right_region(freg1=1,freg2=-1,freg3=-1,freg4=-1,freg5=-1,freg6=-1)    #moves right if doesn't pass a region that is forbidden    d = 6    region = region_get(d)    #moves if it doesn't hit forbidden region    if ((region != freg1) and (region != freg2) and (region != freg3) and       (region != freg4) and (region != freg5) and (region != freg6))      #moves if not in a disallowed region      move_straight(d, false)    else      #waits if can't move that direction      @wait_count = 60    endend    def move_up_region(freg1=1,freg2=-1,freg3=-1,freg4=-1,freg5=-1,freg6=-1)    #moves up if doesn't pass a region that is forbidden    d = 8    region = region_get(d)    #moves if it doesn't hit forbidden region    if ((region != freg1) and (region != freg2) and (region != freg3) and       (region != freg4) and (region != freg5) and (region != freg6))      #moves if not in a disallowed region      move_straight(d, false)    else      #waits if can't move that direction      @wait_count = 60    endend    def region_get(d)    #gets the region at a given facing direction    #d = facing direction to check    case d    when 1; region = $game_map.region_id(@x-1, @y+1)    when 2; region = $game_map.region_id(@x, @y+1)    when 3; region = $game_map.region_id(@x+1, @y+1)    when 4; region = $game_map.region_id(@x-1, @y)    when 5; region = $game_map.region_id(@x, @y)    when 6; region = $game_map.region_id(@x+1, @y)    when 7; region = $game_map.region_id(@x-1, @y-1)    when 8; region = $game_map.region_id(@x, @y-1)    when 9; region = $game_map.region_id(@x+1, @y-1)    end    return regionendend



Script Demo

Download here


本贴来自国际rpgmaker官方论坛作者:pizzacat处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/region-restricted-movement.42728/
页: [1]
查看完整版本: Region Restricted Movement