微信扫一扫 分享朋友圈

已有 24 人浏览分享

[服務器教學] 設置單人地圖

[複製鏈接]

初窺門道

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 發表於  8 小時前 | 顯示全部樓層 | 閱讀模式
    QQ图片20260801084424.png

    枫之高校系列,没有子地图,为了多人玩家同时进入,必须设置成单人地图。怪物、NPC、物品掉落之类的只有自己可见。

    ########################################### MapleCharacter.java

        public void cancelEffect(MapleStatEffect effect, boolean overwrite, long startTime, Map<MapleBuffStat, Integer> statups) {
            if (effect == null) {
                return;
            }
            List<MapleBuffStat> buffstats;
            if (!overwrite) {
                buffstats = getBuffStats(effect, startTime);
            } else {
                buffstats = new ArrayList<>(statups.keySet());
            }
            if (buffstats.size() <= 0) {
                return;
            }

            if (effect.getSourceId() == 80001078) { //属于共乘技能
                checkFollow();//取消共乘
            }

            deregisterBuffStats(buffstats);

            if (effect.is时空门()) {
                if (!getDoors().isEmpty()) {
                    removeDoor();
                    silentPartyUpdate();
                }
            } else if (effect.is机械传送门()) {
                if (!getMechDoors().isEmpty()) {
                    removeMechDoor();
                }
            } else if (effect.is骑兽技能_()) {
                getMount().cancelSchedule();
            } else if (effect.is骑兽技能()) {
                cancelEffectFromBuffStat(MapleBuffStat.金属机甲);
            } else if (effect.is矛连击强化()) {
                combo = 0;
            }

            cancelPlayerBuffs(buffstats, overwrite);
            if (!overwrite) {
                if (effect.is隐藏术() && client.getChannelServer().getPlayerStorage().getCharacterById(getId()) != null) {
                    if (!GameConstants.isSchoolMap(client.getPlayer().getMap().getId())) { //单人地图限制
                        map.broadcastMessage(this, MaplePacketCreator.spawnPlayerMapobject(this), false);
                    }
                    for (MaplePet pet : pets) {
                        if (pet.getSummoned()) {
                            map.broadcastMessage(this, PetPacket.showPet(this, pet, false, false), false);
                        }
                    }
                }
            }

            if (effect.getSourceId() == 35121013 && !overwrite) {
                SkillFactory.getSkill(35121005).getEffect(getTotalSkillLevel(35121005)).applyTo(this); //金属机甲:导弹战车
            }
        }
    ########################################### MapleCharacter.java

        @Override
        public void sendDestroyData(MapleClient client) {
            client.getSession().write(MaplePacketCreator.removePlayerFromMap(this.getObjectId()));
        }

        public void sendSpawnData(MapleClient client) {
            if (client.getPlayer().allowedToTarget(this)) {
                if (!GameConstants.isSchoolMap(client.getPlayer().getMap().getId())) { //单人地图限制
                    client.getSession().write(MaplePacketCreator.spawnPlayerMapobject(this));
                }

                if (dragon != null) {
                    //client.getSession().write(MaplePacketCreator.spawnDragon(dragon));
                }
                if (android != null) { //暂时关闭过地图时再次召唤机器人
                    //client.getSession().write(AndroidPacket.spawnAndroid(this, android));
                }

                if (summons != null && summons.size() > 0) {
                    summonsLock.readLock().lock();
                    try {
                        for (MapleSummon summon : summons) {
                            client.getSession().write(MaplePacketCreator.spawnSummon(summon, false));
                        }
                    } finally {
                        summonsLock.readLock().unlock();
                    }
                }
                if (followid > 0 && followon) {
                    if (liftIndex == -1) {
                        client.getSession().write(MaplePacketCreator.followEffect(followinitiator ? followid : id, followinitiator ? id : followid, null));
                    } else{
                        client.getSession().write(MaplePacketCreator.CarLoadInfo(liftIndex == 0 ? id : followid, liftIndex == 0 ? followid : id, 0));
                    }
                }
            }
        }

    ########################################### MapleMonster.java

                    if (sponge.get() == null && hp > 0) {
                        switch (stats.getHPDisplayType()) {
                            case 0:
                                if (GameConstants.isSchoolMap(from.getMap().getId())) { //单人地图限制
                                    from.getClient().getSession().write(MobPacket.showBossHP(this));
                                } else {
                                    map.broadcastMessage(MobPacket.showBossHP(this), getTruePosition());
                                }
                                if (stats.isFriendly()) {
                                    map.broadcastMessage(MobPacket.damageFriendlyMob(this, damage, true));//显示友军掉血和剩余血量
                                    //map.broadcastMessage(MobPacket.MobToMobDamage(getObjectId(), damage, getId()), this.getTruePosition());
                                }
                                break;
                            case 1:
                                map.broadcastMessage(MobPacket.damageFriendlyMob(this, damage, true));//显示友军掉血和剩余血量
                                break;
                            case 2:
                                map.broadcastMessage(MobPacket.showMonsterHP(getObjectId(), getHPPercent()));
                                from.mulung_EnergyModify(true);
                                break;


    ########################################### MapleMap.java

        /*
        丢弃特殊道具设置
        */
        public void disappearingItemDrop(final MapleMapObject dropper, MapleCharacter owner, Item item, Point pos) {
            final Point droppos = calcDropPos(pos, pos);
            final MapleMapItem drop = new MapleMapItem(item, droppos, dropper, owner, (byte) 1, false);
            if (GameConstants.isSchoolMap(mapid)) { //单人地图限制
                if (drop.getOwner() == owner.getId()) {
                    owner.getClient().getSession().write(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getTruePosition(), droppos, (byte) 3));
                }
                return;
            }
            broadcastMessage(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getTruePosition(), droppos, (byte) 3), drop.getTruePosition());
        }

        /*
        掉落金币设置
        */
        public void spawnMesoDrop(final int meso, final Point position, final MapleMapObject dropper, MapleCharacter owner, boolean playerDrop, byte droptype) {
            final Point droppos = calcDropPos(position, position);
            final MapleMapItem mdrop = new MapleMapItem(meso, droppos, dropper, owner, droptype, playerDrop);

            spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {

                public void sendPackets(MapleClient c) {
                    if (owner.getId() != c.getPlayer().getId() && GameConstants.isSchoolMap(c.getPlayer().getMap().getId())) { //单人地图限制
                        return;
                    }
                    c.getSession().write(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getTruePosition(), droppos, (byte) 1));
                }
            });
            if (!everlast) {
                mdrop.registerExpire(120000);
                if (droptype == 0 || droptype == 1) {
                    mdrop.registerFFA(30000);
                }
            }
        }

        /*
        怪物掉落金币设置
        */
        public final void spawnMobMesoDrop(int meso, final Point position, final MapleMapObject dropper, final MapleCharacter owner, boolean playerDrop, byte droptype) {
            final MapleMapItem mdrop = new MapleMapItem(meso, position, dropper, owner, droptype, playerDrop);

            spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {

                public void sendPackets(MapleClient c) {
                    if (owner.getId() != c.getPlayer().getId() && GameConstants.isSchoolMap(c.getPlayer().getMap().getId())) { //单人地图限制
                        return;
                    }
                    c.getSession().write(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getTruePosition(), position, (byte) 1));
                }
            });
            mdrop.registerExpire(120000);
            if (droptype == 0 || droptype == 1) {
                mdrop.registerFFA(30000);
            }
        }

        /*
        怪物掉落道具设置
        */
        public final void spawnMobDrop(final Item idrop, final Point dropPos, final MapleMonster mob, MapleCharacter chr, byte droptype, final int questid) {
            final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, mob, chr, droptype, false, questid);

            spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {

                public void sendPackets(MapleClient c) {
                    if (c != null && c.getPlayer() != null && (questid <= 0 || c.getPlayer().getQuestStatus(questid) == 1) && mob != null && dropPos != null) {
                        if (chr.getId() != c.getPlayer().getId() && GameConstants.isSchoolMap(c.getPlayer().getMap().getId())) { //单人地图限制
                            return;
                        }
                        c.getSession().write(MaplePacketCreator.dropItemFromMapObject(mdrop, mob.getTruePosition(), dropPos, (byte) 1));
                    }
                }
            });
            mdrop.registerExpire(120000);
            if (droptype == 0 || droptype == 1) {
                mdrop.registerFFA(30000);
            }
            activateItemReactors(mdrop, chr.getClient());
        }

    ########################################### MapleMap.java

        /*
        掉落道具设置
        */
        public final void spawnItemDrop(final MapleMapObject dropper, final MapleCharacter owner, Item item, Point pos, boolean ffaDrop, boolean playerDrop) {
            final Point droppos = calcDropPos(pos, pos);
            final MapleMapItem drop = new MapleMapItem(item, droppos, dropper, owner, (byte) 2, playerDrop);

            spawnAndAddRangedMapObject(drop, new DelayedPacketCreation() {

                public void sendPackets(MapleClient c) {
                    if (owner.getId() != c.getPlayer().getId() && GameConstants.isSchoolMap(c.getPlayer().getMap().getId())) { //单人地图限制
                        return;
                    }
                    c.getSession().write(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getTruePosition(), droppos, (byte) 1));
                }
            });
            if (item.getItemId() != 2430096) { //神龙的礼物箱子
                if (!GameConstants.isSchoolMap(owner.getMap().getId())) { //单人地图限制
                    broadcastMessage(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getTruePosition(), droppos, (byte) 0));
                }
            }
            if (!everlast) {
                drop.registerExpire(120000);
                activateItemReactors(drop, owner.getClient());
            }
        }

    ########################################### MapleMap.java

        /*
        加载角色信息
        */
        public final void addPlayer(final MapleCharacter chr) {
            mapobjectlocks.get(MapleMapObjectType.PLAYER).writeLock().lock();
            try {
                mapobjects.get(MapleMapObjectType.PLAYER).put(chr.getObjectId(), chr);
            } finally {
                mapobjectlocks.get(MapleMapObjectType.PLAYER).writeLock().unlock();
            }
            charactersLock.writeLock().lock();
            try {
                characters.add(chr);
            } finally {
                charactersLock.writeLock().unlock();
            }
            if (chr.getMapId() == 703000000) { //被破坏的新叶城
                chr.updateSingleStat(MapleStat.EVENTPOINT, 0); //清除能量存储器界面
            }

            if (chr.getAndroid() != null && chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -35) == null) { //没有佩戴机械心脏,回收机器人
                chr.removeAndroid();
            }
            if (chr.isGM()) {
                chr.dropMessage(5, "MAP/" + chr.getMap().getMapName() + chr.getMapId());//地图ID
            }
            if (chr.itemQuantity(2230004) > 0) {//阿尔弗雷德给的经验值秘药
                MapleQuestStatus Qa = chr.getQuestNAdd(MapleQuest.getInstance(2230004));
                chr.getClient().getSession().write(MaplePacketCreator.updateExpPotion(2, chr.getId(), 2230004, true, 12, 18, Qa.getCustomData() == null ? 0 : -Integer.parseInt(Qa.getCustomData())));
                chr.getClient().getSession().write(MaplePacketCreator.updateExpPotion(2, chr.getId(), 2230004, true, 12, 18, Qa.getCustomData() == null ? 0 : -Integer.parseInt(Qa.getCustomData())));
            }
            chr.setChangeTime();
            if (GameConstants.isTeamMap(mapid) && !chr.inPVP()) {
                chr.setTeam(getAndSwitchTeam() ? 0 : 1);
            }

            byte[] packet = MaplePacketCreator.spawnPlayerMapobject(chr);
            if (!GameConstants.isSchoolMap(chr.getMap().getId())) { //单人地图限制
                if (!chr.isHidden()) {
                    broadcastMessage(chr, packet, false);
                } else {
                    broadcastGMMessage(chr, packet, false);
                }
            }

    ########################################### MapleMapItem.java

        /*
        玩家进入地图时显示地上物品
        */
        public void sendSpawnData(MapleClient client) {
            if (questid <= 0 || client.getPlayer().getQuestStatus(questid) == 1) {
                if (character_ownerid != client.getPlayer().getId() && GameConstants.isSchoolMap(client.getPlayer().getMap().getId())) { //单人地图限制
                    return;
                }
                client.getSession().write(MaplePacketCreator.dropItemFromMapObject(this, null, getTruePosition(), (byte) 2));
            }
        }


    ############################################  地图ID 还在不断补充中

        /*
        单人地图限制
        */
        public static boolean isSchoolMap(int id) {
            switch (id) {
                //////////////////////////////////////航运

                case 200090000: //开往金银岛
                case 200090010: //开往天空之城

                case 200090020: //开往圣地
                case 200090021: //开往天空之城

                case 200090030: //开往圣地
                case 200090031: //开往金银岛

                case 200090060: //开往里恩岛
                case 200090070: //开往明珠港

                case 200090100: //开往玩具城
                case 200090110: //开往天空之城

                case 200090200: //开往神木村
                case 200090210: //开往天空之城

                case 200090300: //开往武陵
                case 200090310: //开往天空之城

                case 200090400: //开往阿里安特
                case 200090410: //开往天空之城

                case 200090600: //开往埃德尔斯坦
                case 200090610: //开往天空之城

                case 200090700: //开往埃德尔斯坦
                case 200090710: //开往金银岛

                case 222020110: //电梯<前往童话村>
                case 222020111: //电梯<前往童话村>


                //////////////////////////////////////阿里安特

                case 260010401: //岩岸
                case 260010402: //盗贼之窝

                //////////////////////////////////////玛加提亚
                case 261000001: //失踪炼金术士的家

                case 261030001: //未知的地下通道
                case 261040000: //黑魔法师的研究所

                case 926120200: //德朗的研究室

                //////////////////////////////////////艾琳森林
                case 300010420: //洞穴深处
                case 300030310: //女王藏身处

                //////////////////////////////////////狮子王城

                case 211060201: //第一座塔楼
                case 211060401: //第二座塔楼
                case 211060601: //第三座塔楼

                case 211061100: //阿尼的牢房
                case 211070200: //接见室

                case 921140000: //秘密走廊
                case 921140001: //忧郁的接见室

                //////////////////////////////////////骑士团
                case 910510000: //人偶师的洞穴

                case 910110000: //魔法图书馆

                case 913010000: //第三演武场
                case 913010100: //第三演武场
                case 913010200: //第三演武场
                case 913010300: //第三演武场

                case 913020000: //第四演武场
                case 913020100: //第四演武场
                case 913020200: //第四演武场
                case 913020300: //第四演武场

                case 927010000: //黑暗神殿回廊

                case 924010000: //黑魔女的洞穴
                case 924010100: //黑魔女的洞穴
                case 924010200: //黑魔女的洞穴

                case 922000030: // 次元空间

                case 913030000: //圣地

                case 910510500: //人偶师的洞穴

                //////////////////////////////////////战神
                case 914000000: //伤病营舍

                case 914000300: //末日森林
                case 914000400: //燃烧森林3
                case 914000410: //燃烧森林2
                case 914000420: //燃烧森林1
                case 914000500: //避难准备完成

                case 140090000: //冰洞

                case 914022100: //万仞悬崖
                case 914022200: //小偷乌鸦的领地

                case 910400000: //危险的情报商店

                case 910510200: //人偶师的洞穴

                case 910510201: //人偶师的洞穴

                case 910510100: //人偶师的秘密通道
                case 910510202: //人偶师的洞穴


                case 920030000: //人迹罕至的山路
                case 920030001: //封印的庭院

                case 925040100: //封印的寺院

                case 930010000: //危险的图书馆

                case 910050000: //陷入危险的弓箭手培训中心

                //////////////////////////////////////龙神
                case 900010000: //梦中的森林入口
                case 900010100: //梦中的小路
                case 900010200: //梦中的森林

                case 900090100: //教程0
                case 900090101: //教程1
                case 900090102: //教程2
                case 900090103: //转职

                case 900020100: //茂密的森林
                case 900020110: //茂密的森林

                case 900020200: //遗忘森林入口
                case 900020210: //遗忘小路
                case 900020220: //遗忘森林

                case 900030000: //阵地后侧

                case 200090080: //前往龙沉睡的岛
                case 200090090: //开往明珠港

                //////////////////////////////////////反抗者
                case 931000000: //人迹罕至的岩山
                case 931000001: //人迹罕至的岩山
                case 931000010: //奇怪的实验室
                case 931000011: //奇怪的实验室
                case 931000012: //奇怪的实验室
                case 931000013: //奇怪的实验室
                case 931000020: //人迹罕至的岩山
                case 931000021: //人迹罕至的岩山
                case 931000030: //矿山后山

                //////////////////////////////////////火炮手
                case 3000600: //通往冒险岛
                case 3000000: //通往冒险岛

                case 912060100: //蒙奇方位
                case 912060200: //火箭出发
                case 912060300: //火箭发射
                case 912060400: //火箭着陆
                case 912060500: //寝室

                //////////////////////////////////////双刀
                case 103050510: //锻炼室1
                case 103050520: //锻炼室2
                case 103050530: //锻炼室3

                case 910350200: //药店

                case 910350210: //沼泽地带的棚屋

                case 910350220: //无人的爵士酒吧
                case 910350221: //阵的房间

                case 910350230: //废都爵士酒吧

                case 910350240: //废都爵士酒吧

                //////////////////////////////////////双弩
                case 910150000: //战斗结束地图
                case 910150001: //埃欧雷
                case 910150002: //发光洞穴路
                case 910150003: //茂密森林
                case 910150004: //国王休息处

                case 910150100: //伟大精灵降临

                case 910150210: //茂密森林小路

                //////////////////////////////////////恶魔
                case 927000000: //时间神殿回廊1
                case 927000010: //时间神殿回廊2
                case 927000020: //黑魔法师房间前方回廊1

                case 924020000: //恶魔猎手的老家
                case 924020010: //场面切换0

                case 927000070: //黑魔法师房间前方回廊2
                case 927000080: //场面切换1
                case 927000081: //场面切换2

                case 931050000: //能量提取场
                case 931050010: //秘密广场1
                case 931050020: //能量提取场
                case 931050030: //治疗室

                case 931050300: //决战动画播放

                case 931050310: //恶魔猎手标志

                case 926150000: //卡帕莱特协会1
                case 926150010: //卡帕莱特协会2
                case 926150020: //卡帕莱特协会3

                case 926030000: //沙漠偏僻角落1
                case 926030010: //沙漠偏僻角落2

                case 927000100: //过去的时间神殿1
                case 927000110: //过去的时间神殿2

                case 931050100: //埃德尔斯坦公园喷泉附近1
                case 931050110: //埃德尔斯坦公园喷泉附近2
                case 931050120: //异次元的埃德尔斯坦公园

                case 931050200: //训练房间仓库

                case 931050210: //埃德尔斯坦公园喷泉附近3
                case 931050211: //埃德尔斯坦公园喷泉附近4
                case 931050212: //埃德尔斯坦公园喷泉附近5

                case 931050220: //弗朗西斯的房间

                case 921110200: //城堡入口
                case 921110210: //接见室

                case 927000200: //追忆中的邂逅3

                //////////////////////////////////////龙的传人

                case 743000400: // 2转地图
                case 743000500: // 3转地图

                //////////////////////////////////////幻影
                case 915000000: //寝室
                case 915000100: //中央走廊
                case 915000200: //外部
                case 915000300: //骑士殿堂
                case 915000301: //骑士殿堂
                case 915000400: //圣地
                case 915000500: //圣地大会议场

                case 150000001: //飞行中

                case 931040100: //人偶师的房间

                case 910600100: //荒废的据点
                case 910600101: //隐藏的通道
                case 910600102: //隐藏的人偶师洞穴
                case 910600103: //隐藏的人偶师洞穴
                case 910600104: //隐藏的人偶师洞穴
                case 910600105: //隐藏的人偶师洞穴

                case 914040000: //里恩
                case 914040001: //里恩西部地区

                case 920030100: //阿尔卡斯特的研究室
                case 920030101: //阿尔卡斯特的研究室

                case 922030200: //图书馆仓库
                case 922030201: //赫丽奥斯塔图书馆

                case 910510600: //阴森洞穴
                case 910510601: //阴森洞穴

                case 931040200: //电站
                case 931040201: //奥尔卡的房间
                case 931040202: //秘密实验室

                case 913050200: //圣地散步路
                case 913050201: //灵魂的对话
                case 913050202: //圣地散步路
                case 913050203: //圣地散步路
                case 913050204: //圣地散步路

                //////////////////////////////////////米哈尔

                case 913070000: //林伯特家的杂货店
                case 913070001: //林伯特家的杂货店
                //case 913070002: //林伯特家的杂货店
                case 913070003: //林伯特家的杂货店
                case 913070004: //林伯特家的杂货店
                case 913070010: //杂货店阁楼

                //////////////////////////////////////枫之高校
                case 744000001: //屋顶
                case 744000002: //仓库
                case 744000003: //校长室
                case 744000004: //美术部
                case 744000005: //保健室
                case 744000006: //废弃的教室
                case 744000007: //前途商谈室
                case 744000008: //小考考场
                case 744000009: //家政教室
                case 744000010: //体育室
                case 744000011: //科学实验室
                case 744000012: //图书室
                case 744000013: //空教室
                case 744000014: //柔道部
                case 744000015: //乐队部
                    return true;
            }
            return false;
        }
    }
    共收到 0 金錢
    打賞榜
    暫無
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    78

    發文

    910

    金錢

    333

    A幣

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

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

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

    GMT+8, 2026-8-1 16:56 , 網路刷新 0.118618 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322