|
本帖最后由 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脚本均有注释以方便理解
以下代码为事件自带的变量,可以根据需求自定义
- // 事件实例化变量
- var isPq = true; // 是否为PQ(Party Quest)类型事件。
- var minPlayers = 1, maxPlayers = 6; // 该事件实例允许的队伍成员数量范围。
- var minLevel = 25, maxLevel = 90; // 合格队伍成员的等级范围。
- var entryMap = 701010323; // 事件启动时玩家进入的初始地图。
- var exitMap = 701010320; // 玩家未能完成事件时被传送至此地图。
- var recruitMap = 701010322; // 玩家必须在此地图上才能开始此事件。
- var clearMap = 701010323; // 玩家成功完成事件后被传送至此地图。
- var minMapId = 701010323; // 事件发生在此地图ID区间内。若玩家超出此范围则立即从事件中移除。
- var maxMapId = 701010323;
- var eventTime = 10; // 事件的最大允许时间,以分钟计。
- const maxLobbies = 1; // 并发活跃大厅的最大数量。
- var BossID = 9600009; // 待生成的BOSS
- var PosX = 2261 , PosY = 823; // 生成的坐标
- var Difficulty = true; // 根据传入的难度值以倍数方式提高怪物的各项指标,在BossID有效的情况下。
- var BossDropList = [2000005]; // 掉落物品列表
- var BossDropCount = [5]; // 掉落最大数量
- var BossDropChance = [0.4]; // 掉率
- const GameConfig = Java.type('org.gms.config.GameConfig');
- minPlayers = GameConfig.getServerBoolean("use_enable_solo_expeditions") ? 1 : minPlayers; // 如果解除远征队人数限制,则最低人数改为1人
复制代码
以下为设置事件要求信息- /**
- * 设置并显示事件的要求信息。
- */
- function setEventRequirements() {
- var reqStr = "";
- reqStr += "\r\n 组队人数: ";
- if (maxPlayers - minPlayers >= 1) {
- reqStr += minPlayers + " ~ " + maxPlayers;
- } else {
- reqStr += minPlayers;
- }
- reqStr += "\r\n 等级要求: ";
- if (maxLevel - minLevel >= 1) {
- reqStr += minLevel + " ~ " + maxLevel;
- } else {
- reqStr += minLevel;
- }
- reqStr += "\r\n 时间限制: ";
- reqStr += eventTime + " 分钟";
- em.setProperty("party", reqStr);
- }
复制代码
以下为设置事件召唤Boss关键代码
- /**
- * 设置事件实例。
- * @param {number} level - 事件级别。
- * @param {number} lobbyid - 大厅ID。
- * @returns {EventInstanceManager} 事件实例管理器。
- */
- function setup(level, lobbyid) {
- let eim = em.newInstance(em.getName() + lobbyid);
- eim.setProperty("level", level);
- respawnStages(eim);
- eim.startEventTimer(eventTime * 60000);
- setEventRewards(eim);
- setEventExclusives(eim);
- /**
- * 以下为自定义召唤指定Boss,如BossID为null或者不存在则使用默认的地图生怪。
- * @type {any}
- */
- if(BossID != null && BossID > 0) {
- const LifeFactory = Java.type('org.gms.server.life.LifeFactory');
- let mob = LifeFactory.getMonster(BossID);
- if(mob != null) {
- let map = eim.getMapInstance(entryMap);
- map.killAllMonsters(); // 杀死原本地图上的所有怪物
- if(Difficulty) {
- level = level <= 0 ? 1 : level; //最小难度为1
- let stats = mob.getStats();
- let HpMax = mob.getMaxHp() * level;
- HpMax = HpMax > 2147483647 ? 2147483647 : HpMax;
- let MpMax = mob.getMaxMp() * level;
- MpMax = MpMax > 2147483647 ? 2147483647 : MpMax;
- mob.setStartingHp(HpMax);
- mob.setMp(MpMax);
- //以下属性似乎没有作用,先留着
- stats.setPADamage(stats.getPADamage() * level);
- stats.setPDDamage(stats.getPDDamage() * level);
- stats.setMADamage(stats.getMADamage() * level);
- stats.setMDDamage(stats.getMDDamage() * level);
- mob.setStats(stats);
- }
- map.spawnMonsterOnGroundBelow(mob, new java.awt.Point(PosX, PosY)); //生成指定怪物在指定坐标
- }
- }
- const DropList = BossDropList; // 掉落物品列表
- const DropCount = BossDropCount; // 掉落最大数量
- const DropChance = BossDropChance; // 掉率
- BossDropList = [];
- for (let i = 0; i < DropList.length; i++) {
- const chance = DropChance[i] * 10000;
- for (let j = 0; j < DropCount[i]; j++) {
- if (Math.random() * 10000 < chance) {
- BossDropList.push(DropList[i]);
- }
- }
- }
- return eim;
- }
复制代码 以下为NPC开始事件代码- function levelEnter() {
- let msg;
- //4103和8512均为寻找赤珠的任务,似乎是不同版本的任务。
- if(!isRepeat && (cm.isQuestCompleted(4103) || cm.isQuestCompleted(8512))) {//完成了赤珠任务将传送到一个地图
- let level = cm.getLevel();
- if(level >= LevelMin && level <= LevelMax) {
- cm.warp(mapID);
- } else {
- msg = '你目前无法执行这个#b秘密任务#k,因你不符合要求:\r\n\r\n';
- msg += `等级要求:${LevelMin} ~ ${LevelMax}`;
- }
- } else {
- var eli = em.getEligibleParty(cm.getParty());
- if (eli.size() > 0) {
- if (!em.startInstance(cm.getParty(), cm.getPlayer().getMap(), EventLevel)) {
- msg = '已经有其他人员在执行#b秘密任务#k了,请稍后再试。';
- }
- } else {
- msg = '你目前无法执行这个#b秘密任务#k,因你不符合要求:' + em.getProperty('party');
- }
- }
- if(msg) cm.sendOk(msg);
- leveldispose();
- }
复制代码 关键代码基本上就由这几部分组成,剩下的请参考完整代码里的注释
由于篇幅受限,完整代码改为附件形式。
1、将下方附件下载后重名为并保存到路径:scripts-zh-CN/event/WuGongPQ.js
2、将下方附件下载后重名为并保存到路径:scripts-zh-CN/npc/9310006.js
至此,完成了大王蜈蚣召唤事件。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|