diff --git a/build/built-jar.properties b/build/built-jar.properties index eceba121aa..01cee0faf7 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Mon, 16 Oct 2017 14:34:51 -0200 +#Wed, 18 Oct 2017 15:51:18 -0200 C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2= diff --git a/build/classes/client/MapleCharacter$16.class b/build/classes/client/MapleCharacter$16.class index 39bb6eaa11..fe4cc766c8 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 8afb4b892f..965122e4d3 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 4dfd86e071..ac0d4b00f5 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 index 4d9bda9cad..249ec7f3ae 100644 Binary files a/build/classes/client/MapleCharacter$19.class and b/build/classes/client/MapleCharacter$19.class differ diff --git a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class index a02b7bffb8..2075f82add 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 0229b42f76..fd5e4e3419 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 41c25bfb8d..d65dce29a9 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 a6d890a1ba..a9e18a97d6 100644 Binary files a/build/classes/client/MapleCharacter.class and b/build/classes/client/MapleCharacter.class differ diff --git a/build/classes/constants/GameConstants$1.class b/build/classes/constants/GameConstants$1.class index 40631c6839..e366eef883 100644 Binary files a/build/classes/constants/GameConstants$1.class and b/build/classes/constants/GameConstants$1.class differ diff --git a/build/classes/constants/GameConstants.class b/build/classes/constants/GameConstants.class index a9b18c893c..b89ad9a319 100644 Binary files a/build/classes/constants/GameConstants.class and b/build/classes/constants/GameConstants.class differ diff --git a/build/classes/constants/ServerConstants.class b/build/classes/constants/ServerConstants.class index 901322b9a2..70652c40d9 100644 Binary files a/build/classes/constants/ServerConstants.class and b/build/classes/constants/ServerConstants.class differ diff --git a/build/classes/net/server/channel/handlers/HiredMerchantRequest.class b/build/classes/net/server/channel/handlers/HiredMerchantRequest.class index b07f3437cd..2209266a3d 100644 Binary files a/build/classes/net/server/channel/handlers/HiredMerchantRequest.class and b/build/classes/net/server/channel/handlers/HiredMerchantRequest.class differ diff --git a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class index e5f971a63e..f349b2a90f 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/net/server/channel/handlers/UseCashItemHandler$1.class b/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class index dd32ed840d..20cba0b425 100644 Binary files a/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class and b/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class differ diff --git a/build/classes/net/server/channel/handlers/UseCashItemHandler.class b/build/classes/net/server/channel/handlers/UseCashItemHandler.class index b56eb8f79c..5df32d8bd8 100644 Binary files a/build/classes/net/server/channel/handlers/UseCashItemHandler.class and b/build/classes/net/server/channel/handlers/UseCashItemHandler.class differ diff --git a/build/classes/net/server/world/World$1.class b/build/classes/net/server/world/World$1.class index 04ce90d4a1..8fb6c46f5b 100644 Binary files a/build/classes/net/server/world/World$1.class and b/build/classes/net/server/world/World$1.class differ diff --git a/build/classes/net/server/world/World.class b/build/classes/net/server/world/World.class index 91d2968bf9..d2bf7bd67d 100644 Binary files a/build/classes/net/server/world/World.class and b/build/classes/net/server/world/World.class differ diff --git a/build/classes/scripting/event/EventManager$1.class b/build/classes/scripting/event/EventManager$1.class index c7591f8263..1f9b5957af 100644 Binary files a/build/classes/scripting/event/EventManager$1.class and b/build/classes/scripting/event/EventManager$1.class differ diff --git a/build/classes/scripting/event/EventManager$2.class b/build/classes/scripting/event/EventManager$2.class index 5586d9ff9a..9b3cb8ad2b 100644 Binary files a/build/classes/scripting/event/EventManager$2.class and b/build/classes/scripting/event/EventManager$2.class differ diff --git a/build/classes/scripting/event/EventManager$3.class b/build/classes/scripting/event/EventManager$3.class index b28630116a..a35c8b5b21 100644 Binary files a/build/classes/scripting/event/EventManager$3.class and b/build/classes/scripting/event/EventManager$3.class differ diff --git a/build/classes/scripting/event/EventManager$EventManagerWorker.class b/build/classes/scripting/event/EventManager$EventManagerWorker.class index cd1c215d76..26068b494d 100644 Binary files a/build/classes/scripting/event/EventManager$EventManagerWorker.class and b/build/classes/scripting/event/EventManager$EventManagerWorker.class differ diff --git a/build/classes/scripting/event/EventManager.class b/build/classes/scripting/event/EventManager.class index 081f5b214b..845ac25c2f 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/MapleInventoryManipulator.class b/build/classes/server/MapleInventoryManipulator.class index 5070646180..fdd63aa75d 100644 Binary files a/build/classes/server/MapleInventoryManipulator.class and b/build/classes/server/MapleInventoryManipulator.class differ diff --git a/build/classes/server/life/MapleMonster$1.class b/build/classes/server/life/MapleMonster$1.class index bf9b74d22d..0b90120e43 100644 Binary files a/build/classes/server/life/MapleMonster$1.class and b/build/classes/server/life/MapleMonster$1.class differ diff --git a/build/classes/server/life/MapleMonster$2.class b/build/classes/server/life/MapleMonster$2.class index 8be88f2d3f..947aba94f0 100644 Binary files a/build/classes/server/life/MapleMonster$2.class and b/build/classes/server/life/MapleMonster$2.class differ diff --git a/build/classes/server/life/MapleMonster$3.class b/build/classes/server/life/MapleMonster$3.class index 2b8283dacc..da2f603b71 100644 Binary files a/build/classes/server/life/MapleMonster$3.class and b/build/classes/server/life/MapleMonster$3.class differ diff --git a/build/classes/server/life/MapleMonster$4.class b/build/classes/server/life/MapleMonster$4.class index f8ab42e84a..2e0760ef23 100644 Binary files a/build/classes/server/life/MapleMonster$4.class and b/build/classes/server/life/MapleMonster$4.class differ diff --git a/build/classes/server/life/MapleMonster$5.class b/build/classes/server/life/MapleMonster$5.class index 33c13f8bd9..58f188cec9 100644 Binary files a/build/classes/server/life/MapleMonster$5.class and b/build/classes/server/life/MapleMonster$5.class differ diff --git a/build/classes/server/life/MapleMonster$6.class b/build/classes/server/life/MapleMonster$6.class index e688f4b68c..295643d0d0 100644 Binary files a/build/classes/server/life/MapleMonster$6.class and b/build/classes/server/life/MapleMonster$6.class differ diff --git a/build/classes/server/life/MapleMonster$DamageTask.class b/build/classes/server/life/MapleMonster$DamageTask.class index 873b54e0ba..f7fd11c750 100644 Binary files a/build/classes/server/life/MapleMonster$DamageTask.class and b/build/classes/server/life/MapleMonster$DamageTask.class differ diff --git a/build/classes/server/life/MapleMonster.class b/build/classes/server/life/MapleMonster.class index 10067c547f..73681f144e 100644 Binary files a/build/classes/server/life/MapleMonster.class and b/build/classes/server/life/MapleMonster.class differ diff --git a/build/classes/tools/MaplePacketCreator.class b/build/classes/tools/MaplePacketCreator.class index 1f6cabd445..ad9bbc1da7 100644 Binary files a/build/classes/tools/MaplePacketCreator.class and b/build/classes/tools/MaplePacketCreator.class differ diff --git a/dist/MapleSolaxia.jar b/dist/MapleSolaxia.jar index b89d19b0ca..3eb034012c 100644 Binary files a/dist/MapleSolaxia.jar and b/dist/MapleSolaxia.jar differ diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index a462593a70..927a1ebe44 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -585,4 +585,9 @@ Se houve sucesso usando white scroll, slot ainda 15 Outubro 2017, Corrigido Mini-dungeons não liberando os jogadores corretamente. Se player entra em outra sessão de MD antes de dar o timeout da primeira, o timeout leva efeito mesmo fora da sessão. Corrigido um bug/exploit que permitia stackar map chair recovery. -Corrigido um bug no inventário de CASH mesclando itens de mesmo id. \ No newline at end of file +Corrigido um bug no inventário de CASH mesclando itens de mesmo id. +Adicionado contador de buscas por itens realizados pelos jogadores ao usar Owl. Sugestão de mais pesquisados na Owl implementado. + +17 Outubro 2017, +Consertado Roaring Tiger Messenger aparecendo fora da tela ao final da animação. +Consertado bugs envolvendo ganho de EXP em party, para casos onde o level do mob alvo é bem maior que o do atacante/leecher. \ No newline at end of file diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 5af0ed1acc..3287222d26 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -1,6 +1,6 @@ - + diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 6b5019e776..3951515d4a 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -5293,6 +5293,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { if (party != null) { ret.mpc = party.getMemberById(ret.id); if (ret.mpc != null) { + ret.mpc = new MaplePartyCharacter(ret); ret.party = party; } } diff --git a/src/client/autoban/AutobanManager.java b/src/client/autoban/AutobanManager.java index b866695646..83990b106f 100644 --- a/src/client/autoban/AutobanManager.java +++ b/src/client/autoban/AutobanManager.java @@ -93,8 +93,8 @@ public class AutobanManager { * type:
* 0: HealOverTime
* 1: Pet Food
- * 2: ItemMerge
- * 3: ItemSort
+ * 2: InventoryMerge
+ * 3: InventorySort
* 4: SpecialMove
* 5: UseCatchItem
* 6: Item Drop
diff --git a/src/constants/GameConstants.java b/src/constants/GameConstants.java index d2d7974c96..cd3c097f06 100644 --- a/src/constants/GameConstants.java +++ b/src/constants/GameConstants.java @@ -10,7 +10,6 @@ import server.maps.FieldLimit; * @author Ronan */ public class GameConstants { - //public static final int[] OWL_DATA = {2000014, 2000015, 2000016}; public static final int[] OWL_DATA = new int[]{1082002, 2070005, 2070006, 1022047, 1102041, 2044705, 2340000, 2040017, 1092030, 2040804}; // Ronan's rates upgrade system diff --git a/src/constants/ServerConstants.java b/src/constants/ServerConstants.java index 9766c96f5d..4349fd3f62 100644 --- a/src/constants/ServerConstants.java +++ b/src/constants/ServerConstants.java @@ -48,6 +48,7 @@ public class ServerConstants { public static final boolean USE_AUTOSAVE = true; //Enables server autosaving feature (saves characters to DB each 1 hour). public static final boolean USE_SERVER_AUTOASSIGNER = true; //Server-builtin autoassigner, uses algorithm based on distributing AP accordingly with required secondary stat on equipments. public static final boolean USE_REFRESH_RANK_MOVE = true; + public static final boolean USE_ENFORCE_OWL_SUGGESTIONS = false;//Forces the Owl of Minerva to always display the defined item array on GameConstants.OWL_DATA instead of the featured by the players. public static final boolean USE_ENFORCE_UNMERCHABLE_PET = true; //Forces players to not sell pets via merchants. (since non-named pets gets dirty name and other possible DB-related issues) public static final boolean USE_ENFORCE_MDOOR_POSITION = true; //Forces mystic door to be spawned near spawnpoints. (since things bugs out other way, and this helps players to locate the door faster) public static final boolean USE_ERASE_PERMIT_ON_OPENSHOP = true;//Forces "shop permit" item to be consumed when player deploy his/her player shop. @@ -63,8 +64,10 @@ public class ServerConstants { public static final int BOSS_DROP_RATE = 20; public static final double EQUIP_EXP_RATE = 10.0; //Rate for equipment exp gain, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2). + public static final double PARTY_BONUS_EXP_RATE = 1.0; //Rate for the party exp reward. + public static final double PQ_BONUS_EXP_RATE = 0.5; //Rate for the PQ exp reward. + public static final int PARTY_EXPERIENCE_MOD = 1; //Change for event stuff. - public static final double PQ_BONUS_EXP_MOD = 0.5; public static final byte MAX_MONITORED_BUFFSTATS = 5; //Limits accounting for "dormant" buff effects, that should take place when stronger stat buffs expires. public static final int MAX_AP = 32767; //Max AP allotted on the auto-assigner. @@ -117,15 +120,19 @@ public class ServerConstants { public static final byte PET_EXHAUST_COUNT = 3; //Number of proc counts (1 per minute) on the exhaust schedule for fullness. public static final byte MOUNT_EXHAUST_COUNT = 1; //Number of proc counts (1 per minute) on the exhaust schedule for tiredness. + //Pet Hunger Configuration + public static final boolean PETS_NEVER_HUNGRY = false; //If true, pets and mounts will never grow hungry. + public static final boolean GM_PETS_NEVER_HUNGRY = true; //If true, pets and mounts owned by GMs will never grow hungry. + + //Event Configuration + public static final int EVENT_MAX_GUILD_QUEUE = 10; //Max number of guilds in queue for GPQ. + public static final long EVENT_LOBBY_DELAY = 10; //Cooldown duration in seconds before reopening an event lobby. + //Dojo Configuration public static final boolean USE_DEADLY_DOJO = false; //Should bosses really use 1HP,1MP attacks in dojo? public static final int DOJO_ENERGY_ATK = 100; //Dojo energy gain when deal attack public static final int DOJO_ENERGY_DMG = 20; //Dojo energy gain when recv attack - //Pet Hunger Configuration - public static final boolean PETS_NEVER_HUNGRY = false; //If true, pets and mounts will never grow hungry. - public static final boolean GM_PETS_NEVER_HUNGRY = true; //If true, pets and mounts owned by GMs will never grow hungry. - //Event End Timestamp public static final long EVENT_END_TIMESTAMP = 1428897600000L; diff --git a/src/net/server/channel/Channel.java b/src/net/server/channel/Channel.java index 238b3ca354..ed4a698baf 100644 --- a/src/net/server/channel/Channel.java +++ b/src/net/server/channel/Channel.java @@ -500,7 +500,7 @@ public final class Channel { if(dungeons.containsKey(dungeonid)) return false; MapleMiniDungeonInfo mmdi = MapleMiniDungeonInfo.getDungeon(dungeonid); - MapleMiniDungeon mmd = new MapleMiniDungeon(mmdi.getBase(), 30); // all minidungeons timeouts on 30 mins + MapleMiniDungeon mmd = new MapleMiniDungeon(mmdi.getBase(), 30); // all minidungeons timeout on 30 mins dungeons.put(dungeonid, mmd); return true; diff --git a/src/net/server/channel/handlers/HiredMerchantRequest.java b/src/net/server/channel/handlers/HiredMerchantRequest.java index 368d829aa1..29fe4a2b48 100644 --- a/src/net/server/channel/handlers/HiredMerchantRequest.java +++ b/src/net/server/channel/handlers/HiredMerchantRequest.java @@ -37,6 +37,7 @@ import tools.data.input.SeekableLittleEndianAccessor; * @author XoticStory */ public final class HiredMerchantRequest extends AbstractMaplePacketHandler { + @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { MapleCharacter chr = c.getPlayer(); if (chr.getMap().getMapObjectsInRange(chr.getPosition(), 23000, Arrays.asList(MapleMapObjectType.HIRED_MERCHANT)).isEmpty() && (GameConstants.isFreeMarketRoom(chr.getMapId()))) { diff --git a/src/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/net/server/channel/handlers/PlayerLoggedinHandler.java index bf6759745e..cfc9e1860c 100644 --- a/src/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -44,7 +44,6 @@ import tools.Pair; import tools.data.input.SeekableLittleEndianAccessor; import client.BuddylistEntry; import client.CharacterNameAndId; -import client.MapleBuffStat; import client.MapleCharacter; import client.MapleClient; import client.MapleFamily; diff --git a/src/net/server/channel/handlers/UseCashItemHandler.java b/src/net/server/channel/handlers/UseCashItemHandler.java index 6ae08f56fa..6d10f04ed9 100644 --- a/src/net/server/channel/handlers/UseCashItemHandler.java +++ b/src/net/server/channel/handlers/UseCashItemHandler.java @@ -34,6 +34,7 @@ import client.inventory.MapleInventoryType; import client.inventory.MaplePet; import client.inventory.ModifyInventory; import constants.ItemConstants; +import constants.ServerConstants; import java.sql.SQLException; import java.util.ArrayList; @@ -441,6 +442,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { } else if (itemType == 523) { int itemid = slea.readInt(); + if(!ServerConstants.USE_ENFORCE_OWL_SUGGESTIONS) c.getWorldServer().addOwlItemSearch(itemid); player.setOwlSearch(itemid); List> hmsAvailable = c.getWorldServer().getAvailableItemBundles(itemid); if(!hmsAvailable.isEmpty()) remove(c, itemId); diff --git a/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java b/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java index 530c89139f..38a8ae3619 100644 --- a/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java +++ b/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java @@ -25,11 +25,46 @@ import client.MapleClient; import net.AbstractMaplePacketHandler; import tools.data.input.SeekableLittleEndianAccessor; import tools.MaplePacketCreator; +import tools.Pair; + +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.PriorityQueue; + +import constants.GameConstants; public final class UseOwlOfMinervaHandler extends AbstractMaplePacketHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { - c.announce(MaplePacketCreator.getOwlOpen()); + List> owlSearched = c.getWorldServer().getOwlSearchedItems(); + List owlLeaderboards; + + if(owlSearched.size() < 5) { + owlLeaderboards = new LinkedList<>(); + for(int i : GameConstants.OWL_DATA) { + owlLeaderboards.add(i); + } + } else { + Comparator> comparator = new Comparator>() { // descending order + @Override + public int compare(Pair p1, Pair p2) { + return p2.getRight().compareTo(p1.getRight()); + } + }; + + PriorityQueue> queue = new PriorityQueue<>(10, comparator); + for(Pair p : owlSearched) { + queue.add(p); + } + + owlLeaderboards = new LinkedList<>(); + for(int i = 0; i < Math.min(owlSearched.size(), 10); i++) { + owlLeaderboards.add(queue.remove().getLeft()); + } + } + + c.announce(MaplePacketCreator.getOwlOpen(owlLeaderboards)); } } \ No newline at end of file diff --git a/src/net/server/world/World.java b/src/net/server/world/World.java index 8293aec5dc..ab980bb9bf 100644 --- a/src/net/server/world/World.java +++ b/src/net/server/world/World.java @@ -40,7 +40,10 @@ import java.util.List; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.Set; import java.util.HashSet; import java.util.concurrent.ScheduledFuture; @@ -69,6 +72,7 @@ import tools.Pair; /** * * @author kevintjuh93 + * @author Ronan (thread-oriented world schedules) */ public class World { @@ -84,6 +88,9 @@ public class World { private PlayerStorage players = new PlayerStorage(); private Set queuedGuilds = new HashSet<>(); + private Map owlSearched = new LinkedHashMap<>(); + private Lock owlLock = new ReentrantLock(); + private Map activePets = new LinkedHashMap<>(); private ScheduledFuture petsSchedule; private long petUpdate; @@ -720,6 +727,39 @@ public class World { return (chr.getId() << 2) + petSlot; } + public void addOwlItemSearch(Integer itemid) { + owlLock.lock(); + try { + Integer cur = owlSearched.get(itemid); + if(cur != null) { + owlSearched.put(itemid, cur + 1); + } else { + owlSearched.put(itemid, 1); + } + } finally { + owlLock.unlock(); + } + } + + public List> getOwlSearchedItems() { + if(ServerConstants.USE_ENFORCE_OWL_SUGGESTIONS) { + return new ArrayList<>(0); + } + + owlLock.lock(); + try { + List> searchCounts = new ArrayList<>(owlSearched.size()); + + for(Entry e : owlSearched.entrySet()) { + searchCounts.add(new Pair<>(e.getKey(), e.getValue())); + } + + return searchCounts; + } finally { + owlLock.unlock(); + } + } + public void registerPetHunger(MapleCharacter chr, byte petSlot) { if(chr.isGM() && ServerConstants.GM_PETS_NEVER_HUNGRY || ServerConstants.PETS_NEVER_HUNGRY) { return; diff --git a/src/scripting/AbstractPlayerInteraction.java b/src/scripting/AbstractPlayerInteraction.java index 39a960afee..73eaa90838 100644 --- a/src/scripting/AbstractPlayerInteraction.java +++ b/src/scripting/AbstractPlayerInteraction.java @@ -642,9 +642,9 @@ public class AbstractPlayerInteraction { public void givePartyExp(String PQ, boolean instance) { - //1 player = 0% bonus (100) - //2 players = 0% bonus (100) - //3 players = +0% bonus (100) + //1 player = +0% bonus (100) + //2 players = +0% bonus (100) + //3 players = +0% bonus (100) //4 players = +10% bonus (110) //5 players = +20% bonus (120) //6 players = +30% bonus (130) @@ -671,8 +671,8 @@ public class AbstractPlayerInteraction { int base = PartyQuest.getExp(PQ, player.getLevel()); int exp = base * bonus / 100; player.gainExp(exp, true, true); - if(ServerConstants.PQ_BONUS_EXP_MOD > 0 && System.currentTimeMillis() <= ServerConstants.EVENT_END_TIMESTAMP) { - player.gainExp((int) (exp * ServerConstants.PQ_BONUS_EXP_MOD), true, true); + if(ServerConstants.PQ_BONUS_EXP_RATE > 0 && System.currentTimeMillis() <= ServerConstants.EVENT_END_TIMESTAMP) { + player.gainExp((int) (exp * ServerConstants.PQ_BONUS_EXP_RATE), true, true); } } } diff --git a/src/scripting/event/EventManager.java b/src/scripting/event/EventManager.java index 364566eb6b..f499f069aa 100644 --- a/src/scripting/event/EventManager.java +++ b/src/scripting/event/EventManager.java @@ -33,6 +33,8 @@ import java.util.logging.Logger; import javax.script.Invocable; import javax.script.ScriptException; +import constants.ServerConstants; +import client.MapleCharacter; import net.server.Server; import net.server.world.World; import net.server.channel.Channel; @@ -44,15 +46,14 @@ import server.expeditions.MapleExpedition; import server.maps.MapleMap; import server.life.MapleMonster; import server.life.MapleLifeFactory; +import server.quest.MapleQuest; -import client.MapleCharacter; import java.util.List; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import server.quest.MapleQuest; /** * @@ -75,11 +76,9 @@ public class EventManager { private String name; private Lock lobbyLock = new ReentrantLock(); private Lock queueLock = 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 - private static final long lobbyDelay = 10; // 10 seconds cooldown before reopening a lobby + private static final int maxLobbys = 8; // an event manager holds up to this amount of concurrent lobbys + public EventManager(Channel cserv, Invocable iv, String name) { this.server = Server.getInstance(); this.iv = iv; @@ -107,7 +106,7 @@ public class EventManager { } public long getLobbyDelay() { - return lobbyDelay; + return ServerConstants.EVENT_LOBBY_DELAY; } private List getLobbyRange() { @@ -128,6 +127,7 @@ public class EventManager { public ScheduledFuture schedule(final String methodName, final EventInstanceManager eim, long delay) { return TimerManager.getInstance().schedule(new Runnable() { + @Override public void run() { try { iv.invokeFunction(methodName, eim); @@ -140,6 +140,7 @@ public class EventManager { public ScheduledFuture scheduleAtTimestamp(final String methodName, long timestamp) { return TimerManager.getInstance().scheduleAtTimestamp(new Runnable() { + @Override public void run() { try { iv.invokeFunction(methodName, (Object) null); @@ -190,7 +191,7 @@ public class EventManager { freeLobbyInstance(name); instances.remove(name); } - }, lobbyDelay * 1000); + }, ServerConstants.EVENT_LOBBY_DELAY * 1000); } public void setProperty(String key, String value) { @@ -561,7 +562,7 @@ public class EventManager { public boolean isQueueFull() { synchronized(queuedGuilds) { - return queuedGuilds.size() >= limitGuilds; + return queuedGuilds.size() >= ServerConstants.EVENT_MAX_GUILD_QUEUE; } } diff --git a/src/server/MapleInventoryManipulator.java b/src/server/MapleInventoryManipulator.java index 8be55f8cc3..5b0c4c36bc 100644 --- a/src/server/MapleInventoryManipulator.java +++ b/src/server/MapleInventoryManipulator.java @@ -355,18 +355,15 @@ public class MapleInventoryManipulator { public static void move(MapleClient c, MapleInventoryType type, short src, short dst) { if (src < 0 || dst < 0) { - System.out.println("src " + src + " dst " + dst); return; } if(dst > c.getPlayer().getInventory(type).getSlotLimit()) { - System.out.println("slim " + c.getPlayer().getInventory(type).getSlotLimit() + " dst " + dst); return; } MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); Item source = c.getPlayer().getInventory(type).getItem(src); Item initialTarget = c.getPlayer().getInventory(type).getItem(dst); if (source == null) { - System.out.println("null"); return; } short olddstQ = -1; diff --git a/src/server/life/MapleMonster.java b/src/server/life/MapleMonster.java index ad330d384f..4d8c317e38 100644 --- a/src/server/life/MapleMonster.java +++ b/src/server/life/MapleMonster.java @@ -258,7 +258,7 @@ public class MapleMonster extends AbstractLoadedMapleLife { return takenDamage.containsKey(chr.getId()); } - private void distributeExperienceToParty(int pid, int exp, int killer, Map expDist, Set underleveled) { + private void distributeExperienceToParty(int pid, int exp, int killer, Set underleveled) { List members = new LinkedList<>(); MapleCharacter pchar = getMap().getAnyCharacterFromParty(pid); if(pchar != null) { @@ -290,7 +290,7 @@ public class MapleMonster extends AbstractLoadedMapleLife { for (MapleCharacter mc : members) { int id = mc.getId(); int level = mc.getLevel(); - if (expDist.containsKey(id) || level >= leechMinLevel) { + if (level >= leechMinLevel) { boolean isKiller = killer == id; boolean mostDamage = mostDamageCid == id; int xp = (int) ((0.80f * exp * level) / partyLevel); @@ -344,7 +344,7 @@ public class MapleMonster extends AbstractLoadedMapleLife { } for (Entry party : partyExp.entrySet()) { - distributeExperienceToParty(party.getKey(), party.getValue(), killerId, expDist, underleveled); + distributeExperienceToParty(party.getKey(), party.getValue(), killerId, underleveled); } for(MapleCharacter mc : underleveled) { @@ -358,16 +358,17 @@ public class MapleMonster extends AbstractLoadedMapleLife { getMap().getEventInstance().monsterKilled(attacker, this); } } - final int partyModifier = numExpSharers > 1 ? (110 + (5 * (numExpSharers - 2))) : 0; - + + //PARTY BONUS: 2p -> +2% , 3p -> +4% , 4p -> +6% , 5p -> +8% , 6p -> +10% + final float partyModifier = numExpSharers <= 1 ? 0.0f : 0.02f * (numExpSharers - 1); + int partyExp = 0; - if (attacker.getHp() > 0) { int personalExp = exp * attacker.getExpRate(); if (exp > 0) { - if (partyModifier > 0) { - partyExp = (int) (personalExp * ServerConstants.PARTY_EXPERIENCE_MOD * partyModifier / 1000f); + if (partyModifier > 0.0f) { + partyExp = (int) (personalExp * partyModifier * ServerConstants.PARTY_BONUS_EXP_RATE); } Integer holySymbol = attacker.getBuffedValue(MapleBuffStat.HOLY_SYMBOL); boolean GMHolySymbol = attacker.getBuffSource(MapleBuffStat.HOLY_SYMBOL) == SuperGM.HOLY_SYMBOL; diff --git a/src/tools/MaplePacketCreator.java b/src/tools/MaplePacketCreator.java index 7f91cb9c8a..f8db5a86d4 100644 --- a/src/tools/MaplePacketCreator.java +++ b/src/tools/MaplePacketCreator.java @@ -5019,13 +5019,13 @@ public class MaplePacketCreator { return mplew.getPacket(); } - public static byte[] getOwlOpen() { + public static byte[] getOwlOpen(List owlLeaderboards) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.SHOP_SCANNER_RESULT.getValue()); mplew.write(7); - mplew.write(GameConstants.OWL_DATA.length); - for (int i : GameConstants.OWL_DATA) { + mplew.write(owlLeaderboards.size()); + for (Integer i : owlLeaderboards) { mplew.writeInt(i); } diff --git a/wz/Map.wz/MapHelper.img.xml b/wz/Map.wz/MapHelper.img.xml index d8a29423bb..d61a36a9c9 100644 --- a/wz/Map.wz/MapHelper.img.xml +++ b/wz/Map.wz/MapHelper.img.xml @@ -2372,20 +2372,20 @@ - - + + - - + + - - + + - - + + diff --git a/wz/Mob.wz/9400549.img.xml b/wz/Mob.wz/9400549.img.xml index eb4c0252ec..576d2d5b77 100644 --- a/wz/Mob.wz/9400549.img.xml +++ b/wz/Mob.wz/9400549.img.xml @@ -20,6 +20,9 @@ + + + diff --git a/wz/UI.wz/UIWindow.img.xml b/wz/UI.wz/UIWindow.img.xml index f33be14513..ab1e7db080 100644 --- a/wz/UI.wz/UIWindow.img.xml +++ b/wz/UI.wz/UIWindow.img.xml @@ -10214,7 +10214,7 @@ - + @@ -10222,6 +10222,10 @@ + + + +