设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1050|回复: 1
打印 上一主题 下一主题

[有事请教] 求一个NPC跟随队伍的插件?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4638
在线时间
684 小时
注册时间
2013-1-18
帖子
710
跳转到指定楼层
1
发表于 2023-6-20 09:01:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
之前好像看到有大佬发过。
比如做护送任务,一个纯NPC跟在队伍里,不参加战斗。
找了半天也找不到了,请大佬们指条明路。

Lv4.逐梦者

梦石
0
星屑
9559
在线时间
1040 小时
注册时间
2016-8-22
帖子
59

开拓者

2
发表于 2023-6-20 11:02:50 | 只看该作者
楼主看下 Triacontane 的 NpcFollower 插件合适不
草草翻译了一下
JAVASCRIPT 代码复制下载
  1. //=============================================================================
  2. // NpcFollower.js
  3. // ----------------------------------------------------------------------------
  4. // (C) 2016 Triacontane
  5. // This software is released under the MIT License.
  6. // [url]http://opensource.org/licenses/mit-license.php[/url]
  7. // ----------------------------------------------------------------------------
  8. // Version
  9. // 1.1.2 2022/05/10 パラメータの説明文を修正
  10. // 1.1.1 2019/11/02 1.1.0の修正でメンバーの入れ替えを実施すると表示が不正になる場合がある問題を修正
  11. // 1.1.0 2019/01/27 通常のフォロワーを表示せず、NPCフォロワーのみを表示できる機能を追加
  12. // 1.0.3 2018/08/06 コアスクリプトが1.6.0より古い場合にエラーになる記述を修正
  13. // 1.0.2 2017/01/17 プラグインコマンドが小文字でも動作するよう修正(byこまちゃん先輩)
  14. // 1.0.1 2016/07/17 セーブデータをロードした際のエラーになる現象の修正
  15. // 1.0.0 2016/07/14 初版
  16. // ----------------------------------------------------------------------------
  17. // [Blog]   : [url]https://triacontane.blogspot.jp/[/url]
  18. // [Twitter]: [url]https://twitter.com/triacontane/[/url]
  19. // [GitHub] : [url]https://github.com/triacontane/[/url]
  20. //=============================================================================
  21.  
  22. /*:
  23.  * @plugindesc NPC 跟随插件
  24.  * @author triacontane
  25.  *
  26.  * @param MaxNpcNumber
  27.  * @desc 队列中可以同时存在的 npc 的最大数量。
  28.  * @default 1
  29.  *
  30.  * @param HideNormalFollower
  31.  * @desc 不显示常规跟随者,仅显示 npc 跟随者。启用数据库列队行走。
  32.  * @default false
  33.  * @type boolean
  34.  *
  35.  * @help 将队员以外的NPC添加到地图上排中的任何位置。
  36.  * NPC 在数据库中由 Actor 定义,然后从插件命令中添加或删除。
  37.  * 因为不是战斗员,所以不会影响菜单画面和战斗画面。
  38.  * 此外,如果不显示编队,则不会显示任何内容。
  39.  *
  40.  * 您还可以添加具有相同 ID 的多个角色。
  41.  *
  42.  * 插件命令详细信息
  43.  *  从事件命令“插件命令”运行。
  44.  *  (参数之间用半角空格分隔)
  45.  *
  46.  * NF_NPC追加 4 1 # 增加ID为[4]的角色为NPC,加入队伍第1个人后面
  47.  * NF_ADD_NPC 5 3 # 将角色 ID [5]作为 npc 添加到队伍第3个人后面
  48.  * NF_NPC削除 1   # [1]番目に追加したNPCを全て削除
  49.  * NF_REM_NPC 3   # [3]番目に追加したNPCを全て削除
  50.  *
  51.  * 索引指定与添加的NPC无关,而是与队伍的顺序有关(1... 战斗成员的数量)。。
  52.  *
  53.  * This plugin is released under the MIT License.
  54.  */
  55. /*:ja
  56.  * @plugindesc NPCフォロワープラグイン
  57.  * @author トリアコンタン
  58.  *
  59.  * @param 最大同時NPC数
  60.  * @desc 同時に隊列に存在できるNPCの最大数です。
  61.  * @default 1
  62.  * @type number
  63.  * @min 1
  64.  *
  65.  * @param 通常フォロワーを表示しない
  66.  * @desc 通常のフォロワーを一切表示せず、NPCフォロワーのみを表示します。データベースの隊列歩行は有効にしてください。
  67.  * @default false
  68.  * @type boolean
  69.  *
  70.  * @help マップ上の隊列の好きな位置にパーティメンバー以外のNPCを追加します。
  71.  * NPCはデータベース上はアクターで定義してプラグインコマンドから追加、削除します。
  72.  * 戦闘員ではないので、メニュー画面や戦闘画面には影響を与えません。
  73.  * また、隊列表示していない場合は何も表示されません。
  74.  *
  75.  * 同一IDのアクターを複数追加することもできます。
  76.  *
  77.  * プラグインコマンド詳細
  78.  *  イベントコマンド「プラグインコマンド」から実行。
  79.  *  (パラメータの間は半角スペースで区切る)
  80.  *
  81.  * NF_NPC追加 4 1 # アクターID[4]をNPCとしてパーティの[1]番目の後ろに追加
  82.  * NF_ADD_NPC 5 3 # アクターID[5]をNPCとしてパーティの[3]番目の後ろに追加
  83.  * NF_NPC削除 1   # [1]番目に追加したNPCを全て削除
  84.  * NF_REM_NPC 3   # [3]番目に追加したNPCを全て削除
  85.  *
  86.  * インデックスの指定は追加したNPCとは関係なく、
  87.  * パーティの並び順(1...バトルメンバー数)を指定してください。
  88.  *
  89.  * 利用規約:
  90.  *  作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)
  91.  *  についても制限はありません。
  92.  *  このプラグインはもうあなたのものです。
  93.  */
  94.  
  95. (function() {
  96.     'use strict';
  97.     var pluginName    = 'NpcFollower';
  98.     var metaTagPrefix = 'NF';
  99.  
  100.     var getCommandName = function(command) {
  101.         return (command || '').toUpperCase();
  102.     };
  103.  
  104.     var getParamOther = function(paramNames) {
  105.         if (!Array.isArray(paramNames)) paramNames = [paramNames];
  106.         for (var i = 0; i < paramNames.length; i++) {
  107.             var name = PluginManager.parameters(pluginName)[paramNames[i]];
  108.             if (name) return name;
  109.         }
  110.         return null;
  111.     };
  112.  
  113.     var getParamBoolean = function(paramNames) {
  114.         var value = getParamOther(paramNames);
  115.         return (value || '').toUpperCase() === 'TRUE';
  116.     };
  117.  
  118.     var getParamNumber = function(paramNames, min, max) {
  119.         var value = getParamOther(paramNames);
  120.         if (arguments.length < 2) min = -Infinity;
  121.         if (arguments.length < 3) max = Infinity;
  122.         return (parseInt(value, 10) || 0).clamp(min, max);
  123.     };
  124.  
  125.     var getArgNumberWithEval = function(arg, min, max) {
  126.         if (arguments.length < 2) min = -Infinity;
  127.         if (arguments.length < 3) max = Infinity;
  128.         return (parseInt(eval(convertEscapeCharacters(arg)), 10) || 0).clamp(min, max);
  129.     };
  130.  
  131.     var convertEscapeCharacters = function(text) {
  132.         if (text == null) text = '';
  133.         var windowLayer = SceneManager._scene._windowLayer;
  134.         return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
  135.     };
  136.  
  137.     //=============================================================================
  138.     // パラメータの取得と整形
  139.     //=============================================================================
  140.     var paramMaxNpcNumber       = getParamNumber(['MaxNpcNumber', '最大同時NPC数']);
  141.     var paramHideNormalFollower = getParamBoolean(['HideNormalFollower', '通常フォロワーを表示しない']);
  142.  
  143.     //=============================================================================
  144.     // Game_Interpreter
  145.     //  プラグインコマンドを追加定義します。
  146.     //=============================================================================
  147.     var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
  148.     Game_Interpreter.prototype.pluginCommand = function(command, args) {
  149.         _Game_Interpreter_pluginCommand.apply(this, arguments);
  150.         this.pluginCommandNpcFollower(command.replace(new RegExp(metaTagPrefix, 'i'), ''), args);
  151.     };
  152.  
  153.     Game_Interpreter.prototype.pluginCommandNpcFollower = function(command, args) {
  154.         switch (getCommandName(command)) {
  155.             case '_NPC追加' :
  156.             case '_ADD_NPC' :
  157.                 var actorId = getArgNumberWithEval(args[0]);
  158.                 $gameParty.addNpc(actorId, getArgNumberWithEval(args[1], 1));
  159.                 break;
  160.             case '_NPC削除' :
  161.             case '_REM_NPC' :
  162.                 $gameParty.removeNpc(getArgNumberWithEval(args[0], 1));
  163.                 break;
  164.         }
  165.     };
  166.  
  167.     //=============================================================================
  168.     // Game_Party
  169.     //  NPCの追加と削除を追加定義します。
  170.     //=============================================================================
  171.     var _Game_Party_initialize      = Game_Party.prototype.initialize;
  172.     Game_Party.prototype.initialize = function() {
  173.         _Game_Party_initialize.apply(this, arguments);
  174.         this.initNpc();
  175.     };
  176.  
  177.     Game_Party.prototype.initNpc = function() {
  178.         this._npcs       = [];
  179.         this._npcIndexes = [];
  180.     };
  181.  
  182.     Game_Party.prototype.isNpcInvalid = function() {
  183.         return !this._npcs;
  184.     };
  185.  
  186.     Game_Party.prototype.initNpcIfNeed = function() {
  187.         if (this.isNpcInvalid()) {
  188.             this.initNpc();
  189.             $gamePlayer.followers().initNpc();
  190.         }
  191.     };
  192.  
  193.     Game_Party.prototype.addNpc = function(actorId, index) {
  194.         if (this._npcs.length < paramMaxNpcNumber) {
  195.             this._npcs.push(actorId);
  196.             this._npcIndexes.push(index);
  197.             $gamePlayer.refresh();
  198.             $gameMap.requestRefresh();
  199.         } else {
  200.             throw new Error('登録可能な最大数を超えています。');
  201.         }
  202.     };
  203.  
  204.     Game_Party.prototype.removeNpc = function(index) {
  205.         for (var i = 0, n = this._npcs.length; i < n; i++) {
  206.             if (this._npcIndexes[i] === index) {
  207.                 this._npcs.splice(i, 1);
  208.                 this._npcIndexes.splice(i, 1);
  209.                 i--;
  210.             }
  211.         }
  212.         $gamePlayer.refresh();
  213.         $gameMap.requestRefresh();
  214.     };
  215.  
  216.     Game_Party.prototype.npcMembers = function() {
  217.         return this._npcs.map(function(id) {
  218.             return $gameActors.actor(id);
  219.         });
  220.     };
  221.  
  222.     Game_Party.prototype.visibleMembers = function() {
  223.         return this._visibleMembers;
  224.     };
  225.  
  226.     Game_Party.prototype.makeVisibleMembers = function() {
  227.         var battleMembers  = this.battleMembers();
  228.         var npcMembers     = this.npcMembers();
  229.         var visibleMembers = [];
  230.         for (var i = 0, n = this.maxBattleMembers() + 1; i < n; i++) {
  231.             for (var j = 0, m = npcMembers.length; j < m; j++) {
  232.                 if (this._npcIndexes[j] === i) {
  233.                     visibleMembers.push(npcMembers[j]);
  234.                 }
  235.             }
  236.             if (battleMembers.length > i && !paramHideNormalFollower) {
  237.                 visibleMembers.push(battleMembers[i]);
  238.             }
  239.         }
  240.         this._visibleMembers = visibleMembers;
  241.     };
  242.  
  243.     //=============================================================================
  244.     // Game_Followers
  245.     //  NPCの最大数ぶんだけ余分にGame_Followerを作成します。
  246.     //=============================================================================
  247.     var _Game_Followers_initialize      = Game_Followers.prototype.initialize;
  248.     Game_Followers.prototype.initialize = function() {
  249.         _Game_Followers_initialize.apply(this, arguments);
  250.         if (paramHideNormalFollower) {
  251.             this._data = [];
  252.         }
  253.         this.initNpc();
  254.     };
  255.  
  256.     Game_Followers.prototype.initNpc = function() {
  257.         var memberLength = this._data.length > 0 ? this._data.length + 1 : 0;
  258.         for (var i = 0; i < paramMaxNpcNumber; i++) {
  259.             this._data.push(new Game_Follower(memberLength + i));
  260.         }
  261.     };
  262.  
  263.     //=============================================================================
  264.     // Game_Follower
  265.     //  NPC判定を追加定義します。
  266.     //=============================================================================
  267.     var _Game_Follower_actor      = Game_Follower.prototype.actor;
  268.     Game_Follower.prototype.actor = function() {
  269.         _Game_Follower_actor.apply(this, arguments);
  270.         return $gameParty.visibleMembers()[this._memberIndex];
  271.     };
  272.  
  273.     //=============================================================================
  274.     // Game_Player
  275.     //  リフレッシュまえに表示メンバーを更新します。
  276.     //=============================================================================
  277.     var _Game_Player_refresh      = Game_Player.prototype.refresh;
  278.     Game_Player.prototype.refresh = function() {
  279.         $gameParty.makeVisibleMembers();
  280.         _Game_Player_refresh.apply(this, arguments);
  281.     };
  282.  
  283.     //=============================================================================
  284.     // DataManager
  285.     //  プラグイン未適用のデータをロードした場合に必要なデータを初期化します。
  286.     //=============================================================================
  287.     var _DataManager_loadGame = DataManager.loadGame;
  288.     DataManager.loadGame      = function(saveFileId) {
  289.         var result = _DataManager_loadGame.apply(this, arguments);
  290.         $gameParty.initNpcIfNeed();
  291.         return result;
  292.     };
  293. })();
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 11:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表