Search in sources :

Example 1 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleCharacter method newClient.

public void newClient(MapleClient c) {
    this.loggedIn = true;
    // No null's for accountName
    c.setAccountName(this.client.getAccountName());
    this.client = c;
    MaplePortal portal = map.findClosestPlayerSpawnpoint(getPosition());
    if (portal == null) {
        portal = map.getPortal(0);
    }
    this.setPosition(portal.getPosition());
    this.initialSpawnPoint = portal.getId();
    this.map = c.getChannelServer().getMapFactory().getMap(getMapId());
}
Also used : MaplePortal(server.MaplePortal)

Example 2 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleCharacter method saveToDB.

public synchronized void saveToDB(boolean notAutosave) {
    if (!loggedIn)
        return;
    Calendar c = Calendar.getInstance();
    if (notAutosave)
        FilePrinter.print(FilePrinter.SAVING_CHARACTER, "Attempting to save " + name + " at " + c.getTime().toString());
    else
        FilePrinter.print(FilePrinter.AUTOSAVING_CHARACTER, "Attempting to autosave " + name + " at " + c.getTime().toString());
    Connection con = null;
    try {
        con = DatabaseConnection.getConnection();
        con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
        con.setAutoCommit(false);
        PreparedStatement ps;
        ps = con.prepareStatement("UPDATE characters SET level = ?, fame = ?, str = ?, dex = ?, luk = ?, `int` = ?, exp = ?, gachaexp = ?, hp = ?, mp = ?, maxhp = ?, maxmp = ?, sp = ?, ap = ?, gm = ?, skincolor = ?, gender = ?, job = ?, hair = ?, face = ?, map = ?, meso = ?, hpMpUsed = ?, spawnpoint = ?, party = ?, buddyCapacity = ?, messengerid = ?, messengerposition = ?, mountlevel = ?, mountexp = ?, mounttiredness= ?, equipslots = ?, useslots = ?, setupslots = ?, etcslots = ?,  monsterbookcover = ?, vanquisherStage = ?, dojoPoints = ?, lastDojoStage = ?, finishedDojoTutorial = ?, vanquisherKills = ?, matchcardwins = ?, matchcardlosses = ?, matchcardties = ?, omokwins = ?, omoklosses = ?, omokties = ?, dataString = ?, fquest = ?, jailexpire = ? WHERE id = ?", Statement.RETURN_GENERATED_KEYS);
        if (gmLevel < 1 && level > 199) {
            ps.setInt(1, isCygnus() ? 120 : 200);
        } else {
            ps.setInt(1, level);
        }
        ps.setInt(2, fame);
        ps.setInt(3, str);
        ps.setInt(4, dex);
        ps.setInt(5, luk);
        ps.setInt(6, int_);
        ps.setInt(7, Math.abs(exp.get()));
        ps.setInt(8, Math.abs(gachaexp.get()));
        ps.setInt(9, hp);
        ps.setInt(10, mp);
        ps.setInt(11, maxhp);
        ps.setInt(12, maxmp);
        StringBuilder sps = new StringBuilder();
        for (int i = 0; i < remainingSp.length; i++) {
            sps.append(remainingSp[i]);
            sps.append(",");
        }
        String sp = sps.toString();
        ps.setString(13, sp.substring(0, sp.length() - 1));
        ps.setInt(14, remainingAp);
        ps.setInt(15, gmLevel);
        ps.setInt(16, skinColor.getId());
        ps.setInt(17, gender);
        ps.setInt(18, job.getId());
        ps.setInt(19, hair);
        ps.setInt(20, face);
        if (map == null || (cashshop != null && cashshop.isOpened())) {
            ps.setInt(21, mapid);
        } else {
            if (map.getForcedReturnId() != 999999999) {
                ps.setInt(21, map.getForcedReturnId());
            } else {
                ps.setInt(21, getHp() < 1 ? map.getReturnMapId() : map.getId());
            }
        }
        ps.setInt(22, meso.get());
        ps.setInt(23, hpMpApUsed);
        if (map == null || map.getId() == 610020000 || map.getId() == 610020001) {
            // reset to first spawnpoint on those maps
            ps.setInt(24, 0);
        } else {
            MaplePortal closest = map.findClosestPlayerSpawnpoint(getPosition());
            if (closest != null) {
                ps.setInt(24, closest.getId());
            } else {
                ps.setInt(24, 0);
            }
        }
        prtLock.lock();
        try {
            if (party != null) {
                ps.setInt(25, party.getId());
            } else {
                ps.setInt(25, -1);
            }
        } finally {
            prtLock.unlock();
        }
        ps.setInt(26, buddylist.getCapacity());
        if (messenger != null) {
            ps.setInt(27, messenger.getId());
            ps.setInt(28, messengerposition);
        } else {
            ps.setInt(27, 0);
            ps.setInt(28, 4);
        }
        if (maplemount != null) {
            ps.setInt(29, maplemount.getLevel());
            ps.setInt(30, maplemount.getExp());
            ps.setInt(31, maplemount.getTiredness());
        } else {
            ps.setInt(29, 1);
            ps.setInt(30, 0);
            ps.setInt(31, 0);
        }
        for (int i = 1; i < 5; i++) {
            ps.setInt(i + 31, getSlots(i));
        }
        monsterbook.saveCards(getId());
        ps.setInt(36, bookCover);
        ps.setInt(37, vanquisherStage);
        ps.setInt(38, dojoPoints);
        ps.setInt(39, dojoStage);
        ps.setInt(40, finishedDojoTutorial ? 1 : 0);
        ps.setInt(41, vanquisherKills);
        ps.setInt(42, matchcardwins);
        ps.setInt(43, matchcardlosses);
        ps.setInt(44, matchcardties);
        ps.setInt(45, omokwins);
        ps.setInt(46, omoklosses);
        ps.setInt(47, omokties);
        ps.setString(48, dataString);
        ps.setInt(49, quest_fame);
        ps.setLong(50, jailExpiration);
        ps.setInt(51, id);
        int updateRows = ps.executeUpdate();
        if (updateRows < 1) {
            throw new RuntimeException("Character not in database (" + id + ")");
        }
        petLock.lock();
        try {
            for (int i = 0; i < 3; i++) {
                if (pets[i] != null) {
                    pets[i].saveToDb();
                }
            }
        } finally {
            petLock.unlock();
        }
        for (Entry<Integer, Set<Integer>> es : getExcluded().entrySet()) {
            // this set is already protected
            try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM petignores WHERE petid=?")) {
                ps2.setInt(1, es.getKey());
                ps2.executeUpdate();
            }
            try (PreparedStatement ps2 = con.prepareStatement("INSERT INTO petignores (petid, itemid) VALUES (?, ?)")) {
                ps2.setInt(1, es.getKey());
                for (Integer x : es.getValue()) {
                    ps2.setInt(2, x);
                    ps2.addBatch();
                }
                ps2.executeBatch();
            }
        }
        deleteWhereCharacterId(con, "DELETE FROM keymap WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO keymap (characterid, `key`, `type`, `action`) VALUES (?, ?, ?, ?)");
        ps.setInt(1, id);
        Set<Entry<Integer, MapleKeyBinding>> keybindingItems = Collections.unmodifiableSet(keymap.entrySet());
        for (Entry<Integer, MapleKeyBinding> keybinding : keybindingItems) {
            ps.setInt(2, keybinding.getKey());
            ps.setInt(3, keybinding.getValue().getType());
            ps.setInt(4, keybinding.getValue().getAction());
            ps.addBatch();
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM skillmacros WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO skillmacros (characterid, skill1, skill2, skill3, name, shout, position) VALUES (?, ?, ?, ?, ?, ?, ?)");
        ps.setInt(1, getId());
        for (int i = 0; i < 5; i++) {
            SkillMacro macro = skillMacros[i];
            if (macro != null) {
                ps.setInt(2, macro.getSkill1());
                ps.setInt(3, macro.getSkill2());
                ps.setInt(4, macro.getSkill3());
                ps.setString(5, macro.getName());
                ps.setInt(6, macro.getShout());
                ps.setInt(7, i);
                ps.addBatch();
            }
        }
        ps.executeBatch();
        List<Pair<Item, MapleInventoryType>> itemsWithType = new ArrayList<>();
        for (MapleInventory iv : inventory) {
            for (Item item : iv.list()) {
                itemsWithType.add(new Pair<>(item, iv.getType()));
            }
        }
        ItemFactory.INVENTORY.saveItems(itemsWithType, id, con);
        deleteWhereCharacterId(con, "DELETE FROM skills WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO skills (characterid, skillid, skilllevel, masterlevel, expiration) VALUES (?, ?, ?, ?, ?)");
        ps.setInt(1, id);
        for (Entry<Skill, SkillEntry> skill : skills.entrySet()) {
            ps.setInt(2, skill.getKey().getId());
            ps.setInt(3, skill.getValue().skillevel);
            ps.setInt(4, skill.getValue().masterlevel);
            ps.setLong(5, skill.getValue().expiration);
            ps.addBatch();
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM savedlocations WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO savedlocations (characterid, `locationtype`, `map`, `portal`) VALUES (?, ?, ?, ?)");
        ps.setInt(1, id);
        for (SavedLocationType savedLocationType : SavedLocationType.values()) {
            if (savedLocations[savedLocationType.ordinal()] != null) {
                ps.setString(2, savedLocationType.name());
                ps.setInt(3, savedLocations[savedLocationType.ordinal()].getMapId());
                ps.setInt(4, savedLocations[savedLocationType.ordinal()].getPortal());
                ps.addBatch();
            }
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM trocklocations WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO trocklocations(characterid, mapid, vip) VALUES (?, ?, 0)");
        for (int i = 0; i < getTrockSize(); i++) {
            if (trockmaps.get(i) != 999999999) {
                ps.setInt(1, getId());
                ps.setInt(2, trockmaps.get(i));
                ps.addBatch();
            }
        }
        ps.executeBatch();
        ps = con.prepareStatement("INSERT INTO trocklocations(characterid, mapid, vip) VALUES (?, ?, 1)");
        for (int i = 0; i < getVipTrockSize(); i++) {
            if (viptrockmaps.get(i) != 999999999) {
                ps.setInt(1, getId());
                ps.setInt(2, viptrockmaps.get(i));
                ps.addBatch();
            }
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM buddies WHERE characterid = ? AND pending = 0");
        ps = con.prepareStatement("INSERT INTO buddies (characterid, `buddyid`, `pending`, `group`) VALUES (?, ?, 0, ?)");
        ps.setInt(1, id);
        for (BuddylistEntry entry : buddylist.getBuddies()) {
            if (entry.isVisible()) {
                ps.setInt(2, entry.getCharacterId());
                ps.setString(3, entry.getGroup());
                ps.addBatch();
            }
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM area_info WHERE charid = ?");
        ps = con.prepareStatement("INSERT INTO area_info (id, charid, area, info) VALUES (DEFAULT, ?, ?, ?)");
        ps.setInt(1, id);
        for (Entry<Short, String> area : area_info.entrySet()) {
            ps.setInt(2, area.getKey());
            ps.setString(3, area.getValue());
            ps.addBatch();
        }
        ps.executeBatch();
        deleteWhereCharacterId(con, "DELETE FROM eventstats WHERE characterid = ?");
        deleteWhereCharacterId(con, "DELETE FROM queststatus WHERE characterid = ?");
        ps = con.prepareStatement("INSERT INTO queststatus (`queststatusid`, `characterid`, `quest`, `status`, `time`, `expires`, `forfeited`) VALUES (DEFAULT, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
        PreparedStatement psf;
        try (PreparedStatement pse = con.prepareStatement("INSERT INTO questprogress VALUES (DEFAULT, ?, ?, ?)")) {
            psf = con.prepareStatement("INSERT INTO medalmaps VALUES (DEFAULT, ?, ?)");
            ps.setInt(1, id);
            synchronized (quests) {
                for (MapleQuestStatus q : quests.values()) {
                    ps.setInt(2, q.getQuest().getId());
                    ps.setInt(3, q.getStatus().getId());
                    ps.setInt(4, (int) (q.getCompletionTime() / 1000));
                    ps.setLong(5, q.getExpirationTime());
                    ps.setInt(6, q.getForfeited());
                    ps.executeUpdate();
                    try (ResultSet rs = ps.getGeneratedKeys()) {
                        rs.next();
                        for (int mob : q.getProgress().keySet()) {
                            pse.setInt(1, rs.getInt(1));
                            pse.setInt(2, mob);
                            pse.setString(3, q.getProgress(mob));
                            pse.addBatch();
                        }
                        for (int i = 0; i < q.getMedalMaps().size(); i++) {
                            psf.setInt(1, rs.getInt(1));
                            psf.setInt(2, q.getMedalMaps().get(i));
                            psf.addBatch();
                        }
                        pse.executeBatch();
                        psf.executeBatch();
                    }
                }
            }
        }
        psf.close();
        ps = con.prepareStatement("UPDATE accounts SET gm = ? WHERE id = ?");
        ps.setInt(1, gmLevel > 1 ? 1 : 0);
        ps.setInt(2, client.getAccID());
        ps.executeUpdate();
        ps.close();
        con.commit();
        con.setAutoCommit(true);
        if (cashshop != null) {
            cashshop.save(con);
        }
        if (storage != null) {
            storage.saveToDB(con);
        }
    } catch (SQLException | RuntimeException t) {
        FilePrinter.printError(FilePrinter.SAVE_CHAR, t, "Error saving " + name + " Level: " + level + " Job: " + job.getId());
        try {
            con.rollback();
        } catch (SQLException se) {
            FilePrinter.printError(FilePrinter.SAVE_CHAR, se, "Error trying to rollback " + name);
        }
    } catch (Exception e) {
        FilePrinter.printError(FilePrinter.SAVE_CHAR, e, "Error saving " + name + " Level: " + level + " Job: " + job.getId());
    } finally {
        try {
            con.setAutoCommit(true);
            con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Also used : ResultSet(java.sql.ResultSet) Set(java.util.Set) LinkedHashSet(java.util.LinkedHashSet) SQLException(java.sql.SQLException) ArrayList(java.util.ArrayList) MapleMapItem(server.maps.MapleMapItem) Item(client.inventory.Item) MaplePlayerShopItem(server.maps.MaplePlayerShopItem) Entry(java.util.Map.Entry) ResultSet(java.sql.ResultSet) Pair(tools.Pair) Calendar(java.util.Calendar) DatabaseConnection(tools.DatabaseConnection) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) SavedLocationType(server.maps.SavedLocationType) MapleInventory(client.inventory.MapleInventory) Point(java.awt.Point) SQLException(java.sql.SQLException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) MobSkill(server.life.MobSkill) MaplePortal(server.MaplePortal)

Example 3 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class MapleMap method getRandomPlayerSpawnpoint.

public MaplePortal getRandomPlayerSpawnpoint() {
    List<MaplePortal> spawnPoints = new ArrayList<>();
    for (MaplePortal portal : portals.values()) {
        if (portal.getType() >= 0 && portal.getType() <= 1 && portal.getTargetMapId() == 999999999) {
            spawnPoints.add(portal);
        }
    }
    MaplePortal portal = spawnPoints.get(new Random().nextInt(spawnPoints.size()));
    return portal != null ? portal : getPortal(0);
}
Also used : Random(java.util.Random) MaplePortal(server.MaplePortal) ArrayList(java.util.ArrayList)

Example 4 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class Commands method executeHeavenMsCommandLv1.

public static boolean executeHeavenMsCommandLv1(Channel cserv, Server srv, MapleClient c, String[] sub) {
    // Donator
    MapleCharacter player = c.getPlayer();
    switch(sub[0]) {
        case "buffme":
            // GM Skills : Haste(Super) - Holy Symbol - Bless - Hyper Body - Echo of Hero
            SkillFactory.getSkill(4101004).getEffect(SkillFactory.getSkill(4101004).getMaxLevel()).applyTo(player);
            SkillFactory.getSkill(2311003).getEffect(SkillFactory.getSkill(2311003).getMaxLevel()).applyTo(player);
            SkillFactory.getSkill(1301007).getEffect(SkillFactory.getSkill(1301007).getMaxLevel()).applyTo(player);
            SkillFactory.getSkill(2301004).getEffect(SkillFactory.getSkill(2301004).getMaxLevel()).applyTo(player);
            SkillFactory.getSkill(1005).getEffect(SkillFactory.getSkill(1005).getMaxLevel()).applyTo(player);
            player.setHp(player.getMaxHp());
            player.updateSingleStat(MapleStat.HP, player.getMaxHp());
            player.setMp(player.getMaxMp());
            player.updateSingleStat(MapleStat.MP, player.getMaxMp());
            break;
        case "goto":
            if (sub.length < 2) {
                player.yellowMessage("Syntax: !goto <map name>");
                break;
            }
            if (gotomaps.containsKey(sub[1])) {
                MapleMap target = c.getChannelServer().getMapFactory().getMap(gotomaps.get(sub[1]));
                MaplePortal targetPortal = target.getPortal(0);
                if (player.getEventInstance() != null) {
                    player.getEventInstance().removePlayer(player);
                }
                player.changeMap(target, targetPortal);
            } else {
                player.dropMessage(5, "That map does not exist.");
            }
            break;
        case "recharge":
            MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
            for (Item torecharge : c.getPlayer().getInventory(MapleInventoryType.USE).list()) {
                if (ItemConstants.isThrowingStar(torecharge.getItemId())) {
                    torecharge.setQuantity(ii.getSlotMax(c, torecharge.getItemId()));
                    c.getPlayer().forceUpdateItem(torecharge);
                } else if (ItemConstants.isArrow(torecharge.getItemId())) {
                    torecharge.setQuantity(ii.getSlotMax(c, torecharge.getItemId()));
                    c.getPlayer().forceUpdateItem(torecharge);
                } else if (ItemConstants.isBullet(torecharge.getItemId())) {
                    torecharge.setQuantity(ii.getSlotMax(c, torecharge.getItemId()));
                    c.getPlayer().forceUpdateItem(torecharge);
                } else if (ItemConstants.isConsumable(torecharge.getItemId())) {
                    torecharge.setQuantity(ii.getSlotMax(c, torecharge.getItemId()));
                    c.getPlayer().forceUpdateItem(torecharge);
                }
            }
            player.dropMessage(5, "USE Recharged.");
            break;
        case "whereami":
            player.yellowMessage("Map ID: " + player.getMap().getId());
            player.yellowMessage("Players on this map:");
            for (MapleMapObject mmo : player.getMap().getPlayers()) {
                MapleCharacter chr = (MapleCharacter) mmo;
                player.dropMessage(5, ">> " + chr.getName() + " - " + chr.getId() + " - Oid: " + chr.getObjectId());
            }
            player.yellowMessage("NPCs on this map:");
            for (MapleMapObject npcs : player.getMap().getMapObjects()) {
                if (npcs instanceof MapleNPC) {
                    MapleNPC npc = (MapleNPC) npcs;
                    player.dropMessage(5, ">> " + npc.getName() + " - " + npc.getId() + " - Oid: " + npc.getObjectId());
                }
            }
            player.yellowMessage("Monsters on this map:");
            for (MapleMapObject mobs : player.getMap().getMapObjects()) {
                if (mobs instanceof MapleMonster) {
                    MapleMonster mob = (MapleMonster) mobs;
                    if (mob.isAlive()) {
                        player.dropMessage(5, ">> " + mob.getName() + " - " + mob.getId() + " - Oid: " + mob.getObjectId());
                    }
                }
            }
            break;
        default:
            return false;
    }
    return true;
}
Also used : MapleMap(server.maps.MapleMap) MapleMapItem(server.maps.MapleMapItem) Item(client.inventory.Item) MapleCharacter(client.MapleCharacter) MaplePortal(server.MaplePortal) MapleItemInformationProvider(server.MapleItemInformationProvider) MapleMapObject(server.maps.MapleMapObject) MapleNPC(server.life.MapleNPC) MapleMonster(server.life.MapleMonster)

Example 5 with MaplePortal

use of server.MaplePortal in project HeavenMS by ronancpl.

the class ChangeMapSpecialHandler method handlePacket.

@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    slea.readByte();
    String startwp = slea.readMapleAsciiString();
    slea.readShort();
    MaplePortal portal = c.getPlayer().getMap().getPortal(startwp);
    if (portal == null || c.getPlayer().portalDelay() > System.currentTimeMillis() || c.getPlayer().getBlockedPortals().contains(portal.getScriptName())) {
        c.announce(MaplePacketCreator.enableActions());
        return;
    }
    if (c.getPlayer().isChangingMaps() || c.getPlayer().isBanned()) {
        c.announce(MaplePacketCreator.enableActions());
        return;
    }
    if (c.getPlayer().getTrade() != null) {
        MapleTrade.cancelTrade(c.getPlayer());
    }
    portal.enterPortal(c);
}
Also used : MaplePortal(server.MaplePortal)

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