Search in sources :

Example 11 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleCharacter method loadCharFromDB.

public static MapleCharacter loadCharFromDB(int charid, MapleClient client, boolean channelserver) throws SQLException {
    try {
        MapleCharacter ret = new MapleCharacter();
        ret.client = client;
        ret.id = charid;
        Connection con = DatabaseConnection.getConnection();
        PreparedStatement ps = con.prepareStatement("SELECT * FROM characters WHERE id = ?");
        ps.setInt(1, charid);
        ResultSet rs = ps.executeQuery();
        if (!rs.next()) {
            rs.close();
            ps.close();
            throw new RuntimeException("Loading char failed (not found)");
        }
        ret.name = rs.getString("name");
        ret.level = rs.getInt("level");
        ret.fame = rs.getInt("fame");
        ret.quest_fame = rs.getInt("fquest");
        ret.str = rs.getInt("str");
        ret.dex = rs.getInt("dex");
        ret.int_ = rs.getInt("int");
        ret.luk = rs.getInt("luk");
        ret.exp.set(rs.getInt("exp"));
        ret.gachaexp.set(rs.getInt("gachaexp"));
        ret.hp = rs.getInt("hp");
        ret.maxhp = rs.getInt("maxhp");
        ret.mp = rs.getInt("mp");
        ret.maxmp = rs.getInt("maxmp");
        ret.hpMpApUsed = rs.getInt("hpMpUsed");
        ret.hasMerchant = rs.getInt("HasMerchant") == 1;
        String[] skillPoints = rs.getString("sp").split(",");
        for (int i = 0; i < ret.remainingSp.length; i++) {
            ret.remainingSp[i] = Integer.parseInt(skillPoints[i]);
        }
        ret.remainingAp = rs.getInt("ap");
        ret.meso.set(rs.getInt("meso"));
        ret.merchantmeso = rs.getInt("MerchantMesos");
        ret.gmLevel = rs.getInt("gm");
        ret.skinColor = MapleSkinColor.getById(rs.getInt("skincolor"));
        ret.gender = rs.getInt("gender");
        ret.job = MapleJob.getById(rs.getInt("job"));
        ret.finishedDojoTutorial = rs.getInt("finishedDojoTutorial") == 1;
        ret.vanquisherKills = rs.getInt("vanquisherKills");
        ret.omokwins = rs.getInt("omokwins");
        ret.omoklosses = rs.getInt("omoklosses");
        ret.omokties = rs.getInt("omokties");
        ret.matchcardwins = rs.getInt("matchcardwins");
        ret.matchcardlosses = rs.getInt("matchcardlosses");
        ret.matchcardties = rs.getInt("matchcardties");
        ret.hair = rs.getInt("hair");
        ret.face = rs.getInt("face");
        ret.accountid = rs.getInt("accountid");
        ret.mapid = rs.getInt("map");
        ret.jailExpiration = rs.getLong("jailexpire");
        ret.initialSpawnPoint = rs.getInt("spawnpoint");
        ret.world = rs.getByte("world");
        ret.rank = rs.getInt("rank");
        ret.rankMove = rs.getInt("rankMove");
        ret.jobRank = rs.getInt("jobRank");
        ret.jobRankMove = rs.getInt("jobRankMove");
        int mountexp = rs.getInt("mountexp");
        int mountlevel = rs.getInt("mountlevel");
        int mounttiredness = rs.getInt("mounttiredness");
        ret.guildid = rs.getInt("guildid");
        ret.guildRank = rs.getInt("guildrank");
        ret.allianceRank = rs.getInt("allianceRank");
        ret.familyId = rs.getInt("familyId");
        ret.bookCover = rs.getInt("monsterbookcover");
        ret.monsterbook = new MonsterBook();
        ret.monsterbook.loadCards(charid);
        ret.vanquisherStage = rs.getInt("vanquisherStage");
        ret.dojoPoints = rs.getInt("dojoPoints");
        ret.dojoStage = rs.getInt("lastDojoStage");
        ret.dataString = rs.getString("dataString");
        ret.mgc = new MapleGuildCharacter(ret);
        int buddyCapacity = rs.getInt("buddyCapacity");
        ret.buddylist = new BuddyList(buddyCapacity);
        ret.getInventory(MapleInventoryType.EQUIP).setSlotLimit(rs.getByte("equipslots"));
        ret.getInventory(MapleInventoryType.USE).setSlotLimit(rs.getByte("useslots"));
        ret.getInventory(MapleInventoryType.SETUP).setSlotLimit(rs.getByte("setupslots"));
        ret.getInventory(MapleInventoryType.ETC).setSlotLimit(rs.getByte("etcslots"));
        for (Pair<Item, MapleInventoryType> item : ItemFactory.INVENTORY.loadItems(ret.id, !channelserver)) {
            ret.getInventory(item.getRight()).addFromDB(item.getLeft());
            Item itemz = item.getLeft();
            if (itemz.getPetId() > -1) {
                MaplePet pet = itemz.getPet();
                if (pet != null && pet.isSummoned()) {
                    ret.addPet(pet);
                }
                continue;
            }
            if (item.getRight().equals(MapleInventoryType.EQUIP) || item.getRight().equals(MapleInventoryType.EQUIPPED)) {
                Equip equip = (Equip) item.getLeft();
                if (equip.getRingId() > -1) {
                    MapleRing ring = MapleRing.loadFromDb(equip.getRingId());
                    if (item.getRight().equals(MapleInventoryType.EQUIPPED)) {
                        ring.equip();
                    }
                    if (ring.getItemId() > 1112012) {
                        ret.addFriendshipRing(ring);
                    } else {
                        ret.addCrushRing(ring);
                    }
                }
            }
        }
        NewYearCardRecord.loadPlayerNewYearCards(ret);
        PreparedStatement ps2, ps3;
        ResultSet rs2, rs3;
        ps3 = con.prepareStatement("SELECT petid FROM inventoryitems WHERE characterid = ? AND petid > -1");
        ps3.setInt(1, charid);
        rs3 = ps3.executeQuery();
        while (rs3.next()) {
            int petId = rs3.getInt("petid");
            ps2 = con.prepareStatement("SELECT itemid FROM petignores WHERE petid = ?");
            ps2.setInt(1, petId);
            ret.resetExcluded(petId);
            rs2 = ps2.executeQuery();
            while (rs2.next()) {
                ret.addExcluded(petId, rs2.getInt("itemid"));
            }
            ps2.close();
            rs2.close();
        }
        ps3.close();
        rs3.close();
        ret.commitExcludedItems();
        if (channelserver) {
            MapleMapFactory mapFactory = client.getChannelServer().getMapFactory();
            ret.map = mapFactory.getMap(ret.mapid);
            if (ret.map == null) {
                ret.map = mapFactory.getMap(100000000);
            }
            MaplePortal portal = ret.map.getPortal(ret.initialSpawnPoint);
            if (portal == null) {
                portal = ret.map.getPortal(0);
                ret.initialSpawnPoint = 0;
            }
            ret.setPosition(portal.getPosition());
            int partyid = rs.getInt("party");
            MapleParty party = Server.getInstance().getWorld(ret.world).getParty(partyid);
            if (party != null) {
                ret.mpc = party.getMemberById(ret.id);
                if (ret.mpc != null) {
                    ret.mpc = new MaplePartyCharacter(ret);
                    ret.party = party;
                }
            }
            int messengerid = rs.getInt("messengerid");
            int position = rs.getInt("messengerposition");
            if (messengerid > 0 && position < 4 && position > -1) {
                MapleMessenger messenger = Server.getInstance().getWorld(ret.world).getMessenger(messengerid);
                if (messenger != null) {
                    ret.messenger = messenger;
                    ret.messengerposition = position;
                }
            }
            ret.loggedIn = true;
        }
        rs.close();
        ps.close();
        ps = con.prepareStatement("SELECT mapid,vip FROM trocklocations WHERE characterid = ? LIMIT 15");
        ps.setInt(1, charid);
        rs = ps.executeQuery();
        byte v = 0;
        byte r = 0;
        while (rs.next()) {
            if (rs.getInt("vip") == 1) {
                ret.viptrockmaps.add(rs.getInt("mapid"));
                v++;
            } else {
                ret.trockmaps.add(rs.getInt("mapid"));
                r++;
            }
        }
        while (v < 10) {
            ret.viptrockmaps.add(999999999);
            v++;
        }
        while (r < 5) {
            ret.trockmaps.add(999999999);
            r++;
        }
        rs.close();
        ps.close();
        ps = con.prepareStatement("SELECT name FROM accounts WHERE id = ?", Statement.RETURN_GENERATED_KEYS);
        ps.setInt(1, ret.accountid);
        rs = ps.executeQuery();
        if (rs.next()) {
            ret.getClient().setAccountName(rs.getString("name"));
        }
        rs.close();
        ps.close();
        ps = con.prepareStatement("SELECT `area`,`info` FROM area_info WHERE charid = ?");
        ps.setInt(1, ret.id);
        rs = ps.executeQuery();
        while (rs.next()) {
            ret.area_info.put(rs.getShort("area"), rs.getString("info"));
        }
        rs.close();
        ps.close();
        ps = con.prepareStatement("SELECT `name`,`info` FROM eventstats WHERE characterid = ?");
        ps.setInt(1, ret.id);
        rs = ps.executeQuery();
        while (rs.next()) {
            String name = rs.getString("name");
            if (rs.getString("name").equals("rescueGaga")) {
                ret.events.put(name, new RescueGaga(rs.getInt("info")));
            }
        // ret.events = new MapleEvents(new RescueGaga(rs.getInt("rescuegaga")), new ArtifactHunt(rs.getInt("artifacthunt")));
        }
        rs.close();
        ps.close();
        ret.cashshop = new CashShop(ret.accountid, ret.id, ret.getJobType());
        ret.autoban = new AutobanManager(ret);
        // for now
        ret.marriageRing = null;
        ps = con.prepareStatement("SELECT name, level FROM characters WHERE accountid = ? AND id != ? ORDER BY level DESC limit 1");
        ps.setInt(1, ret.accountid);
        ps.setInt(2, charid);
        rs = ps.executeQuery();
        if (rs.next()) {
            ret.linkedName = rs.getString("name");
            ret.linkedLevel = rs.getInt("level");
        }
        rs.close();
        ps.close();
        if (channelserver) {
            ps = con.prepareStatement("SELECT * FROM queststatus WHERE characterid = ?");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            PreparedStatement psf;
            try (PreparedStatement pse = con.prepareStatement("SELECT * FROM questprogress WHERE queststatusid = ?")) {
                psf = con.prepareStatement("SELECT mapid FROM medalmaps WHERE queststatusid = ?");
                while (rs.next()) {
                    MapleQuest q = MapleQuest.getInstance(rs.getShort("quest"));
                    MapleQuestStatus status = new MapleQuestStatus(q, MapleQuestStatus.Status.getById(rs.getInt("status")));
                    long cTime = rs.getLong("time");
                    if (cTime > -1) {
                        status.setCompletionTime(cTime * 1000);
                    }
                    long eTime = rs.getLong("expires");
                    if (eTime > 0) {
                        status.setExpirationTime(eTime);
                    }
                    status.setForfeited(rs.getInt("forfeited"));
                    ret.quests.put(q.getId(), status);
                    pse.setInt(1, rs.getInt("queststatusid"));
                    try (ResultSet rsProgress = pse.executeQuery()) {
                        while (rsProgress.next()) {
                            status.setProgress(rsProgress.getInt("progressid"), rsProgress.getString("progress"));
                        }
                    }
                    psf.setInt(1, rs.getInt("queststatusid"));
                    try (ResultSet medalmaps = psf.executeQuery()) {
                        while (medalmaps.next()) {
                            status.addMedalMap(medalmaps.getInt("mapid"));
                        }
                    }
                }
                rs.close();
                ps.close();
            }
            psf.close();
            ps = con.prepareStatement("SELECT skillid,skilllevel,masterlevel,expiration FROM skills WHERE characterid = ?");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            while (rs.next()) {
                ret.skills.put(SkillFactory.getSkill(rs.getInt("skillid")), new SkillEntry(rs.getByte("skilllevel"), rs.getInt("masterlevel"), rs.getLong("expiration")));
            }
            rs.close();
            ps.close();
            ps = con.prepareStatement("SELECT SkillID,StartTime,length FROM cooldowns WHERE charid = ?");
            ps.setInt(1, ret.getId());
            rs = ps.executeQuery();
            while (rs.next()) {
                final int skillid = rs.getInt("SkillID");
                final long length = rs.getLong("length"), startTime = rs.getLong("StartTime");
                if (skillid != 5221999 && (length + startTime < System.currentTimeMillis())) {
                    continue;
                }
                ret.giveCoolDowns(skillid, startTime, length);
            }
            rs.close();
            ps.close();
            ps = con.prepareStatement("DELETE FROM cooldowns WHERE charid = ?");
            ps.setInt(1, ret.getId());
            ps.executeUpdate();
            ps.close();
            ps = con.prepareStatement("SELECT * FROM skillmacros WHERE characterid = ?");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            while (rs.next()) {
                int position = rs.getInt("position");
                SkillMacro macro = new SkillMacro(rs.getInt("skill1"), rs.getInt("skill2"), rs.getInt("skill3"), rs.getString("name"), rs.getInt("shout"), position);
                ret.skillMacros[position] = macro;
            }
            rs.close();
            ps.close();
            ps = con.prepareStatement("SELECT `key`,`type`,`action` FROM keymap WHERE characterid = ?");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            while (rs.next()) {
                int key = rs.getInt("key");
                int type = rs.getInt("type");
                int action = rs.getInt("action");
                ret.keymap.put(Integer.valueOf(key), new MapleKeyBinding(type, action));
            }
            rs.close();
            ps.close();
            ps = con.prepareStatement("SELECT `locationtype`,`map`,`portal` FROM savedlocations WHERE characterid = ?");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            while (rs.next()) {
                ret.savedLocations[SavedLocationType.valueOf(rs.getString("locationtype")).ordinal()] = new SavedLocation(rs.getInt("map"), rs.getInt("portal"));
            }
            rs.close();
            ps.close();
            ps = con.prepareStatement("SELECT `characterid_to`,`when` FROM famelog WHERE characterid = ? AND DATEDIFF(NOW(),`when`) < 30");
            ps.setInt(1, charid);
            rs = ps.executeQuery();
            ret.lastfametime = 0;
            ret.lastmonthfameids = new ArrayList<>(31);
            while (rs.next()) {
                ret.lastfametime = Math.max(ret.lastfametime, rs.getTimestamp("when").getTime());
                ret.lastmonthfameids.add(Integer.valueOf(rs.getInt("characterid_to")));
            }
            rs.close();
            ps.close();
            ret.buddylist.loadFromDb(charid);
            ret.storage = MapleStorage.loadOrCreateFromDB(ret.accountid, ret.world);
            ret.recalcLocalStats();
            // ret.resetBattleshipHp();
            ret.silentEnforceMaxHpMp();
        }
        int mountid = ret.getJobType() * 10000000 + 1004;
        if (ret.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -18) != null) {
            ret.maplemount = new MapleMount(ret, ret.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -18).getItemId(), mountid);
        } else {
            ret.maplemount = new MapleMount(ret, 0, mountid);
        }
        ret.maplemount.setExp(mountexp);
        ret.maplemount.setLevel(mountlevel);
        ret.maplemount.setTiredness(mounttiredness);
        ret.maplemount.setActive(false);
        con.close();
        return ret;
    } catch (SQLException | RuntimeException e) {
        e.printStackTrace();
    }
    return null;
}
Also used : MapleQuest(server.quest.MapleQuest) AutobanManager(client.autoban.AutobanManager) SQLException(java.sql.SQLException) MapleGuildCharacter(net.server.guild.MapleGuildCharacter) RescueGaga(server.events.RescueGaga) MapleMapFactory(server.maps.MapleMapFactory) MapleMapItem(server.maps.MapleMapItem) Item(client.inventory.Item) MaplePlayerShopItem(server.maps.MaplePlayerShopItem) Equip(client.inventory.Equip) MapleInventoryType(client.inventory.MapleInventoryType) ResultSet(java.sql.ResultSet) MaplePet(client.inventory.MaplePet) CashShop(server.CashShop) DatabaseConnection(tools.DatabaseConnection) Connection(java.sql.Connection) SavedLocation(server.maps.SavedLocation) MapleParty(net.server.world.MapleParty) PreparedStatement(java.sql.PreparedStatement) Point(java.awt.Point) MaplePortal(server.MaplePortal) MaplePartyCharacter(net.server.world.MaplePartyCharacter) MapleMessenger(net.server.world.MapleMessenger)

Example 12 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class ChangeMapHandler method handlePacket.

@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    MapleCharacter chr = c.getPlayer();
    if (chr.isChangingMaps() || chr.isBanned()) {
        c.announce(MaplePacketCreator.enableActions());
        return;
    }
    if (chr.getTrade() != null) {
        MapleTrade.cancelTrade(chr);
    }
    if (slea.available() == 0) {
        // Cash Shop :)
        if (!chr.getCashShop().isOpened()) {
            c.disconnect(false, false);
            return;
        }
        String[] socket = c.getChannelServer().getIP().split(":");
        chr.getCashShop().open(false);
        c.updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION);
        try {
            c.announce(MaplePacketCreator.getChannelChange(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1])));
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        }
    } else {
        if (chr.getCashShop().isOpened()) {
            c.disconnect(false, false);
            return;
        }
        try {
            // 1 = from dying 0 = regular portals
            slea.readByte();
            int targetid = slea.readInt();
            String startwp = slea.readMapleAsciiString();
            MaplePortal portal = chr.getMap().getPortal(startwp);
            slea.readByte();
            boolean wheel = slea.readShort() > 0;
            if (targetid != -1 && !chr.isAlive()) {
                boolean executeStandardPath = true;
                if (chr.getEventInstance() != null) {
                    executeStandardPath = chr.getEventInstance().revivePlayer(chr);
                }
                if (executeStandardPath) {
                    MapleMap to = chr.getMap();
                    if (wheel && chr.haveItemWithId(5510000, false)) {
                        MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, 5510000, 1, true, false);
                        chr.announce(MaplePacketCreator.showWheelsLeft(chr.getItemQuantity(5510000, false)));
                    } else {
                        chr.cancelAllBuffs(false);
                        to = chr.getWarpMap(chr.getMap().getReturnMapId());
                        chr.setStance(0);
                    }
                    chr.setHp(50);
                    chr.updatePartyMemberHP();
                    chr.changeMap(to, to.getRandomPlayerSpawnpoint());
                }
            } else if (targetid != -1) {
                if (chr.isGM()) {
                    MapleMap to = chr.getWarpMap(targetid);
                    chr.changeMap(to, to.getPortal(0));
                } else {
                    final int divi = chr.getMapId() / 100;
                    boolean warp = false;
                    if (divi == 0) {
                        if (targetid == 10000) {
                            warp = true;
                        }
                    } else if (divi == 20100) {
                        if (targetid == 104000000) {
                            c.announce(MaplePacketCreator.lockUI(false));
                            c.announce(MaplePacketCreator.disableUI(false));
                            warp = true;
                        }
                    } else if (divi == 9130401) {
                        // Only allow warp if player is already in Intro map, or else = hack
                        if (targetid == 130000000 || targetid / 100 == 9130401) {
                            // Cygnus introduction
                            warp = true;
                        }
                    } else if (divi == 9140900) {
                        // Aran Introduction
                        if (targetid == 914090011 || targetid == 914090012 || targetid == 914090013 || targetid == 140090000) {
                            warp = true;
                        }
                    } else if (divi / 10 == 1020) {
                        // Adventurer movie clip Intro
                        if (targetid == 1020000) {
                            warp = true;
                        }
                    } else if (divi / 10 >= 980040 && divi / 10 <= 980045) {
                        if (targetid == 980040000) {
                            warp = true;
                        }
                    }
                    if (warp) {
                        final MapleMap to = chr.getWarpMap(targetid);
                        chr.changeMap(to, to.getPortal(0));
                    }
                }
            }
            if (portal != null && !portal.getPortalStatus()) {
                c.announce(MaplePacketCreator.blockedMessage(1));
                c.announce(MaplePacketCreator.enableActions());
                return;
            }
            if (chr.getMapId() == 109040004) {
                chr.getFitness().resetTimes();
            }
            if (chr.getMapId() == 109030003 || chr.getMapId() == 109030103) {
                chr.getOla().resetTimes();
            }
            if (portal != null) {
                if (portal.getPosition().distanceSq(chr.getPosition()) > 400000) {
                    c.announce(MaplePacketCreator.enableActions());
                    return;
                }
                portal.enterPortal(c);
            } else {
                c.announce(MaplePacketCreator.enableActions());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Also used : MapleMap(server.maps.MapleMap) MapleCharacter(client.MapleCharacter) UnknownHostException(java.net.UnknownHostException) MaplePortal(server.MaplePortal) UnknownHostException(java.net.UnknownHostException)

Example 13 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleMap method findClosestPlayerSpawnpoint.

public MaplePortal findClosestPlayerSpawnpoint(Point from) {
    MaplePortal closest = null;
    double shortestDistance = Double.POSITIVE_INFINITY;
    for (MaplePortal portal : portals.values()) {
        double distance = portal.getPosition().distanceSq(from);
        if (portal.getType() >= 0 && portal.getType() <= 1 && distance < shortestDistance && portal.getTargetMapId() == 999999999) {
            closest = portal;
            shortestDistance = distance;
        }
    }
    return closest;
}
Also used : MaplePortal(server.MaplePortal)

Example 14 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleMap method findClosestPortal.

public MaplePortal findClosestPortal(Point from) {
    MaplePortal closest = null;
    double shortestDistance = Double.POSITIVE_INFINITY;
    for (MaplePortal portal : portals.values()) {
        double distance = portal.getPosition().distanceSq(from);
        if (distance < shortestDistance) {
            closest = portal;
            shortestDistance = distance;
        }
    }
    return closest;
}
Also used : MaplePortal(server.MaplePortal)

Example 15 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleMap method getDoorPositionStatus.

public Pair<String, Integer> getDoorPositionStatus(Point pos) {
    MaplePortal portal = findClosestPlayerSpawnpoint(pos);
    double angle = getAngle(portal.getPosition(), pos);
    double distn = pos.distanceSq(portal.getPosition());
    if (distn <= 777777.7) {
        return null;
    }
    distn = Math.sqrt(distn);
    return new Pair<>(getRoundedCoordinate(angle), Integer.valueOf((int) distn));
}
Also used : MaplePortal(server.MaplePortal) Pair(tools.Pair)

Aggregations

MaplePortal (server.MaplePortal)15 MapleMap (server.maps.MapleMap)5 MapleCharacter (client.MapleCharacter)4 Item (client.inventory.Item)4 MapleMapItem (server.maps.MapleMapItem)4 Point (java.awt.Point)3 SQLException (java.sql.SQLException)3 UnknownHostException (java.net.UnknownHostException)2 Connection (java.sql.Connection)2 PreparedStatement (java.sql.PreparedStatement)2 ResultSet (java.sql.ResultSet)2 ArrayList (java.util.ArrayList)2 MapleItemInformationProvider (server.MapleItemInformationProvider)2 MapleMonster (server.life.MapleMonster)2 SpawnPoint (server.life.SpawnPoint)2 MapleMapObject (server.maps.MapleMapObject)2 MaplePlayerShopItem (server.maps.MaplePlayerShopItem)2 SavedLocation (server.maps.SavedLocation)2 DatabaseConnection (tools.DatabaseConnection)2 Pair (tools.Pair)2