Unexpirable diseases & Holy Symbol patch
Fixed diseases becoming unexpirable after trying to change channels or entering the Cash Shop. Fixed Holy Symbol acting oddly in solo scenario. Adjusted Summon Sack lv. 9, that would try to spawn mobs with inexistent id on the field.
This commit is contained in:
@@ -2019,6 +2019,40 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
public Map<MapleDisease, Long> getAllDiseases() {
|
||||
chrLock.lock();
|
||||
try {
|
||||
long curtime = System.currentTimeMillis();
|
||||
Map<MapleDisease, Long> ret = new LinkedHashMap<>();
|
||||
|
||||
for(Entry<MapleDisease, Long> de : diseaseExpires.entrySet()) {
|
||||
MapleDiseaseValueHolder mdvh = diseases.get(de.getKey());
|
||||
|
||||
ret.put(de.getKey(), mdvh.length - (curtime - mdvh.startTime));
|
||||
}
|
||||
|
||||
return ret;
|
||||
} finally {
|
||||
chrLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void silentApplyDiseases(Map<MapleDisease, Long> diseaseMap) {
|
||||
chrLock.lock();
|
||||
try {
|
||||
long curTime = System.currentTimeMillis();
|
||||
|
||||
for(Entry<MapleDisease, Long> di : diseaseMap.entrySet()) {
|
||||
long expTime = curTime + di.getValue();
|
||||
|
||||
diseaseExpires.put(di.getKey(), expTime);
|
||||
diseases.put(di.getKey(), new MapleDiseaseValueHolder(curTime, expTime));
|
||||
}
|
||||
} finally {
|
||||
chrLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void giveDebuff(final MapleDisease disease, MobSkill skill) {
|
||||
if (!hasDisease(disease) && getDiseasesSize() < 2) {
|
||||
if (!(disease == MapleDisease.SEDUCE || disease == MapleDisease.STUN)) {
|
||||
@@ -2071,6 +2105,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
chrLock.lock();
|
||||
try {
|
||||
diseases.clear();
|
||||
diseaseExpires.clear();
|
||||
} finally {
|
||||
chrLock.unlock();
|
||||
}
|
||||
@@ -3834,6 +3869,10 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
(checkEquipped && inventory[MapleInventoryType.EQUIPPED.ordinal()].findById(itemid) != null);
|
||||
}
|
||||
|
||||
public boolean haveItemEquipped(int itemid) {
|
||||
return (inventory[MapleInventoryType.EQUIPPED.ordinal()].findById(itemid) != null);
|
||||
}
|
||||
|
||||
public int getItemQuantity(int itemid, boolean checkEquipped) {
|
||||
int possesed = inventory[ItemConstants.getInventoryType(itemid).ordinal()].countById(itemid);
|
||||
if (checkEquipped) {
|
||||
@@ -4744,8 +4783,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
dropMessage(1, "You don't have enough mesos.");
|
||||
return;
|
||||
}
|
||||
Server.getInstance().increaseGuildCapacity(guildid);
|
||||
gainMeso(-MapleGuild.getIncreaseGuildCost(getGuild().getCapacity()), true, false, false);
|
||||
|
||||
if(Server.getInstance().increaseGuildCapacity(guildid)) {
|
||||
gainMeso(-MapleGuild.getIncreaseGuildCost(getGuild().getCapacity()), true, false, false);
|
||||
} else {
|
||||
dropMessage(1, "You guild already reached the maximum capacity of players.");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isActiveBuffedValue(int skillid) {
|
||||
@@ -5367,7 +5410,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (item.getRight().equals(MapleInventoryType.EQUIP) || item.getRight().equals(MapleInventoryType.EQUIPPED)) {
|
||||
|
||||
MapleInventoryType mit = item.getRight();
|
||||
if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) {
|
||||
Equip equip = (Equip) item.getLeft();
|
||||
if (equip.getRingId() > -1) {
|
||||
MapleRing ring = MapleRing.loadFromDb(equip.getRingId());
|
||||
@@ -5426,7 +5471,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
ret.setPosition(portal.getPosition());
|
||||
int partyid = rs.getInt("party");
|
||||
MapleParty party = Server.getInstance().getWorld(ret.world).getParty(partyid);
|
||||
World wserv = Server.getInstance().getWorld(ret.world);
|
||||
MapleParty party = wserv.getParty(partyid);
|
||||
if (party != null) {
|
||||
ret.mpc = party.getMemberById(ret.id);
|
||||
if (ret.mpc != null) {
|
||||
@@ -5437,7 +5483,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
int messengerid = rs.getInt("messengerid");
|
||||
int position = rs.getInt("messengerposition");
|
||||
if (messengerid > 0 && position < 4 && position > -1) {
|
||||
MapleMessenger messenger = Server.getInstance().getWorld(ret.world).getMessenger(messengerid);
|
||||
MapleMessenger messenger = wserv.getMessenger(messengerid);
|
||||
if (messenger != null) {
|
||||
ret.messenger = messenger;
|
||||
ret.messengerposition = position;
|
||||
@@ -5501,7 +5547,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
ps.close();
|
||||
ret.cashshop = new CashShop(ret.accountid, ret.id, ret.getJobType());
|
||||
ret.autoban = new AutobanManager(ret);
|
||||
ret.marriageRing = null; //for now
|
||||
ps = con.prepareStatement("SELECT name, level FROM characters WHERE accountid = ? AND id != ? ORDER BY level DESC limit 1");
|
||||
ps.setInt(1, ret.accountid);
|
||||
ps.setInt(2, charid);
|
||||
@@ -7161,10 +7206,11 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
if (quantity <= iQuant && iQuant > 0) {
|
||||
MapleInventoryManipulator.removeFromSlot(c, type, (byte) slot, quantity, false);
|
||||
double price;
|
||||
if (ItemConstants.isRechargable(item.getItemId())) {
|
||||
price = ii.getWholePrice(item.getItemId()) / (double) ii.getSlotMax(c, item.getItemId());
|
||||
int itemid = item.getItemId();
|
||||
if (ItemConstants.isRechargable(itemid)) {
|
||||
price = ii.getWholePrice(itemid) / (double) ii.getSlotMax(c, itemid);
|
||||
} else {
|
||||
price = ii.getPrice(item.getItemId());
|
||||
price = ii.getPrice(itemid);
|
||||
}
|
||||
|
||||
int recvMesos = (int) Math.max(Math.ceil(price * quantity), 0);
|
||||
|
||||
@@ -746,6 +746,7 @@ public class MapleClient {
|
||||
}
|
||||
int state = rs.getInt("loggedin");
|
||||
if (state == LOGIN_SERVER_TRANSITION) {
|
||||
// Arnah's note: lastlogin is a date-type, in case of login and game servers being of different timezones this becomes broken
|
||||
if (rs.getTimestamp("lastlogin").getTime() + 30000 < System.currentTimeMillis()) {
|
||||
state = LOGIN_NOTLOGGEDIN;
|
||||
updateLoginState(LOGIN_NOTLOGGEDIN);
|
||||
@@ -1293,8 +1294,10 @@ public class MapleClient {
|
||||
}
|
||||
player.unregisterChairBuff();
|
||||
server.getPlayerBuffStorage().addBuffsToStorage(player.getId(), player.getAllBuffs());
|
||||
server.getPlayerBuffStorage().addDiseasesToStorage(player.getId(), player.getAllDiseases());
|
||||
player.setAwayFromWorld(true);
|
||||
player.cancelAllBuffs(true);
|
||||
player.cancelAllDebuffs();
|
||||
player.cancelBuffExpireTask();
|
||||
player.cancelDiseaseExpireTask();
|
||||
player.cancelSkillCooldownTask();
|
||||
|
||||
@@ -52,8 +52,8 @@ public enum MapleDisease {
|
||||
return i;
|
||||
}
|
||||
|
||||
public boolean isFirst() {
|
||||
return first;
|
||||
}
|
||||
public boolean isFirst() {
|
||||
return first;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ package net;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.Calendar;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
@@ -41,6 +43,7 @@ import tools.data.input.GenericSeekableLittleEndianAccessor;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
import client.MapleClient;
|
||||
import constants.ServerConstants;
|
||||
import java.util.Arrays;
|
||||
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import tools.locks.MonitoredReentrantLock;
|
||||
@@ -53,7 +56,8 @@ import server.TimerManager;
|
||||
import tools.locks.MonitoredLockType;
|
||||
|
||||
public class MapleServerHandler extends IoHandlerAdapter {
|
||||
|
||||
private final static Set<Short> ignoredDebugRecvPackets = new HashSet<>(Arrays.asList((short) 167, (short) 197, (short) 89, (short) 91, (short) 41));
|
||||
|
||||
private PacketProcessor processor;
|
||||
private int world = -1, channel = -1;
|
||||
private static final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
|
||||
@@ -151,7 +155,7 @@ public class MapleServerHandler extends IoHandlerAdapter {
|
||||
short packetId = slea.readShort();
|
||||
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
|
||||
|
||||
if(ServerConstants.USE_DEBUG_SHOW_RCVD_PACKET) System.out.println("Received packet id " + packetId);
|
||||
if(ServerConstants.USE_DEBUG_SHOW_RCVD_PACKET && !ignoredDebugRecvPackets.contains(packetId)) System.out.println("Received packet id " + packetId);
|
||||
final MaplePacketHandler packetHandler = processor.getHandler(packetId);
|
||||
if (packetHandler != null && packetHandler.validateState(client)) {
|
||||
try {
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package net.server;
|
||||
|
||||
import client.MapleDisease;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -31,11 +32,13 @@ import tools.locks.MonitoredReentrantLock;
|
||||
/**
|
||||
*
|
||||
* @author Danny//changed to map :3
|
||||
* @author Ronan//debuffs to storage as well
|
||||
*/
|
||||
public class PlayerBuffStorage {
|
||||
private int id = (int) (Math.random() * 100);
|
||||
private final Lock lock = new MonitoredReentrantLock(MonitoredLockType.BUFF_STORAGE, true);
|
||||
private Map<Integer, List<PlayerBuffValueHolder>> buffs = new HashMap<>();
|
||||
private Map<Integer, Map<MapleDisease, Long>> diseases = new HashMap<>();
|
||||
|
||||
public void addBuffsToStorage(int chrid, List<PlayerBuffValueHolder> toStore) {
|
||||
lock.lock();
|
||||
@@ -52,7 +55,25 @@ public class PlayerBuffStorage {
|
||||
return buffs.remove(chrid);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addDiseasesToStorage(int chrid, Map<MapleDisease, Long> toStore) {
|
||||
lock.lock();
|
||||
try {
|
||||
diseases.put(chrid, toStore);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public Map<MapleDisease, Long> getDiseasesFromStorage(int chrid) {
|
||||
lock.lock();
|
||||
try {
|
||||
return diseases.remove(chrid);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -252,11 +252,11 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private void addMesoToDB(int mesos, String sName, int recipientID) {
|
||||
private static void addMesoToDB(int mesos, String sName, int recipientID) {
|
||||
addItemToDB(null, 1, mesos, sName, recipientID);
|
||||
}
|
||||
|
||||
private void addItemToDB(Item item, int quantity, int mesos, String sName, int recipientID) {
|
||||
public static void addItemToDB(Item item, int quantity, int mesos, String sName, int recipientID) {
|
||||
Connection con = null;
|
||||
try {
|
||||
con = DatabaseConnection.getConnection();
|
||||
@@ -344,7 +344,7 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private String getCurrentDate() {
|
||||
private static String getCurrentDate() {
|
||||
String date = "";
|
||||
Calendar cal = Calendar.getInstance();
|
||||
int day = cal.get(Calendar.DATE) - 1; // instant duey ?
|
||||
@@ -373,7 +373,7 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
|
||||
return fee;
|
||||
}
|
||||
|
||||
private void removeItemFromDB(int packageid) {
|
||||
private static void removeItemFromDB(int packageid) {
|
||||
Connection con = null;
|
||||
try {
|
||||
con = DatabaseConnection.getConnection();
|
||||
|
||||
@@ -59,8 +59,10 @@ public class EnterCashShopHandler extends AbstractMaplePacketHandler {
|
||||
|
||||
mc.unregisterChairBuff();
|
||||
Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(mc.getId(), mc.getAllBuffs());
|
||||
Server.getInstance().getPlayerBuffStorage().addDiseasesToStorage(mc.getId(), mc.getAllDiseases());
|
||||
mc.setAwayFromWorld(true);
|
||||
mc.cancelAllBuffs(true);
|
||||
mc.cancelAllDebuffs();
|
||||
mc.cancelBuffExpireTask();
|
||||
mc.cancelDiseaseExpireTask();
|
||||
mc.cancelSkillCooldownTask();
|
||||
|
||||
@@ -68,8 +68,10 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
|
||||
|
||||
chr.unregisterChairBuff();
|
||||
Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(chr.getId(), chr.getAllBuffs());
|
||||
Server.getInstance().getPlayerBuffStorage().addDiseasesToStorage(chr.getId(), chr.getAllDiseases());
|
||||
chr.setAwayFromWorld(true);
|
||||
chr.cancelAllBuffs(true);
|
||||
chr.cancelAllDebuffs();
|
||||
chr.cancelBuffExpireTask();
|
||||
chr.cancelDiseaseExpireTask();
|
||||
chr.cancelSkillCooldownTask();
|
||||
|
||||
@@ -46,6 +46,7 @@ import client.BuddylistEntry;
|
||||
import client.CharacterNameAndId;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.MapleDisease;
|
||||
import client.MapleFamily;
|
||||
import client.SkillFactory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
@@ -54,6 +55,7 @@ import constants.GameConstants;
|
||||
import constants.ServerConstants;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Map;
|
||||
|
||||
public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
|
||||
|
||||
@@ -115,6 +117,11 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
|
||||
player.silentGiveBuffs(timedBuffs);
|
||||
}
|
||||
|
||||
Map<MapleDisease, Long> diseases = server.getPlayerBuffStorage().getDiseasesFromStorage(cid);
|
||||
if (diseases != null) {
|
||||
player.silentApplyDiseases(diseases);
|
||||
}
|
||||
|
||||
c.announce(MaplePacketCreator.getCharInfo(player));
|
||||
if (!player.isHidden()) {
|
||||
player.toggleHide(true);
|
||||
|
||||
@@ -30,6 +30,7 @@ import tools.data.input.SeekableLittleEndianAccessor;
|
||||
* @author Lerk
|
||||
*/
|
||||
public final class ReactorHitHandler extends AbstractMaplePacketHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
//System.out.println(slea); //To see if there are any differences with packets
|
||||
//CD 00 6B 00 00 00 01 00 00 00 03 00 00 00 20 03 F7 03 00 00
|
||||
|
||||
@@ -177,6 +177,10 @@ public class AbstractPlayerInteraction {
|
||||
return getPlayer().getEventInstance();
|
||||
}
|
||||
|
||||
public MapleInventory getInventory(int type) {
|
||||
return getPlayer().getInventory(MapleInventoryType.getByType((byte) type));
|
||||
}
|
||||
|
||||
public MapleInventory getInventory(MapleInventoryType type) {
|
||||
return getPlayer().getInventory(type);
|
||||
}
|
||||
|
||||
@@ -425,6 +425,16 @@ public class EventInstanceManager {
|
||||
rL.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public MapleCharacter getPlayerById(int id) {
|
||||
rL.lock();
|
||||
try {
|
||||
return chars.get(id);
|
||||
}
|
||||
finally {
|
||||
rL.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public List<MapleCharacter> getPlayers() {
|
||||
rL.lock();
|
||||
@@ -1331,6 +1341,15 @@ public class EventInstanceManager {
|
||||
}
|
||||
}
|
||||
|
||||
public final int gridSize() {
|
||||
rL.lock();
|
||||
try {
|
||||
return playerGrid.size();
|
||||
} finally {
|
||||
rL.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public final void gridClear() {
|
||||
wL.lock();
|
||||
try {
|
||||
|
||||
@@ -436,13 +436,8 @@ public class MapleMonster extends AbstractLoadedMapleLife {
|
||||
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;
|
||||
if (holySymbol != null) {
|
||||
if (numExpSharers == 1 && !GMHolySymbol) {
|
||||
personalExp *= 1.0 + (holySymbol.doubleValue() / 500.0);
|
||||
} else {
|
||||
personalExp *= 1.0 + (holySymbol.doubleValue() / 100.0);
|
||||
}
|
||||
personalExp *= 1.0 + (holySymbol.doubleValue() / 100.0);
|
||||
}
|
||||
|
||||
statiLock.lock();
|
||||
|
||||
Reference in New Issue
Block a user