Roaring tiger + party EXP fix + Owl leaderboard
Fixed Roaring Tiger messenger effect sticking on the client after the end on the animation. Fixed an issue with party EXP handing to low-level players leech EXP. Fixed party EXP system giving players way too much EXP in some cases. Added Owl item search ranking feature, items most searched can be displayed by the Owl instead of the hard-coded counterpart.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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()))) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<Pair<MaplePlayerShopItem, AbstractMapleMapObject>> hmsAvailable = c.getWorldServer().getAvailableItemBundles(itemid);
|
||||
if(!hmsAvailable.isEmpty()) remove(c, itemId);
|
||||
|
||||
@@ -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<Pair<Integer, Integer>> owlSearched = c.getWorldServer().getOwlSearchedItems();
|
||||
List<Integer> owlLeaderboards;
|
||||
|
||||
if(owlSearched.size() < 5) {
|
||||
owlLeaderboards = new LinkedList<>();
|
||||
for(int i : GameConstants.OWL_DATA) {
|
||||
owlLeaderboards.add(i);
|
||||
}
|
||||
} else {
|
||||
Comparator<Pair<Integer, Integer>> comparator = new Comparator<Pair<Integer, Integer>>() { // descending order
|
||||
@Override
|
||||
public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
|
||||
return p2.getRight().compareTo(p1.getRight());
|
||||
}
|
||||
};
|
||||
|
||||
PriorityQueue<Pair<Integer, Integer>> queue = new PriorityQueue<>(10, comparator);
|
||||
for(Pair<Integer, Integer> 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));
|
||||
}
|
||||
}
|
||||
@@ -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<Integer> queuedGuilds = new HashSet<>();
|
||||
|
||||
private Map<Integer, Integer> owlSearched = new LinkedHashMap<>();
|
||||
private Lock owlLock = new ReentrantLock();
|
||||
|
||||
private Map<Integer, Byte> 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<Pair<Integer, Integer>> getOwlSearchedItems() {
|
||||
if(ServerConstants.USE_ENFORCE_OWL_SUGGESTIONS) {
|
||||
return new ArrayList<>(0);
|
||||
}
|
||||
|
||||
owlLock.lock();
|
||||
try {
|
||||
List<Pair<Integer, Integer>> searchCounts = new ArrayList<>(owlSearched.size());
|
||||
|
||||
for(Entry<Integer, Integer> 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;
|
||||
|
||||
Reference in New Issue
Block a user