找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 130|回复: 1

[js脚本] 【服务端】[GMS083] [事件脚本] 如何实现最简单的Boss召唤功能

[复制链接]

4

主题

12

回帖

111

积分

注册会员

积分
111
发表于 2025-2-22 14:04:02 | 显示全部楼层 |阅读模式
本帖最后由 Magical-H 于 2025-2-22 14:15 编辑

使用事件脚本实现最简单的Boss召唤功能

本教程以北斗服务端(https://github.com/BeiDouMS/BeiDou-Server)为基础进行制作

北斗服务端自带有一个包含中文注释的事件模板,路径位于:scripts-zh-CN/event/0_EXAMPLE.js
但是召唤Boss这些功能还需要另外构造代码,本贴简单讲解如何实现召唤。

本次例子以修复东方神州大王蜈蚣事件为例子(NPC使用NextLevel语法构造):
事件与NPC脚本均有注释以方便理解

以下代码为事件自带的变量,可以根据需求自定义
  1. // 事件实例化变量
  2. var isPq = true; // 是否为PQ(Party Quest)类型事件。
  3. var minPlayers = 1, maxPlayers = 6; // 该事件实例允许的队伍成员数量范围。
  4. var minLevel = 25, maxLevel = 90;     // 合格队伍成员的等级范围。
  5. var entryMap = 701010323;               // 事件启动时玩家进入的初始地图。
  6. var exitMap = 701010320;                // 玩家未能完成事件时被传送至此地图。
  7. var recruitMap = 701010322;             // 玩家必须在此地图上才能开始此事件。
  8. var clearMap = 701010323;               // 玩家成功完成事件后被传送至此地图。

  9. var minMapId = 701010323;               // 事件发生在此地图ID区间内。若玩家超出此范围则立即从事件中移除。
  10. var maxMapId = 701010323;

  11. var eventTime = 10;              // 事件的最大允许时间,以分钟计。

  12. const maxLobbies = 1;       // 并发活跃大厅的最大数量。

  13. var BossID = 9600009;                   // 待生成的BOSS
  14. var PosX = 2261 , PosY = 823;           // 生成的坐标
  15. var Difficulty = true;                  // 根据传入的难度值以倍数方式提高怪物的各项指标,在BossID有效的情况下。

  16. var BossDropList = [2000005];                  // 掉落物品列表
  17. var BossDropCount = [5];                 // 掉落最大数量
  18. var BossDropChance = [0.4];                // 掉率

  19. const GameConfig = Java.type('org.gms.config.GameConfig');
  20. minPlayers = GameConfig.getServerBoolean("use_enable_solo_expeditions") ? 1 : minPlayers;  // 如果解除远征队人数限制,则最低人数改为1人
复制代码

以下为设置事件要求信息
  1. /**
  2. * 设置并显示事件的要求信息。
  3. */
  4. function setEventRequirements() {
  5.     var reqStr = "";

  6.     reqStr += "\r\n   组队人数: ";
  7.     if (maxPlayers - minPlayers >= 1) {
  8.         reqStr += minPlayers + " ~ " + maxPlayers;
  9.     } else {
  10.         reqStr += minPlayers;
  11.     }

  12.     reqStr += "\r\n   等级要求: ";
  13.     if (maxLevel - minLevel >= 1) {
  14.         reqStr += minLevel + " ~ " + maxLevel;
  15.     } else {
  16.         reqStr += minLevel;
  17.     }

  18.     reqStr += "\r\n   时间限制: ";
  19.     reqStr += eventTime + " 分钟";

  20.     em.setProperty("party", reqStr);
  21. }
复制代码


以下为设置事件召唤Boss关键代码
  1. /**
  2. * 设置事件实例。
  3. * @param {number} level - 事件级别。
  4. * @param {number} lobbyid - 大厅ID。
  5. * @returns {EventInstanceManager} 事件实例管理器。
  6. */
  7. function setup(level, lobbyid) {
  8.     let eim = em.newInstance(em.getName() + lobbyid);
  9.     eim.setProperty("level", level);

  10.     respawnStages(eim);
  11.     eim.startEventTimer(eventTime * 60000);
  12.     setEventRewards(eim);
  13.     setEventExclusives(eim);

  14.     /**
  15.      * 以下为自定义召唤指定Boss,如BossID为null或者不存在则使用默认的地图生怪。
  16.      * @type {any}
  17.      */
  18.     if(BossID != null && BossID > 0) {
  19.         const LifeFactory = Java.type('org.gms.server.life.LifeFactory');
  20.         let mob = LifeFactory.getMonster(BossID);
  21.         if(mob != null) {
  22.             let map = eim.getMapInstance(entryMap);
  23.             map.killAllMonsters();      // 杀死原本地图上的所有怪物
  24.             if(Difficulty) {
  25.                 level = level <= 0 ? 1 : level; //最小难度为1
  26.                 let stats = mob.getStats();
  27.                 let HpMax = mob.getMaxHp() * level;
  28.                     HpMax = HpMax > 2147483647 ? 2147483647 : HpMax;
  29.                 let MpMax = mob.getMaxMp() * level;
  30.                     MpMax = MpMax > 2147483647 ? 2147483647 : MpMax;
  31.                 mob.setStartingHp(HpMax);
  32.                 mob.setMp(MpMax);
  33.                 //以下属性似乎没有作用,先留着
  34.                 stats.setPADamage(stats.getPADamage() * level);
  35.                 stats.setPDDamage(stats.getPDDamage() * level);
  36.                 stats.setMADamage(stats.getMADamage() * level);
  37.                 stats.setMDDamage(stats.getMDDamage() * level);
  38.                 mob.setStats(stats);
  39.             }
  40.             map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(PosX, PosY));     //生成指定怪物在指定坐标
  41.         }
  42.     }

  43.     const DropList = BossDropList;                                  // 掉落物品列表
  44.     const DropCount = BossDropCount;                                // 掉落最大数量
  45.     const DropChance = BossDropChance;                              // 掉率
  46.     BossDropList = [];
  47.     for (let i = 0; i < DropList.length; i++) {
  48.         const chance = DropChance[i] * 10000;
  49.         for (let j = 0; j < DropCount[i]; j++) {
  50.             if (Math.random() * 10000 < chance) {
  51.                 BossDropList.push(DropList[i]);
  52.             }
  53.         }
  54.     }
  55.     return eim;
  56. }
复制代码
以下为NPC开始事件代码
  1. function levelEnter() {
  2.     let msg;
  3.     //4103和8512均为寻找赤珠的任务,似乎是不同版本的任务。
  4.     if(!isRepeat && (cm.isQuestCompleted(4103) || cm.isQuestCompleted(8512))) {//完成了赤珠任务将传送到一个地图
  5.         let level = cm.getLevel();
  6.         if(level >= LevelMin && level <= LevelMax) {
  7.             cm.warp(mapID);
  8.         } else {
  9.             msg = '你目前无法执行这个#b秘密任务#k,因你不符合要求:\r\n\r\n';
  10.             msg += `等级要求:${LevelMin} ~ ${LevelMax}`;
  11.         }
  12.     } else {
  13.         var eli = em.getEligibleParty(cm.getParty());
  14.         if (eli.size() > 0) {
  15.             if (!em.startInstance(cm.getParty(), cm.getPlayer().getMap(), EventLevel)) {
  16.                 msg = '已经有其他人员在执行#b秘密任务#k了,请稍后再试。';
  17.             }
  18.         } else {
  19.             msg = '你目前无法执行这个#b秘密任务#k,因你不符合要求:' + em.getProperty('party');
  20.         }
  21.     }
  22.     if(msg) cm.sendOk(msg);
  23.     leveldispose();
  24. }
复制代码
关键代码基本上就由这几部分组成,剩下的请参考完整代码里的注释

由于篇幅受限,完整代码改为附件形式。
1、将下方附件下载后重名为并保存到路径:scripts-zh-CN/event/WuGongPQ.js



2、将下方附件下载后重名为并保存到路径:scripts-zh-CN/npc/9310006.js




至此,完成了大王蜈蚣召唤事件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1金钱 +10 收起 理由
leevccc + 10

查看全部评分

4

主题

11

回帖

8

积分

新手上路

积分
8
发表于 2025-2-24 18:21:28 | 显示全部楼层
正在學習事件方面的,太感謝了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|蘑菇物语

GMT+8, 2025-4-20 07:33 , Processed in 0.052474 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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