微信扫一扫 分享朋友圈

已有 41 人浏览分享

[服務器教學] 專屬怪物和NPC

[複製鏈接]

初窺門道

275

威望

910

金錢

333

A幣
主題
44
回帖
34
精華
1
綜合社群主題發文量
0
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
44
閱讀權限
20
註冊時間
2021-11-15
  • TA的每日心情
    奮鬥
    2024-1-28 13:17
  • 簽到天數: 1 天

    連續簽到: 1 天

    [LV.1]初來乍到

    chenhui540 發表於  昨天 08:47 | 顯示全部樓層 | 閱讀模式

    QQ图片20260801083915.png


    public class MapleMonster extends AbstractLoadedMapleLife {

        private MapleMonsterStats stats;
        private ChangeableStats ostats = null;
        private long hp;
        private long nextKill = 0;
        private long lastDropTime = 0;
        private int mp;
        private byte carnivalTeam = -1;
        private int owner = -1; //怪物专属权

    ############################################################

        public int getOwner() {
            return owner;
        }

        public void setOwner(int owner) {
            this.owner = owner;
        }

    ############################################################

        /*
        怪物控制权相关
        */
        public void controlMonster(MapleMonster monster, boolean aggro) {
            if (monster == null) {
                return;
            }
            monster.setController(this);
            controlledLock.writeLock().lock();
            try {
                controlled.add(monster);
            } finally {
                controlledLock.writeLock().unlock();
            }
            if (monster.getOwner() == -1 || monster.getOwner() == this.getId()) { //怪物专属权
                client.getSession().write(MobPacket.controlMonster(monster, false, aggro));
            }
            monster.sendStatus(client);
        }

    ############################################################

        public void sendSpawnData(MapleClient client) {
            if (!isAlive() || owner >= 0 && owner != client.getPlayer().getId()) { //怪物专属权
                return;
            }
            client.getSession().write(MobPacket.spawnMonster(this, fake && linkCID <= 0 ? -4 : -1, 0));
            sendStatus(client);

            if (map != null && !stats.isEscort() && client.getPlayer() != null && client.getPlayer().getTruePosition().distanceSq(getTruePosition()) <= GameConstants.maxViewRangeSq_Half()) {
                map.updateMonsterController(this);
            }
        }

    ############################################################
    BOSS技能

                case 200: //召唤怪物
                    if (monster == null) {
                        return;
                    }
                    for (Integer mobId : getSummons()) {
                        MapleMonster toSpawn = null;
                        try {
                            //toSpawn = MapleLifeFactory.getMonster(GameConstants.getCustomSpawnID(monster.getId(), mobId));
                            toSpawn = MapleLifeFactory.getMonster(mobId);
                        } catch (RuntimeException e) {
                            continue;
                        }
                        if (skillLevel == 221) {
                            toSpawn = MapleLifeFactory.getMonster(getSummons().get(Randomizer.rand(0, 4)));
                        }
                        if (toSpawn == null) {
                            continue;
                        }
                        if (monster.getOwner() != -1) { //衍生的怪物专属权
                            toSpawn.setOwner(monster.getOwner());
                        }

    ############################################################

        /*
        召唤怪物专属权
        */
        public void spawnLinkMob(int id, int x, int y) {
            MapleMonster m = MapleLifeFactory.getMonster(id);
            m.setHp((long) (m.getStats().getHp()));
            m.getStats().setHp((long) (m.getStats().getHp()));
            m.setOwner(client.getPlayer().getId());
            client.getPlayer().getMap().spawnMonsterOnGroundBelow(m, new Point(x, y));
        }

    ############################################################


    public class MapleNPC extends AbstractLoadedMapleLife {

        private String name = "MISSINGNO";
        private boolean custom = false;
        private int owner = -1; //NPC专属权


    ############################################################

        public int getOwner() { //NPC专属权
            return owner;
        }

        public void setOwner(int owner) {
            this.owner = owner;
        }

    ############################################################

        @Override
        public void sendSpawnData(MapleClient client) {
            if (getId() > 9901000 || owner >= 0 && owner != client.getPlayer().getId()) { //NPC专属权
                return;
            }
            client.getSession().write(MaplePacketCreator.spawnNPC(this, true));
            client.getSession().write(MaplePacketCreator.spawnNPCRequestController(this, true));
        }


    ############################################################


        /*
        召唤NPC专属权
        */
        public void spawnLinkNPC(int npcid, int x, int y, int f) {
            MapleNPC npc;
            npc = MapleLifeFactory.getNPC(npcid);
            if (npc == null) {
                return;
            }
            npc.setPosition(new Point(x, y));
            npc.setCy(y);
            npc.setRx0(x - 50);
            npc.setRx1(x + 50);
            npc.setF(f);
            npc.setFh(getMap().getFootholds().findBelow(new Point(x, y)).getId());
            npc.setCustom(true);
            npc.setObjectId(npcid);
            npc.setOwner(client.getPlayer().getId());
            client.getPlayer().getMap().addMapObject(npc);
            client.getSession().write(MaplePacketCreator.spawnNPC(npc, true));
            client.getSession().write(MaplePacketCreator.spawnNPCRequestController(npc, true));
        }
    }

    ############################################################


        private void spawnAndAddRangedMapObject(MapleMapObject mapobject, DelayedPacketCreation packetbakery) {
            addMapObject(mapobject);

            charactersLock.readLock().lock();
            try {
                final Iterator<MapleCharacter> itr = characters.iterator();
                MapleCharacter chr;
                while (itr.hasNext()) {
                    chr = itr.next();
                    if ((mapobject.getType() == MapleMapObjectType.MIST || chr.getTruePosition().distanceSq(mapobject.getTruePosition()) <= GameConstants.maxViewRangeSq())) {
                        if (mapobject.getType() == MapleMapObjectType.MONSTER) {
                            MapleMonster mob = (MapleMonster) mapobject;
                            if (mob.getOwner() != -1) {
                                if (mob.getOwner() == chr.getId()) { //怪物专属权
                                    packetbakery.sendPackets(chr.getClient());
                                }
                            } else {
                                packetbakery.sendPackets(chr.getClient());
                            }
                        } else if (mapobject.getType() == MapleMapObjectType.NPC) {
                            MapleNPC npc = (MapleNPC) mapobject;
                            if (npc.getOwner() != -1) {
                                if (npc.getOwner() == chr.getId()) { //NPC专属权
                                    packetbakery.sendPackets(chr.getClient());
                                }
                            } else {
                                packetbakery.sendPackets(chr.getClient());
                            }
                        } else {
                            packetbakery.sendPackets(chr.getClient());
                        }
                        chr.addVisibleMapObject(mapobject);
                    }
                }
            } finally {
                charactersLock.readLock().unlock();
            }
        }

    ############################################################

        /*
        离开地图移除角色设置
        */
        public void removePlayer(MapleCharacter chr) {
            if (everlast) {
                returnEverLastItem(chr);
            }

            charactersLock.writeLock().lock();
            try {
                characters.remove(chr);
            } finally {
                charactersLock.writeLock().unlock();
            }
            removeMapObject(chr);
            chr.checkFollow();
            chr.removeExtractor();
            //chr.cancelEffectFromBuffStat(MapleBuffStat.SIDEKICK_PASSIVE);

            for (Item item : chr.getInventory(MapleInventoryType.EQUIPPED).list()) {
                if (GameConstants.isEffectRing(item.getItemId())) {
                    broadcastMessage(MaplePacketCreator.updateCharLook(chr)); //更新玩家外观,去除戒指特效遗留
                }
            }
            broadcastMessage(MaplePacketCreator.removePlayerFromMap(chr.getId()));

            List<MapleSummon> toCancel = new ArrayList();
            List<MapleSummon> ss = chr.getSummonsReadLock();
            try {
                for (MapleSummon summon : ss) {
                    broadcastMessage(MaplePacketCreator.removeSummon(summon, true));
                    removeMapObject(summon);
                    if (summon.getMovementType() == SummonMovementType.STATIONARY || summon.getMovementType() == SummonMovementType.CIRCLE_STATIONARY || summon.getMovementType() == SummonMovementType.WALK_STATIONARY) {
                        toCancel.add(summon);
                    } else {
                        summon.setChangedMap(true);
                    }
                }
            } finally {
                chr.unlockSummonsReadLock();
            }
            for (MapleSummon summon : toCancel) {
                chr.removeSummon(summon);
                chr.dispelSkill(summon.getSkill());
            }

            checkStates(chr.getName());
            if (mapid == 109020001) {
                chr.canTalk(true);
            }
            for (MapleMonster m : chr.getMap().getAllMonster()) { //角色离开地图时,清除专属权怪物
                if (m.getOwner() == chr.getId()) {
                    m.setHp(0);
                    broadcastMessage(MobPacket.killMonster(m.getObjectId(), 0));
                    removeMapObject(m);
                    m.killed();
                    spawnedMonstersOnMap.decrementAndGet();
                }
            }
            for (MapleNPC n : chr.getMap().getAllNPCs()) { //角色离开地图时,清除专属权NPC
                if (n.getOwner() == chr.getId()) {
                    chr.getClient().getSession().write(MaplePacketCreator.removeNPCController(n.getObjectId()));
                    chr.getClient().getSession().write(MaplePacketCreator.removeNPC(n.getObjectId()));
                    removeMapObject(n);
                }
            }
            if (this.getFly() && chr.getStatForBuff(MapleBuffStat.骑兽技能) != null) { //离开飞行地图
                chr.cancelEffectFromBuffStat(MapleBuffStat.骑兽技能);
            }
            chr.leaveMap(this);
        }


    共收到 0 金錢
    打賞榜
    暫無
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    78

    發文

    910

    金錢

    333

    A幣

    ----------榮譽勳章----------

    熱門推薦
    圖文推薦
    • 聯繫我們

    手機版|小黑屋|AICL社群娛樂集團

    GMT+8, 2026-8-2 04:54 , 網路刷新 0.111248 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322