- UID
- 137702
- 閱讀權限
- 20
- 主題
- 44
- 回帖
- 34
- 精華
- 1
- A幣
- 333
- 在線時間
- 125 小時
- 最後登錄
- 2026-8-1
初窺門道
- 主題
- 44
- 回帖
- 34
- 精華
- 1
- 綜合社群主題發文量
- 0
- 電玩社群主題發文量
- 0
- 娛樂社群主題發文量
- 0
- 技術社群主題發文量
- 44
- 閱讀權限
- 20
- 註冊時間
- 2021-11-15
TA的每日心情 | 奮鬥 2024-1-28 13:17 |
|---|
簽到天數: 1 天 連續簽到: 1 天 [LV.1]初來乍到
|
枫之高校系列,没有子地图,为了多人玩家同时进入,必须设置成单人地图。怪物、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;
}
}
|
|