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:
ronancpl
2017-10-20 12:48:49 -02:00
parent 57c29603d1
commit 75e11e1996
54 changed files with 146 additions and 51 deletions

View File

@@ -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;

View File

@@ -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()))) {

View File

@@ -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;

View File

@@ -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);

View File

@@ -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));
}
}

View File

@@ -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;