So I've been trying to fix Mystic Door, and I ran into some weird stuff.
So first, I've been trying to cast the skill in-game and see what happens, from what I could see, there was only an effect of a dragon showing up but not door spawning on the player, which made me wonder. So mystic door casts a packet to SpecialMoveHandler, and there you can find:
Now, in MapleStatEffect:Code:if (skillLevel == 0 || skillLevel != _skillLevel) { return;
} else {
if (player.isAlive()) {
if (skill.getId() != 2311002 || player.canDoor()) {
effect.applyTo(player, (slea.available() == 5) ? new Point(slea.readShort(), slea.readShort()) : null);
} else {
new ServernoticeMapleClientMessageCallback(5, c).dropMessage("Please wait 5 seconds before casting Mystic Door again");
c.getSession().write(MaplePacketCreator.enableActions());
}
} else c.getSession().write(MaplePacketCreator.enableActions());
}
Code:} else if (isMagicDoor()) { // Magic Door applyto.dropMessage("Debug #2");
MapleDoor door = new MapleDoor(applyto, new Point(applyto.getPosition())); // Current Map door
applyto.getMap().spawnDoor(door);
applyto.addDoor(door);
MapleDoor townDoor = new MapleDoor(door); // Town door
applyto.addDoor(townDoor);
door.getTown().spawnDoor(townDoor);
if (applyto.getParty() != null) { // update town doors
applyto.silentPartyUpdate();
}
applyto.disableDoor();
}
It didn't even print it out in-game.Code:public boolean isMagicDoor() { return skill && sourceid == 2311002;
}
My spawnDoor packet:
I don't have too much IDA knowledge, but I asked some people and they told me the packet structure is correct(?)Code:public static MaplePacket spawnDoor(int oid, Point pos, boolean town) { // [D3 00] [01] [93 AC 00 00] [6B 05] [37 03]
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_DOOR.getValue());
mplew.write(town ? 1 : 0);
mplew.writeInt(oid);
mplew.writeShort(pos.x);
mplew.writeShort(pos.y);
return mplew.getPacket();
}
MapleMap.java
Thanks for reading, and hopefully one of you can help me out, thank you.Code:public void spawnDoor(final MapleDoor door) {
synchronized (this.mapobjects) {
spawnAndAddRangedMapObject(door, new DelayedPacketCreation() {
public void sendPackets(MapleClient c) {
c.getSession().write(MaplePacketCreator.spawnDoor(door.getOwner().getId(), door.getTargetPosition(), false));
if (door.getOwner().getParty() != null && (door.getOwner() == c.getPlayer() || door.getOwner().getParty().containsMembers(new MaplePartyCharacter(c.getPlayer())))) {
c.getSession().write(MaplePacketCreator.partyPortal(door.getTown().getId(), door.getTarget().getId(), door.getTargetPosition()));
}
c.getSession().write(MaplePacketCreator.spawnPortal(door.getTown().getId(), door.getTarget().getId(), door.getTargetPosition()));
c.getSession().write(MaplePacketCreator.enableActions());
}
}, new SpawnCondition() {
public boolean canSpawn(MapleCharacter chr) {
return chr.getMapId() == door.getTarget().getId() ||
chr == door.getOwner() && chr.getParty() == null;
}
});
}
}
- - - Updated - - -
So in SpecialMoveHandler packet I found out that when you use the Mystic Door skill, this packet is sent from the client to the server:
53 00 68 D1 EE 09 5A 43 23 00 14 C8 FF 96 00
But then when I try to debug with:
Nothing prints, but when I flash jump or anything, it writes to the player. I wonder what it meansCode:public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { MapleCharacter player = c.getPlayer();
slea.readShort();
slea.readShort();
int skillId = slea.readInt();
int _skillLevel = slea.readByte();
ISkill skill = SkillFactory.getSkill(skillId);
int skillLevel = player.getSkillLevel(skill);
MapleStatEffect effect = skill.getEffect(skillLevel);
player.dropMessage("" + skillId);
@Eric any thoughts?

