//============================================================================= // Yanfly Engine Plugins - Region Restrictions // YEP_RegionRestrictions.js //============================================================================= var Imported = Imported || {}; Imported.YEP_RegionRestrictions = true; var Yanfly = Yanfly || {}; Yanfly.RR = Yanfly.RR || {}; Yanfly.RR.version = 1.04 //============================================================================= /*: * @plugindesc v1.04 Use regions to block out Events and/or the player from * being able to venture into those spots. * @author Yanfly Engine Plugins * * @param Player Restrict * @desc This region ID will restrict the player from entering. * To use multiple regions, separate them by spaces. * @default 0 * * @param Event Restrict * @desc This region ID will restrict all events from entering. * To use multiple regions, separate them by spaces. * @default 0 * * @param All Restrict * @desc This region ID will restrict players and events. * To use multiple regions, separate them by spaces. * @default 0 * * @param Player Allow * @desc This region ID will always allow player passability. * To use multiple regions, separate them by spaces. * @default 0 * * @param Event Allow * @desc This region ID will always allow events passability. * To use multiple regions, separate them by spaces. * @default 0 * * @param All Allow * @desc This region ID will always allow both passability. * To use multiple regions, separate them by spaces. * @default 0 * * @help * ============================================================================ * Introduction and Instructions * ============================================================================ * * Not everybody wants NPC's to travel all over the place. With this plugin, * you can set NPC's to be unable to move pass tiles marked by a specified * Region ID. Simply draw out the area you want to enclose NPC's in on and * they'll be unable to move past it unless they have Through on. Likewise, * there are regions that you can prevent the player from moving onto, too! * * A new change from the RPG Maker VX Ace version is that now there exist * Regions that can allow players and events to always travel through. * * ============================================================================ * Notetags * ============================================================================ * * You can use this notetag inside of your maps. * * Map Notetags: * * * * * Restricts region x for the player on this particular map. Use multiple x * to mark more regions. From x to y, you can mark a multitude of regions. * * * * * Restricts region x for all events on this particular map. Use multiple x * to mark more regions. From x to y, you can mark a multitude of regions. * * * * * Restricts region x for the player and all events on this particular map. * Use multiple x to mark more regions. From x to y, you can mark a multitude * of regions. * * * * * Allows region x for the player on this particular map. Use multiple x * to mark more regions. From x to y, you can mark a multitude of regions. * * * * * Allows region x for all events on this particular map. Use multiple x * to mark more regions. From x to y, you can mark a multitude of regions. * * * * * Allows region x for the player and all events on this particular map. * Use multiple x to mark more regions. From x to y, you can mark a multitude * of regions. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.04: * - Updated for RPG Maker MV version 1.5.0. * * Version 1.03: * - Fixed an issue with vehicles being capable of landing the player in region * restricted zones. * * Version 1.02: * - Plugin parameters have been upgraded to now accept multiple region ID's. * Insert a space in between them to add more than one region ID. * * Version 1.01: * - Added new notetags to allow for more region restriction settings! * * Version 1.00: * - Finished plugin! */ //============================================================================= //============================================================================= // Parameter Variables //============================================================================= Yanfly.Param = Yanfly.Param || {}; Yanfly.SetupParameters = function() { var parameters = PluginManager.parameters('YEP_RegionRestrictions'); Yanfly.Param.RRAllAllow = String(parameters['All Allow']); Yanfly.Param.RRAllAllow = Yanfly.Param.RRAllAllow.split(' '); for (var i = 0; i < Yanfly.Param.RRAllAllow.length; ++i) { Yanfly.Param.RRAllAllow[i] = Number(Yanfly.Param.RRAllAllow[i]); } Yanfly.Param.RRAllRestrict = String(parameters['All Restrict']); Yanfly.Param.RRAllRestrict = Yanfly.Param.RRAllRestrict.split(' '); for (var i = 0; i < Yanfly.Param.RRAllRestrict.length; ++i) { Yanfly.Param.RRAllRestrict[i] = Number(Yanfly.Param.RRAllRestrict[i]); } Yanfly.Param.RREventAllow = String(parameters['Event Allow']); Yanfly.Param.RREventAllow = Yanfly.Param.RREventAllow.split(' '); for (var i = 0; i < Yanfly.Param.RREventAllow.length; ++i) { Yanfly.Param.RREventAllow[i] = Number(Yanfly.Param.RREventAllow[i]); } Yanfly.Param.RREventRestrict = String(parameters['Event Restrict']); Yanfly.Param.RREventRestrict = Yanfly.Param.RREventRestrict.split(' '); for (var i = 0; i < Yanfly.Param.RREventRestrict.length; ++i) { Yanfly.Param.RREventRestrict[i] = Number(Yanfly.Param.RREventRestrict[i]); } Yanfly.Param.RRPlayerAllow = String(parameters['Player Allow']); Yanfly.Param.RRPlayerAllow = Yanfly.Param.RRPlayerAllow.split(' '); for (var i = 0; i < Yanfly.Param.RRPlayerAllow.length; ++i) { Yanfly.Param.RRPlayerAllow[i] = Number(Yanfly.Param.RRPlayerAllow[i]); } Yanfly.Param.RRPlayerRestrict = String(parameters['Player Restrict']); Yanfly.Param.RRPlayerRestrict = Yanfly.Param.RRPlayerRestrict.split(' '); for (var i = 0; i < Yanfly.Param.RRPlayerRestrict.length; ++i) { Yanfly.Param.RRPlayerRestrict[i] = Number(Yanfly.Param.RRPlayerRestrict[i]); } }; Yanfly.SetupParameters(); //============================================================================= // DataManager //============================================================================= DataManager.processRRNotetags = function() { if (!$dataMap) return; $dataMap.restrictPlayerRegions = Yanfly.Param.RRAllRestrict.concat( Yanfly.Param.RRPlayerRestrict); $dataMap.restrictEventRegions = Yanfly.Param.RRAllRestrict.concat( Yanfly.Param.RREventRestrict); $dataMap.allowPlayerRegions = Yanfly.Param.RRAllAllow.concat( Yanfly.Param.RRPlayerAllow); $dataMap.allowEventRegions = Yanfly.Param.RRAllAllow.concat( Yanfly.Param.RREventAllow); if (!$dataMap.note) return; var note1a = /<(?:PLAYER RESTRICT REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note1b = /<(?:PLAYER RESTRICT REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var note2a = /<(?:EVENT RESTRICT REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note2b = /<(?:EVENT RESTRICT REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var note3a = /<(?:ALL RESTRICT REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note3b = /<(?:ALL RESTRICT REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var note4a = /<(?:PLAYER ALLOW REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note4b = /<(?:PLAYER ALLOW REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var note5a = /<(?:EVENT ALLOW REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note5b = /<(?:EVENT ALLOW REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var note6a = /<(?:ALL ALLOW REGION):[ ]*(\d+(?:\s*,\s*\d+)*)>/i; var note6b = /<(?:ALL ALLOW REGION):[ ](\d+)[ ](?:TO)[ ](\d+)>/i; var notedata = $dataMap.note.split(/[\r\n]+/); for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.restrictPlayerRegions = $dataMap.restrictPlayerRegions.concat(array); } else if (line.match(note1b)) { var mainArray = $dataMap.restrictPlayerRegions; var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.restrictPlayerRegions = $dataMap.restrictPlayerRegions.concat(range); } else if (line.match(note2a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.restrictEventRegions = $dataMap.restrictEventRegions.concat(array); } else if (line.match(note2b)) { var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.restrictEventRegions = $dataMap.restrictEventRegions.concat(range); } else if (line.match(note3a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.restrictPlayerRegions = $dataMap.restrictPlayerRegions.concat(array); $dataMap.restrictEventRegions = $dataMap.restrictEventRegions.concat(array); } else if (line.match(note3b)) { var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.restrictPlayerRegions = $dataMap.restrictPlayerRegions.concat(array); $dataMap.restrictEventRegions = $dataMap.restrictEventRegions.concat(array); } else if (line.match(note4a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.allowPlayerRegions = $dataMap.allowPlayerRegions.concat(array); } else if (line.match(note4b)) { var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.allowPlayerRegions =$dataMap.allowPlayerRegions.concat(range); } else if (line.match(note5a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.allowEventRegions = $dataMap.allowEventRegions.concat(array); } else if (line.match(note5b)) { var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.allowEventRegions = $dataMap.allowEventRegions.concat(range); } else if (line.match(note6a)) { array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']'); $dataMap.allowPlayerRegions = $dataMap.allowPlayerRegions.concat(array); $dataMap.allowEventRegions = $dataMap.allowEventRegions.concat(array); } else if (line.match(note6b)) { var range = Yanfly.Util.getRange(Number(RegExp.$1), Number(RegExp.$2)); $dataMap.allowPlayerRegions = $dataMap.allowPlayerRegions.concat(array); $dataMap.allowEventRegions = $dataMap.allowEventRegions.concat(array); } } }; //============================================================================= // Game_Map //============================================================================= Yanfly.RR.Game_Map_setup = Game_Map.prototype.setup; Game_Map.prototype.setup = function(mapId) { Yanfly.RR.Game_Map_setup.call(this, mapId); if ($dataMap) DataManager.processRRNotetags(); }; Game_Map.prototype.restrictEventRegions = function() { if ($dataMap.restrictEventRegions === undefined) { DataManager.processRRNotetags(); } return $dataMap.restrictEventRegions || []; }; Game_Map.prototype.restrictPlayerRegions = function() { if ($dataMap.restrictPlayerRegions === undefined) { DataManager.processRRNotetags(); } return $dataMap.restrictPlayerRegions || []; }; Game_Map.prototype.allowEventRegions = function() { if ($dataMap.allowEventRegions === undefined) { DataManager.processRRNotetags(); } return $dataMap.allowEventRegions || []; }; Game_Map.prototype.allowPlayerRegions = function() { if ($dataMap.allowPlayerRegions === undefined) { DataManager.processRRNotetags(); } return $dataMap.allowPlayerRegions || []; }; //============================================================================= // Game_CharacterBase //============================================================================= Yanfly.RR.Game_CharacterBase_isMapPassable = Game_CharacterBase.prototype.isMapPassable; Game_CharacterBase.prototype.isMapPassable = function(x, y, d) { if (this.isEventRegionForbid(x, y, d)) return false; if (this.isPlayerRegionForbid(x, y, d)) return false; if (this.isEventRegionAllow(x, y, d)) return true; if (this.isPlayerRegionAllow(x, y, d)) return true; return Yanfly.RR.Game_CharacterBase_isMapPassable.call(this, x, y, d); }; Game_CharacterBase.prototype.isEvent = function() { return false; }; Game_CharacterBase.prototype.isPlayer = function() { return false; }; Game_CharacterBase.prototype.processRRNotetags = function() { DataManager.processRRNotetags(); }; Game_CharacterBase.prototype.isEventRegionForbid = function(x, y, d) { if (this.isPlayer()) return false; if (this.isThrough()) return false; var regionId = this.getRegionId(x, y, d); if (regionId === 0) return false; if ($gameMap.restrictEventRegions().contains(regionId)) return true; return false; }; Game_CharacterBase.prototype.isPlayerRegionForbid = function(x, y, d) { if (this.isEvent()) return false; if (this.isThrough()) return false; var regionId = this.getRegionId(x, y, d); if (regionId === 0) return false; if ($gameMap.restrictPlayerRegions().contains(regionId)) return true; return false; }; Game_CharacterBase.prototype.isEventRegionAllow = function(x, y, d) { if (this.isPlayer()) return false; var regionId = this.getRegionId(x, y, d); if (regionId === 0) return false; if ($gameMap.allowEventRegions().contains(regionId)) return true; return false; }; Game_CharacterBase.prototype.isPlayerRegionAllow = function(x, y, d) { if (this.isEvent()) return false; var regionId = this.getRegionId(x, y, d); if (regionId === 0) return false; if ($gameMap.allowPlayerRegions().contains(regionId)) return true; return false }; Game_CharacterBase.prototype.getRegionId = function(x, y, d) { switch (d) { case 1: return $gameMap.regionId(x - 1, y + 1); break; case 2: return $gameMap.regionId(x + 0, y + 1); break; case 3: return $gameMap.regionId(x + 1, y + 1); break; case 4: return $gameMap.regionId(x - 1, y + 0); break; case 5: return $gameMap.regionId(x + 0, y + 0); break; case 6: return $gameMap.regionId(x + 1, y + 0); break; case 7: return $gameMap.regionId(x - 1, y - 1); break; case 8: return $gameMap.regionId(x + 0, y - 1); break; case 9: return $gameMap.regionId(x + 1, y - 1); break; default: return $gameMap.regionId(x, y); break; } }; //============================================================================= // Game_Event //============================================================================= Game_Event.prototype.isEvent = function() { return true; }; //============================================================================= // Game_Player //============================================================================= Game_Player.prototype.isPlayer = function() { return true; }; //============================================================================= // Game_Vehicle //============================================================================= Yanfly.RR.Game_Vehicle_isLandOk = Game_Vehicle.prototype.isLandOk; Game_Vehicle.prototype.isLandOk = function(x, y, d) { var value = Yanfly.RR.Game_Vehicle_isLandOk.call(this, x, y, d); if (!value) return false; if (this.isAirship()) { d = 5; $gamePlayer._through = false; } if ($gamePlayer.isPlayerRegionForbid(x, y, d)) { if (this.isAirship()) $gamePlayer._through = true; return false; } if ($gamePlayer.isPlayerRegionAllow(x, y, d)) { if (this.isAirship()) $gamePlayer._through = true; return true; } return true; }; //============================================================================= // Utilities //============================================================================= Yanfly.Util = Yanfly.Util || {}; Yanfly.Util.getRange = function(n, m) { var result = []; for (var i = n; i <= m; ++i) result.push(i); return result; }; //============================================================================= // End of File //=============================================================================