diff --git a/build/built-jar.properties b/build/built-jar.properties index c1af47060e..476ec762d0 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Fri, 30 Jun 2017 01:05:52 -0300 +#Fri, 30 Jun 2017 16:23:30 -0300 C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2= diff --git a/build/classes/client/MapleCharacter$10.class b/build/classes/client/MapleCharacter$10.class index b67c6f61e7..f59103f126 100644 Binary files a/build/classes/client/MapleCharacter$10.class and b/build/classes/client/MapleCharacter$10.class differ diff --git a/build/classes/client/MapleCharacter$11.class b/build/classes/client/MapleCharacter$11.class index eb153602be..059690954d 100644 Binary files a/build/classes/client/MapleCharacter$11.class and b/build/classes/client/MapleCharacter$11.class differ diff --git a/build/classes/client/MapleCharacter$12.class b/build/classes/client/MapleCharacter$12.class index 68d0e2892c..5af21d3e27 100644 Binary files a/build/classes/client/MapleCharacter$12.class and b/build/classes/client/MapleCharacter$12.class differ diff --git a/build/classes/client/MapleCharacter$13.class b/build/classes/client/MapleCharacter$13.class index 169859abc9..cbac120c48 100644 Binary files a/build/classes/client/MapleCharacter$13.class and b/build/classes/client/MapleCharacter$13.class differ diff --git a/build/classes/client/MapleCharacter$14.class b/build/classes/client/MapleCharacter$14.class index 383e84f82a..c4f15487b5 100644 Binary files a/build/classes/client/MapleCharacter$14.class and b/build/classes/client/MapleCharacter$14.class differ diff --git a/build/classes/client/MapleCharacter$15.class b/build/classes/client/MapleCharacter$15.class index df356b1d43..307d9f7342 100644 Binary files a/build/classes/client/MapleCharacter$15.class and b/build/classes/client/MapleCharacter$15.class differ diff --git a/build/classes/client/MapleCharacter$16.class b/build/classes/client/MapleCharacter$16.class index fa7389cd0a..8e5df2a66e 100644 Binary files a/build/classes/client/MapleCharacter$16.class and b/build/classes/client/MapleCharacter$16.class differ diff --git a/build/classes/client/MapleCharacter$17.class b/build/classes/client/MapleCharacter$17.class index e6d852318b..637cfcb88e 100644 Binary files a/build/classes/client/MapleCharacter$17.class and b/build/classes/client/MapleCharacter$17.class differ diff --git a/build/classes/client/MapleCharacter$18.class b/build/classes/client/MapleCharacter$18.class index 08ec6b6ba0..6ab6c2ce18 100644 Binary files a/build/classes/client/MapleCharacter$18.class and b/build/classes/client/MapleCharacter$18.class differ diff --git a/build/classes/client/MapleCharacter$19.class b/build/classes/client/MapleCharacter$19.class new file mode 100644 index 0000000000..4d4f435391 Binary files /dev/null and b/build/classes/client/MapleCharacter$19.class differ diff --git a/build/classes/client/MapleCharacter$7.class b/build/classes/client/MapleCharacter$7.class index 42aec2d8ac..9b94987aa0 100644 Binary files a/build/classes/client/MapleCharacter$7.class and b/build/classes/client/MapleCharacter$7.class differ diff --git a/build/classes/client/MapleCharacter$8.class b/build/classes/client/MapleCharacter$8.class index 4b6f927a08..d5a286dbc4 100644 Binary files a/build/classes/client/MapleCharacter$8.class and b/build/classes/client/MapleCharacter$8.class differ diff --git a/build/classes/client/MapleCharacter$9.class b/build/classes/client/MapleCharacter$9.class index e1450e4fe8..51d8848466 100644 Binary files a/build/classes/client/MapleCharacter$9.class and b/build/classes/client/MapleCharacter$9.class differ diff --git a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class index ede07d49c1..b73b446b36 100644 Binary files a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class and b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class index 840c20dc03..914a8d61af 100644 Binary files a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class and b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$SkillEntry.class b/build/classes/client/MapleCharacter$SkillEntry.class index d3bf8ceb83..04ec280812 100644 Binary files a/build/classes/client/MapleCharacter$SkillEntry.class and b/build/classes/client/MapleCharacter$SkillEntry.class differ diff --git a/build/classes/client/MapleCharacter.class b/build/classes/client/MapleCharacter.class index 23ed1d1099..06b5e4e85a 100644 Binary files a/build/classes/client/MapleCharacter.class and b/build/classes/client/MapleCharacter.class differ diff --git a/build/classes/client/MapleQuestStatus.class b/build/classes/client/MapleQuestStatus.class index d6e2a2cc2e..2c8b660318 100644 Binary files a/build/classes/client/MapleQuestStatus.class and b/build/classes/client/MapleQuestStatus.class differ diff --git a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class index 24c2863cf4..85136c3038 100644 Binary files a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class and b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class differ diff --git a/build/classes/scripting/event/EventManager.class b/build/classes/scripting/event/EventManager.class index 1d180488ab..d2beece16d 100644 Binary files a/build/classes/scripting/event/EventManager.class and b/build/classes/scripting/event/EventManager.class differ diff --git a/build/classes/server/quest/MapleQuest$1.class b/build/classes/server/quest/MapleQuest$1.class index 05c17c80c1..d0f505f6bc 100644 Binary files a/build/classes/server/quest/MapleQuest$1.class and b/build/classes/server/quest/MapleQuest$1.class differ diff --git a/build/classes/server/quest/MapleQuest.class b/build/classes/server/quest/MapleQuest.class index 50abf8bc1e..73a49d7865 100644 Binary files a/build/classes/server/quest/MapleQuest.class and b/build/classes/server/quest/MapleQuest.class differ diff --git a/dist/MapleSolaxia.jar b/dist/MapleSolaxia.jar index e06b5f87a1..7255829e25 100644 Binary files a/dist/MapleSolaxia.jar and b/dist/MapleSolaxia.jar differ diff --git a/feature_list.txt b/feature_list.txt index 76c9812e34..d56d411033 100644 --- a/feature_list.txt +++ b/feature_list.txt @@ -7,42 +7,47 @@ Vcoc - Freelance Developer Feature list: --------------------------- -PQs/Quests: -* HPQ/KPQ/LPQ/LMPQ/OPQ/EllinPQ/PiratePQ 100% -* CWKPQ as Expedition-based event 100% -* GuildPQ 100% + Guild queue and multi-lobby systems available. -* Brand-new PQ: Boss Rush PQ 100% -* BalrogPQ semi-functional -* Doll house quest 100% +PQs: +* HPQ/KPQ/LPQ/LMPQ/OPQ/EllinPQ/PiratePQ 100%. +* CWKPQ as Expedition-based event 100%. +* GuildPQ 100% + Guild queue with multi-lobby systems available. +* Brand-new PQ: Boss Rush PQ 100%. +* BalrogPQ semi-functional. + +Quests: +* Doll house quest 100%. +* Quests can now reward properly items when matching a reward item with the player's job. * Loads of quests have been patched. Player Social Network: * Guild and Alliance system fully functional. Cash: -* EXP/DROP/Cosmetic Coupons 100% +* EXP/DROP/Cosmetic Coupons 100%. +* EXP/DROP coupons now appears as a buff effect when on active time. * Great deal of cash items functional. PQ potentials: -* Lobby system - Limited multiple PQ instances on same channel. -* Guild queue system - Guilds can register themselves on a queue for GPQ. +* Lobby system - Multiple PQ instances on same channel. +* Expedition system - Multiples parties can attempt on a same instance (lobbies and expeds are mutually-exclusive). +* Guild queue system - Guilds can register themselves on a queue for the GPQ. Server potentials: -* Multi-worlds 100% -* Adventurer Mount quests 100% +* Multi-worlds 100%. +* Adventurer Mount quests 100%. * All Equipment levels up. * Player level rates. * Gain fame by quests. * Every monsterbook card is now droppable by overworld mobs. -* Added Boss HP Bar for dozens of bosses (needs provided custom wz) -* Custom jail system (needs provided custom wz) -* Delete Character 100% (requires ENABLE_PIC activated) +* Added Boss HP Bar for dozens of bosses (needs provided custom wz); +* Custom jail system (needs provided custom wz). +* Delete Character 100% (requires ENABLE_PIC activated). Admin/GM commands: -* New commands -* Zakum/Horntail/Pinkbean 100% +* New commands. +* Zakum/Horntail/Pinkbean 100%. Project: -* Organized project code -* Highly configurable server (see server flags at ServerConstants) +* Organized project code. +* Highly configurable server (see server flags at ServerConstants). --------------------------- \ No newline at end of file diff --git a/mychanges_ptbr.txt b/mychanges_ptbr.txt index f6049e1f6f..8edd5d64e1 100644 --- a/mychanges_ptbr.txt +++ b/mychanges_ptbr.txt @@ -347,4 +347,8 @@ Reestrutura 28 - 29 Junho 2017, Acabamento final da CWKPQ. -Corrigido bug no esquema de recuperação de diretórios dos mapas, referenciados em String.wz. \ No newline at end of file +Corrigido bug no esquema de recuperação de diretórios dos mapas, referenciados em String.wz. + +30 Junho 2017, +Corrigido bug em mecânica de hpDec que permitia aos jogadores postergarem o efeito de decréscimo de HP. +Elaborada funcionalidade que permite salvar o "tempo até expirar" para quests com janela de tempo muito alta (as que usam "timeLimit2"). \ No newline at end of file diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index bc3b4885dd..5af0ed1acc 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -2,20 +2,6 @@ - - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleMapFactory.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/expeditions/MapleExpeditionType.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/event/CWKPQ.js - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/expeditions/MapleExpedition.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/command/Commands.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/npc/9201112.js - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventInstanceManager.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/AbstractPlayerInteraction.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/npc/9201110.js - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/npc/9201113.js - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/provider/MapleDataTool.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventManager.java - + diff --git a/sql/db_database.sql b/sql/db_database.sql index 0504bb3249..e24d96ddf4 100644 --- a/sql/db_database.sql +++ b/sql/db_database.sql @@ -16433,6 +16433,7 @@ CREATE TABLE IF NOT EXISTS `queststatus` ( `quest` int(11) NOT NULL DEFAULT '0', `status` int(11) NOT NULL DEFAULT '0', `time` int(11) NOT NULL DEFAULT '0', + `expires` bigint(20) NOT NULL DEFAULT '0', `forfeited` int(11) NOT NULL DEFAULT '0', `info` tinyint(3) NOT NULL DEFAULT '0', PRIMARY KEY (`queststatusid`) diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 1d202868c7..e1564bc10d 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -1974,7 +1974,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { public void run() { doHurtHp(); } - }, lastHpTask); + }, 10000 - lastHpTask); } } @@ -2999,6 +2999,17 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { return 0; } } + + public final MapleQuestStatus getMapleQuestStatus(final int quest) { + synchronized (quests) { + for (final MapleQuestStatus q : quests.values()) { + if (q.getQuest().getId() == quest) { + return q; + } + } + return null; + } + } public MapleQuestStatus getQuest(MapleQuest quest) { synchronized (quests) { @@ -4072,6 +4083,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { 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")); @@ -4179,6 +4196,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } return null; } + + public void reloadQuestExpirations() { + for(MapleQuestStatus mqs: quests.values()) { + if(mqs.getExpirationTime() > 0) { + questTimeLimit2(mqs.getQuest(), mqs.getExpirationTime()); + } + } + } public static String makeMapleReadable(String in) { String i = in.replace('I', 'i'); @@ -5078,7 +5103,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { 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`, `forfeited`) VALUES (DEFAULT, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); + 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, ?, ?)"); @@ -5089,7 +5114,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { ps.setInt(2, q.getQuest().getId()); ps.setInt(3, q.getStatus().getId()); ps.setInt(4, (int) (q.getCompletionTime() / 1000)); - ps.setInt(5, q.getForfeited()); + ps.setLong(5, q.getExpirationTime()); + ps.setInt(6, q.getForfeited()); ps.executeUpdate(); try (ResultSet rs = ps.getGeneratedKeys()) { rs.next(); @@ -5917,22 +5943,43 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } } + private void expireQuest(MapleQuest quest) { + if(getQuestStatus(quest.getId()) == MapleQuestStatus.Status.COMPLETED.getId()) return; + if(System.currentTimeMillis() < getMapleQuestStatus(quest.getId()).getExpirationTime()) return; + + announce(MaplePacketCreator.questExpire(quest.getId())); + MapleQuestStatus newStatus = new MapleQuestStatus(quest, MapleQuestStatus.Status.NOT_STARTED); + newStatus.setForfeited(getQuest(quest).getForfeited() + 1); + updateQuest(newStatus); + } + public void questTimeLimit(final MapleQuest quest, int seconds) { - final MapleCharacter chr = this; ScheduledFuture sf = TimerManager.getInstance().schedule(new Runnable() { @Override public void run() { - if(chr.getQuestStatus(quest.getId()) == MapleQuestStatus.Status.COMPLETED.getId()) return; - - announce(MaplePacketCreator.questExpire(quest.getId())); - MapleQuestStatus newStatus = new MapleQuestStatus(quest, MapleQuestStatus.Status.NOT_STARTED); - newStatus.setForfeited(getQuest(quest).getForfeited() + 1); - updateQuest(newStatus); + expireQuest(quest); } }, seconds * 1000); announce(MaplePacketCreator.addQuestTimeLimit(quest.getId(), seconds * 1000)); timers.add(sf); } + + public void questTimeLimit2(final MapleQuest quest, long expires) { + long timeLeft = expires - System.currentTimeMillis(); + + if(timeLeft <= 0) { + expireQuest(quest); + } else { + ScheduledFuture sf = TimerManager.getInstance().schedule(new Runnable() { + @Override + public void run() { + expireQuest(quest); + } + }, timeLeft); + + timers.add(sf); + } + } public void updateSingleStat(MapleStat stat, int newval) { updateSingleStat(stat, newval, false); diff --git a/src/client/MapleQuestStatus.java b/src/client/MapleQuestStatus.java index 4254176786..0f8464fa58 100644 --- a/src/client/MapleQuestStatus.java +++ b/src/client/MapleQuestStatus.java @@ -63,7 +63,7 @@ public class MapleQuestStatus { private Map progress = new LinkedHashMap(); private List medalProgress = new LinkedList(); private int npc; - private long completionTime; + private long completionTime, expirationTime; private int forfeited = 0; private String customData; @@ -71,6 +71,7 @@ public class MapleQuestStatus { this.questID = quest.getId(); this.setStatus(status); this.completionTime = System.currentTimeMillis(); + this.expirationTime = 0; if (status == Status.STARTED) registerMobs(); } @@ -80,6 +81,7 @@ public class MapleQuestStatus { this.setStatus(status); this.setNpc(npc); this.completionTime = System.currentTimeMillis(); + this.expirationTime = 0; if (status == Status.STARTED) { registerMobs(); } @@ -89,9 +91,9 @@ public class MapleQuestStatus { return MapleQuest.getInstance(questID); } - public short getQuestID() { - return questID; - } + public short getQuestID() { + return questID; + } public Status getStatus() { return status; @@ -178,6 +180,14 @@ public class MapleQuestStatus { public void setCompletionTime(long completionTime) { this.completionTime = completionTime; } + + public long getExpirationTime() { + return expirationTime; + } + + public void setExpirationTime(long expirationTime) { + this.expirationTime = expirationTime; + } public int getForfeited() { return forfeited; diff --git a/src/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/net/server/channel/handlers/PlayerLoggedinHandler.java index e5c0735c07..d8dc3dafa9 100644 --- a/src/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -242,6 +242,8 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler { if(pet != null) player.startFullnessSchedule(PetDataFactory.getHunger(pet.getItemId()), pet, player.getPetIndex(pet)); } + + player.reloadQuestExpirations(); } c.announce(MaplePacketCreator.updateGender(player)); @@ -264,7 +266,6 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler { Server.getInstance().broadcastGMMessage(MaplePacketCreator.earnTitleMessage("GM " + player.getName() + " has logged in")); } - } if (player.getMap().getHPDec() > 0) player.resetHpDecreaseTask(); diff --git a/src/scripting/event/EventManager.java b/src/scripting/event/EventManager.java index c2eb47bc85..6014047206 100644 --- a/src/scripting/event/EventManager.java +++ b/src/scripting/event/EventManager.java @@ -69,7 +69,7 @@ public class EventManager { private List openedLobbys; private Properties props = new Properties(); private String name; - private Lock l = new ReentrantLock(); + private Lock lobbyLock = new ReentrantLock(); private static final int limitGuilds = 10; // max numbers of guilds in queue for GPQ. private static final int maxLobbys = 8; // an event manager holds up to this amount of concurrent lobbys @@ -202,32 +202,32 @@ public class EventManager { } private boolean getLockLobby(int lobbyId) { - l.lock(); + lobbyLock.lock(); try { return openedLobbys.get(lobbyId); } finally { - l.unlock(); + lobbyLock.unlock(); } } private void setLockLobby(int lobbyId, boolean lock) { - l.lock(); + lobbyLock.lock(); try { openedLobbys.set(lobbyId, lock); } finally { - l.unlock(); + lobbyLock.unlock(); } } private boolean startLobbyInstance(int lobbyId) { - l.lock(); + lobbyLock.lock(); try { if(!openedLobbys.get(lobbyId)) { openedLobbys.set(lobbyId, true); return true; } } finally { - l.unlock(); + lobbyLock.unlock(); } return false; diff --git a/src/server/quest/MapleQuest.java b/src/server/quest/MapleQuest.java index b48d823499..c5beb0ae6a 100644 --- a/src/server/quest/MapleQuest.java +++ b/src/server/quest/MapleQuest.java @@ -47,7 +47,7 @@ public class MapleQuest { private static Map quests = new HashMap<>(); protected short infoNumber, id; - protected int timeLimit; + protected int timeLimit, timeLimit2; protected String infoex; protected Map startReqs = new EnumMap<>(MapleQuestRequirementType.class); protected Map completeReqs = new EnumMap<>(MapleQuestRequirementType.class); @@ -74,7 +74,7 @@ public class MapleQuest { MapleData reqInfo = questInfo.getChildByPath(String.valueOf(id)); if(reqInfo != null) { timeLimit = MapleDataTool.getInt("timeLimit", reqInfo, 0); - timeLimit = Math.max(timeLimit, MapleDataTool.getInt("timeLimit2", reqInfo, 0)); // alas, nexon made we deal with 2 timeLimits + timeLimit2 = MapleDataTool.getInt("timeLimit2", reqInfo, 0); autoStart = MapleDataTool.getInt("autoStart", reqInfo, 0) == 1; autoPreComplete = MapleDataTool.getInt("autoPreComplete", reqInfo, 0) == 1; autoComplete = MapleDataTool.getInt("autoComplete", reqInfo, 0) == 1; @@ -287,8 +287,13 @@ public class MapleQuest { newStatus.setForfeited(c.getQuest(this).getForfeited()); if (timeLimit > 0) { + newStatus.setExpirationTime(System.currentTimeMillis() + (timeLimit * 1000)); c.questTimeLimit(this, timeLimit); } + if (timeLimit2 > 0) { + newStatus.setExpirationTime(System.currentTimeMillis() + timeLimit2); + c.questTimeLimit2(this, newStatus.getExpirationTime()); + } c.updateQuest(newStatus); return true; diff --git a/todo.txt b/todo.txt index 5a5d298176..179e6a1760 100644 --- a/todo.txt +++ b/todo.txt @@ -1 +1,5 @@ +gaviota? +cash drop from equipped +NPCs masteria + PQs \ No newline at end of file