diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..95832e8eb9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/build/
+/dist/
\ No newline at end of file
diff --git a/README.txt b/README.txt
index 8bfacb6e56..cd17c9fe7a 100644
--- a/README.txt
+++ b/README.txt
@@ -4,6 +4,14 @@ Freelance developer: Ronan C. P. Lana
Credits about are to be given to the original MapleSolaxia staff and other colaborators, as some minor
changes/patches on the game were applied by me.
+
+This is a NetBeans 8.0.2 Project. This means that it's easier to install the project via "NetBeans' import
+new project using existing code". Once installed, build this project on your machine and run the server using
+the "launch.bat" application.
+
+
+Note that the project uses the IP 25.15.163.31. Therefore, change the IP wherever it applies to run properly
+the program. Eventually, I will change the settings on this repository to run at localhost (127.0.0.1).
------------------------------------------------
@@ -11,4 +19,4 @@ To run it in Windows 10:
- Install everything normally;
- WampServer 2.0 -> change port 80 at "httpd.conf" to another, as it clashes with a Windows
default port.
- - Run MapleStory client using these: "Windows XP (SP2)" & "16-bit color mode";
\ No newline at end of file
+ - Run MapleStory client using these: "Windows XP (SP2)" & "(8 or 16)-bit color mode";
\ No newline at end of file
diff --git a/mychanges_ptbr.txt b/mychanges_ptbr.txt
index 2c3cd0fb1c..e11fc7a207 100644
--- a/mychanges_ptbr.txt
+++ b/mychanges_ptbr.txt
@@ -76,8 +76,15 @@ Correcao de bug que nao retirava corretamente recursos de projeteis.
Movimentação no ranking agora é contabilizado corretamente.
11 Dezembro 2015,
-Corrigi bug que nao permitia ao tentar aceitar quest remotamente (lightbulb).
+Correcao de bug que nao permitia ao tentar aceitar quest remotamente (lightbulb).
26 --- 29 Dezembro 2015,
Correcao de movimentacao no Ranking, a cada atualizacao do sistema.
-Implementacao e aprimoramento das funcionalidades de ItemSort e SlotMerger do inventario.
\ No newline at end of file
+Implementacao e aprimoramento das funcionalidades de ItemSort e SlotMerger do inventario.
+Correcao de bug em scripts que fazia o jogador ficar preso num mapa de transicao (barco, por ex.).
+
+01 Janeiro 2016,
+Correcao de bug, onde o sistema nao contabilizava corretamente queda de HP em determinados mapas.
+
+03 Janeiro 2016,
+Correcao de bug, onde clientes podiam congelar apos acessar o Cash Shop.
\ No newline at end of file
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
index 7d5d239668..f33c95db5f 100644
--- a/nbproject/private/private.xml
+++ b/nbproject/private/private.xml
@@ -3,7 +3,25 @@
- file:/C:/Nexon/MapleSolaxia/src/net/server/RankingWorker.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/world/World.java
+ file:/C:/Nexon/MapleSolaxia/src/server/MapleStatEffect.java
+ file:/C:/Nexon/MapleSolaxia/src/net/MapleServerHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/client/MapleClient.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/PlayerStorage.java
+ file:/C:/Nexon/MapleSolaxia/src/client/command/Commands.java
+ file:/C:/Nexon/MapleSolaxia/src/client/MapleCharacter.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeMapSpecialHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/tools/MaplePacketCreator.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/EnterMTSHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/Channel.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/EnterCashShopHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeMapHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/StorageHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/PlayerLoggedinHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/net/PacketProcessor.java
+ file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeChannelHandler.java
+ file:/C:/Nexon/MapleSolaxia/src/constants/ServerConstants.java
+ file:/C:/Nexon/MapleSolaxia/src/server/maps/MapleMap.java
diff --git a/scripts/event/Trains.js b/scripts/event/Trains.js
index 9790db5e42..c2a9e5710a 100644
--- a/scripts/event/Trains.js
+++ b/scripts/event/Trains.js
@@ -10,7 +10,7 @@ var Orbis_Station;
var Ludibrium_Station;
//Time Setting is in millisecond
-var closeTime = 60 * 1000; //The time to close the gate
+var closeTime = 50 * 1000; //The time to close the gate
var beginTime = 60 * 1000; //The time to begin the ride
var rideTime = 60 * 1000; //The time that require move to destination
diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java
index 156f1896fc..60dc99be81 100644
--- a/src/client/MapleCharacter.java
+++ b/src/client/MapleCharacter.java
@@ -2971,7 +2971,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
public static MapleCharacter loadCharFromDB(int charid, MapleClient client, boolean channelserver) throws SQLException {
try {
- MapleCharacter ret = new MapleCharacter();
+ MapleCharacter ret = new MapleCharacter();
ret.client = client;
ret.id = charid;
Connection con = DatabaseConnection.getConnection();
@@ -3857,6 +3857,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
ps.executeBatch();
}
} catch (SQLException se) {
+ se.printStackTrace();
}
}
}
@@ -3871,6 +3872,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
ps.execute();
}
} catch (SQLException se) {
+ se.printStackTrace();
}
}
@@ -3959,6 +3961,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
con.setAutoCommit(true);
con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
} catch (SQLException e) {
+ e.printStackTrace();
}
}
}
@@ -4216,7 +4219,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
con.commit();
con.setAutoCommit(true);
- if (cashshop != null) {
+ if (cashshop != null) {
cashshop.save(con);
}
if (storage != null) {
diff --git a/src/client/MapleClient.java b/src/client/MapleClient.java
index 9614e645bd..9d56cff9c0 100644
--- a/src/client/MapleClient.java
+++ b/src/client/MapleClient.java
@@ -506,6 +506,7 @@ public class MapleClient {
rs.close();
}
} catch (SQLException e) {
+ e.printStackTrace();
}
}
if (loginok == 0) {
@@ -755,12 +756,12 @@ public class MapleClient {
}
public final void disconnect(boolean shutdown, boolean cashshop) {//once per MapleClient instance
- if (disconnecting) {
+ if (disconnecting) {
return;
}
disconnecting = true;
if (player != null && player.isLoggedin() && player.getClient() != null) {
- MapleMap map = player.getMap();
+ MapleMap map = player.getMap();
final MapleParty party = player.getParty();
final int idz = player.getId();
final int messengerid = player.getMessenger() == null ? 0 : player.getMessenger().getId();
@@ -771,13 +772,17 @@ public class MapleClient {
final MapleGuildCharacter chrg = player.getMGC();
final MapleGuild guild = player.getGuild();
- removePlayer();
- player.saveCooldowns();
- player.saveToDB();
if (channel == -1 || shutdown) {
+ removePlayer();
+ player.saveCooldowns();
+ player.saveToDB();
+
player = null;
return;
}
+
+ removePlayer();
+
final World worlda = getWorldServer();
try {
if (!cashshop) {
@@ -854,7 +859,10 @@ public class MapleClient {
}
player.logOff();
}
- player = null;
+
+ player.saveCooldowns();
+ player.saveToDB();
+ player = null;
}
}
if (!serverTransition && isLoggedIn()) {
diff --git a/src/client/MonsterBook.java b/src/client/MonsterBook.java
index 176bb29465..2aa3eab80a 100644
--- a/src/client/MonsterBook.java
+++ b/src/client/MonsterBook.java
@@ -56,6 +56,7 @@ public final class MonsterBook {
c.announce(MaplePacketCreator.addCard(false, cardid, 1));
c.announce(MaplePacketCreator.showGainCard());
calculateLevel();
+
c.getPlayer().saveToDB();
}
diff --git a/src/constants/ServerConstants.java b/src/constants/ServerConstants.java
index 9325b07739..f8b6eff693 100644
--- a/src/constants/ServerConstants.java
+++ b/src/constants/ServerConstants.java
@@ -29,6 +29,7 @@ public class ServerConstants {
public static final boolean USE_FAMILY_SYSTEM = false;
public static final boolean USE_DUEY = true;
public static final boolean USE_ITEM_SORT = true;
+ public static final boolean USE_ITEM_SORT_BY_NAME = false; //item sorting based on name rather than id.
public static final boolean USE_PARTY_SEARCH = false;
public static final boolean USE_AUTOBAN = false; //commands the server to detect infractors automatically.
public static final boolean USE_ANOTHER_AUTOASSIGN = true; //based on distributing AP accordingly with higher secondary stat on equipments.
diff --git a/src/net/MapleServerHandler.java b/src/net/MapleServerHandler.java
index 81d9039bfd..7608c777b0 100644
--- a/src/net/MapleServerHandler.java
+++ b/src/net/MapleServerHandler.java
@@ -60,7 +60,9 @@ public class MapleServerHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
- if (cause instanceof IOException || cause instanceof ClassCastException) {
+ System.out.println("disconnect by exception");
+
+ if (cause instanceof IOException || cause instanceof ClassCastException) {
return;
}
MapleClient mc = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
@@ -107,7 +109,7 @@ public class MapleServerHandler extends IoHandlerAdapter {
try {
boolean inCashShop = false;
if (client.getPlayer() != null) {
- inCashShop = client.getPlayer().getCashShop().isOpened();
+ inCashShop = client.getPlayer().getCashShop().isOpened();
}
client.disconnect(false, inCashShop);
} catch (Throwable t) {
diff --git a/src/net/server/Server.java b/src/net/server/Server.java
index 35371417a5..f5a79dfbf9 100644
--- a/src/net/server/Server.java
+++ b/src/net/server/Server.java
@@ -595,6 +595,7 @@ public class Server implements Runnable {
try {
instance.finalize();//FUU I CAN AND IT'S FREE
} catch (Throwable ex) {
+ ex.printStackTrace();
}
instance = null;
System.gc();
diff --git a/src/net/server/channel/handlers/AllianceOperationHandler.java b/src/net/server/channel/handlers/AllianceOperationHandler.java
index 95a56d9571..e4cf6e8d47 100644
--- a/src/net/server/channel/handlers/AllianceOperationHandler.java
+++ b/src/net/server/channel/handlers/AllianceOperationHandler.java
@@ -126,6 +126,7 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
default:
c.getPlayer().dropMessage("Feature not available");
}
+
alliance.saveToDB();
}
diff --git a/src/net/server/channel/handlers/CashOperationHandler.java b/src/net/server/channel/handlers/CashOperationHandler.java
index dac23a5689..69d7b32c0b 100644
--- a/src/net/server/channel/handlers/CashOperationHandler.java
+++ b/src/net/server/channel/handlers/CashOperationHandler.java
@@ -47,6 +47,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
CashShop cs = chr.getCashShop();
+
if (!cs.isOpened()) {
c.announce(MaplePacketCreator.enableActions());
return;
@@ -98,6 +99,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
try {
chr.sendNote(recipient.get("name"), chr.getName() + " has sent you a gift! Go check out the Cash Shop.", (byte) 0); //fame or not
} catch (SQLException ex) {
+ ex.printStackTrace();
}
MapleCharacter receiver = c.getChannelServer().getPlayerStorage().getCharacterByName(recipient.get("name"));
if (receiver != null) receiver.showNote();
@@ -283,6 +285,7 @@ public final class CashOperationHandler extends AbstractMaplePacketHandler {
try {
chr.sendNote(partner.getName(), text, (byte) 1);
} catch (SQLException ex) {
+ ex.printStackTrace();
}
partner.showNote();
}
diff --git a/src/net/server/channel/handlers/ChangeMapHandler.java b/src/net/server/channel/handlers/ChangeMapHandler.java
index 80079620b9..4aaf4bd530 100644
--- a/src/net/server/channel/handlers/ChangeMapHandler.java
+++ b/src/net/server/channel/handlers/ChangeMapHandler.java
@@ -49,7 +49,7 @@ public final class ChangeMapHandler extends AbstractMaplePacketHandler {
}
if (slea.available() == 0) { //Cash Shop :)
if(!chr.getCashShop().isOpened()) {
- c.disconnect(false, false);
+ c.disconnect(false, false);
return;
}
String[] socket = c.getChannelServer().getIP().split(":");
@@ -62,7 +62,7 @@ public final class ChangeMapHandler extends AbstractMaplePacketHandler {
}
} else {
if(chr.getCashShop().isOpened()) {
- c.disconnect(false, false);
+ c.disconnect(false, false);
return;
}
try {
diff --git a/src/net/server/channel/handlers/EnterCashShopHandler.java b/src/net/server/channel/handlers/EnterCashShopHandler.java
index 7e53547ea1..c91c82b86b 100644
--- a/src/net/server/channel/handlers/EnterCashShopHandler.java
+++ b/src/net/server/channel/handlers/EnterCashShopHandler.java
@@ -38,21 +38,25 @@ public class EnterCashShopHandler extends AbstractMaplePacketHandler {
try {
MapleCharacter mc = c.getPlayer();
- if (mc.getCashShop().isOpened()) return;
+ if (mc.getCashShop().isOpened()) {
+ return;
+ }
- Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(mc.getId(), mc.getAllBuffs());
+ Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(mc.getId(), mc.getAllBuffs());
mc.cancelBuffEffects();
mc.cancelExpirationTask();
- c.announce(MaplePacketCreator.openCashShop(c, false));
- mc.saveToDB();
- mc.getCashShop().open(true);
- mc.getMap().removePlayer(mc);
- c.getChannelServer().removePlayer(mc);
-
- c.announce(MaplePacketCreator.showCashInventory(c));
- c.announce(MaplePacketCreator.showGifts(mc.getCashShop().loadGifts()));
- c.announce(MaplePacketCreator.showWishList(mc, false));
- c.announce(MaplePacketCreator.showCash(mc));
+
+ c.announce(MaplePacketCreator.openCashShop(c, false));
+ c.announce(MaplePacketCreator.showCashInventory(c));
+ c.announce(MaplePacketCreator.showGifts(mc.getCashShop().loadGifts()));
+ c.announce(MaplePacketCreator.showWishList(mc, false));
+ c.announce(MaplePacketCreator.showCash(mc));
+
+
+ c.getChannelServer().removePlayer(mc);
+ mc.getMap().removePlayer(mc);
+ mc.getCashShop().open(true);
+ mc.saveToDB();
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/src/net/server/channel/handlers/EnterMTSHandler.java b/src/net/server/channel/handlers/EnterMTSHandler.java
index 19f13af922..06e4a17422 100644
--- a/src/net/server/channel/handlers/EnterMTSHandler.java
+++ b/src/net/server/channel/handlers/EnterMTSHandler.java
@@ -60,10 +60,12 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(chr.getId(), chr.getAllBuffs());
chr.cancelExpirationTask();
chr.saveToDB();
+ System.out.println("STRANGE SAVE TO DB");
chr.getMap().removePlayer(c.getPlayer());
try {
c.announce(MaplePacketCreator.openCashShop(c, true));
} catch (Exception ex) {
+ ex.printStackTrace();
}
chr.getCashShop().open(true);// xD
c.announce(MaplePacketCreator.enableCSUse());
diff --git a/src/net/server/channel/handlers/ItemIdSortHandler.java b/src/net/server/channel/handlers/ItemIdSortHandler.java
index 9576f2ea89..9a367916f3 100644
--- a/src/net/server/channel/handlers/ItemIdSortHandler.java
+++ b/src/net/server/channel/handlers/ItemIdSortHandler.java
@@ -22,7 +22,6 @@
package net.server.channel.handlers;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import constants.ServerConstants;
@@ -32,35 +31,181 @@ import tools.data.input.SeekableLittleEndianAccessor;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Item;
+import client.inventory.Equip;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.inventory.ModifyInventory;
+import server.MapleItemInformationProvider;
/**
*
* @author BubblesDev
*/
-public final class ItemIdSortHandler extends AbstractMaplePacketHandler {
+class PairedQuicksort {
+ /* by RonanLana */
+
+ private int i = 0;
+ private int j = 0;
+ private final ArrayList intersect;
+ MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
+
+ private void PartitionByItemId(int Esq, int Dir, ArrayList- A) {
+ Item x, w;
+
+ i = Esq;
+ j = Dir;
+
+ x = A.get((i + j) / 2);
+ do {
+ while (x.getItemId() > A.get(i).getItemId()) i++;
+ while (x.getItemId() < A.get(j).getItemId()) j--;
+
+ if (i <= j) {
+ w = A.get(i);
+ A.set(i, A.get(j));
+ A.set(j, w);
+
+ i++;
+ j--;
+ }
+ } while (i <= j);
+ }
+
+ private void PartitionByName(int Esq, int Dir, ArrayList
- A) {
+ Item x, w;
+
+ i = Esq;
+ j = Dir;
+
+ x = A.get((i + j) / 2);
+ do {
+ while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(i).getItemId())) > 0) i++;
+ while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(j).getItemId())) < 0) j--;
+
+ if (i <= j) {
+ w = A.get(i);
+ A.set(i, A.get(j));
+ A.set(j, w);
+
+ i++;
+ j--;
+ }
+ } while (i <= j);
+ }
+
+ private void PartitionByQuantity(int Esq, int Dir, ArrayList
- A) {
+ Item x, w;
+
+ i = Esq;
+ j = Dir;
+
+ x = A.get((i + j) / 2);
+ do {
+ while (x.getQuantity() > A.get(i).getQuantity()) i++;
+ while (x.getQuantity() < A.get(j).getQuantity()) j--;
+
+ if (i <= j) {
+ w = A.get(i);
+ A.set(i, A.get(j));
+ A.set(j, w);
+
+ i++;
+ j--;
+ }
+ } while (i <= j);
+ }
+
+ private void PartitionByLevel(int Esq, int Dir, ArrayList
- A) {
+ Equip x, w, eqpI, eqpJ;
+
+ i = Esq;
+ j = Dir;
+
+ x = (Equip)(A.get((i + j) / 2));
+
+ do {
+ eqpI = (Equip)A.get(i);
+ eqpJ = (Equip)A.get(j);
+
+ while (x.getLevel() > eqpI.getLevel()) i++;
+ while (x.getLevel() < eqpJ.getLevel()) j--;
+
+ if (i <= j) {
+ w = (Equip)A.get(i);
+ A.set(i, A.get(j));
+ A.set(j, (Item)w);
+
+ i++;
+ j--;
+ }
+ } while (i <= j);
+ }
+
+ void MapleQuicksort(int Esq, int Dir, ArrayList
- A, int sort) {
+ switch(sort) {
+ case 3:
+ PartitionByLevel(Esq, Dir, A);
+ break;
+
+ case 2:
+ PartitionByName(Esq, Dir, A);
+ break;
+
+ case 1:
+ PartitionByQuantity(Esq, Dir, A);
+ break;
+
+ default:
+ PartitionByItemId(Esq, Dir, A);
+ }
+
+
+ if (Esq < j) MapleQuicksort(Esq, j, A, sort);
+ if (i < Dir) MapleQuicksort(i, Dir, A, sort);
+ }
+
+ public PairedQuicksort(ArrayList
- A, int primarySort, int secondarySort) {
+ intersect = new ArrayList<>();
+
+ MapleQuicksort(0, A.size() - 1, A, primarySort);
+
+ intersect.add(0);
+ for(int ind = 1; ind < A.size(); ind++) {
+ if(A.get(ind - 1).getItemId() != A.get(ind).getItemId()) {
+ intersect.add(ind);
+ }
+ }
+ intersect.add(A.size());
+
+ for(int ind = 0; ind < intersect.size() - 1; ind++) {
+ MapleQuicksort(intersect.get(ind), intersect.get(ind + 1) - 1, A, secondarySort);
+ }
+ }
+}
+
+public final class ItemIdSortHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
- MapleCharacter chr = c.getPlayer();
- chr.getAutobanManager().setTimestamp(4, slea.readInt(), 3);
+ MapleCharacter chr = c.getPlayer();
+ chr.getAutobanManager().setTimestamp(3, slea.readInt(), 3);
byte inventoryType = slea.readByte();
- if(!chr.isGM() || !ServerConstants.USE_ITEM_SORT) {
- c.announce(MaplePacketCreator.enableActions());
- return;
- }
+ if(!ServerConstants.USE_ITEM_SORT) {
+ c.announce(MaplePacketCreator.enableActions());
+ return;
+ }
- if (inventoryType < 1 || inventoryType > 5) {
+ if (inventoryType < 1 || inventoryType > 5) {
c.disconnect(false, false);
return;
}
MapleInventory inventory = chr.getInventory(MapleInventoryType.getByType(inventoryType));
+
ArrayList
- itemarray = new ArrayList<>();
List mods = new ArrayList<>();
+
for (short i = 1; i <= inventory.getSlotLimit(); i++) {
Item item = inventory.getItem(i);
if (item != null) {
@@ -68,19 +213,18 @@ public final class ItemIdSortHandler extends AbstractMaplePacketHandler {
}
}
- Collections.sort(itemarray);
for (Item item : itemarray) {
- inventory.removeItem(item.getPosition());
+ inventory.removeSlot(item.getPosition());
+ mods.add(new ModifyInventory(3, item));
}
+ int invTypeCriteria = (MapleInventoryType.getByType(inventoryType) == MapleInventoryType.EQUIP) ? 3 : 1;
+ int sortCriteria = (ServerConstants.USE_ITEM_SORT_BY_NAME == true) ? 2 : 0;
+ PairedQuicksort pq = new PairedQuicksort(itemarray, sortCriteria, invTypeCriteria);
+
for (Item item : itemarray) {
- //short position = item.getPosition();
inventory.addItem(item);
- if (inventory.getType().equals(MapleInventoryType.EQUIP)) {
- mods.add(new ModifyInventory(3, item));
- mods.add(new ModifyInventory(0, item.copy()));//to prevent crashes
- //mods.add(new ModifyInventory(2, item.copy(), position));
- }
+ mods.add(new ModifyInventory(0, item.copy()));//to prevent crashes
}
itemarray.clear();
c.announce(MaplePacketCreator.modifyInventory(true, mods));
diff --git a/src/net/server/channel/handlers/ItemSortHandler.java b/src/net/server/channel/handlers/ItemSortHandler.java
index 843a63834b..24a53b8470 100644
--- a/src/net/server/channel/handlers/ItemSortHandler.java
+++ b/src/net/server/channel/handlers/ItemSortHandler.java
@@ -28,31 +28,55 @@ import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
import client.MapleCharacter;
import client.MapleClient;
+import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
+import server.MapleItemInformationProvider;
public final class ItemSortHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
- MapleCharacter chr = c.getPlayer();
- chr.getAutobanManager().setTimestamp(2, slea.readInt(), 3);
- MapleInventoryType inventoryType = MapleInventoryType.getByType(slea.readByte());
- if (inventoryType.equals(MapleInventoryType.UNDEFINED) || c.getPlayer().getInventory(inventoryType).isFull()) {
- c.getSession().write(MaplePacketCreator.enableActions());
- return;
- }
- if(ServerConstants.USE_ITEM_SORT == false) {
- c.announce(MaplePacketCreator.enableActions());
- return;
- }
+ MapleCharacter chr = c.getPlayer();
+ chr.getAutobanManager().setTimestamp(2, slea.readInt(), 3);
+ MapleInventoryType inventoryType = MapleInventoryType.getByType(slea.readByte());
+
+ if(!ServerConstants.USE_ITEM_SORT) {
+ c.announce(MaplePacketCreator.enableActions());
+ return;
+ }
- MapleInventory inventory = c.getPlayer().getInventory(inventoryType);
+ MapleInventory inventory = c.getPlayer().getInventory(inventoryType);
+
+ //------------------- RonanLana's SLOT MERGER -----------------
+
+ MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
+ Item srcItem, dstItem;
+
+ for(short dst = 0; dst <= inventory.getSlotLimit(); dst++) {
+ dstItem = inventory.getItem(dst);
+ if(dstItem == null) continue;
+
+ for(short src = (short)(dst + 1); src <= inventory.getSlotLimit(); src++) {
+ srcItem = inventory.getItem(src);
+ if(srcItem == null) continue;
+
+ if(dstItem.getItemId() != srcItem.getItemId()) continue;
+ if(dstItem.getQuantity() == ii.getSlotMax(c, inventory.getItem(dst).getItemId())) break;
+
+ MapleInventoryManipulator.move(c, inventoryType, src, dst);
+ }
+ }
+
+ //------------------------------------------------------------
+
+ inventory = c.getPlayer().getInventory(inventoryType);
boolean sorted = false;
while (!sorted) {
- short freeSlot = inventory.getNextFreeSlot();
- if (freeSlot != -1) {
+ short freeSlot = inventory.getNextFreeSlot();
+
+ if (freeSlot != -1) {
short itemSlot = -1;
for (short i = (short) (freeSlot + 1); i <= inventory.getSlotLimit(); i = (short) (i + 1)) {
if (inventory.getItem(i) != null) {
@@ -69,7 +93,7 @@ public final class ItemSortHandler extends AbstractMaplePacketHandler {
sorted = true;
}
}
- c.getSession().write(MaplePacketCreator.finishedSort(inventoryType.getType()));
- c.getSession().write(MaplePacketCreator.enableActions());
+ c.announce(MaplePacketCreator.finishedSort(inventoryType.getType()));
+ c.announce(MaplePacketCreator.enableActions());
}
}
\ No newline at end of file
diff --git a/src/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/net/server/channel/handlers/PlayerLoggedinHandler.java
index 7a923c66cf..2c7e576118 100644
--- a/src/net/server/channel/handlers/PlayerLoggedinHandler.java
+++ b/src/net/server/channel/handlers/PlayerLoggedinHandler.java
@@ -50,6 +50,7 @@ import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import client.inventory.PetDataFactory;
import constants.GameConstants;
+import java.util.concurrent.ScheduledFuture;
import server.TimerManager;
public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
@@ -76,9 +77,10 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
player.newClient(c);
}
if (player == null) { //If you are still getting null here then please just uninstall the game >.>, we dont need you fucking with the logs
- c.disconnect(true, false);
- return;
+ c.disconnect(true, false);
+ return;
}
+
c.setPlayer(player);
c.setAccID(player.getAccountID());
@@ -104,6 +106,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
c.updateLoginState(MapleClient.LOGIN_LOGGEDIN);
cserv.addPlayer(player);
+
List buffs = server.getPlayerBuffStorage().getBuffsFromStorage(cid);
if (buffs != null) {
player.silentGiveBuffs(buffs);
@@ -159,7 +162,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
player.getMap().addPlayer(player);
World world = server.getWorld(c.getWorld());
world.getPlayerStorage().addPlayer(player);
-
+
int buddyIds[] = player.getBuddylist().getBuddyIds();
world.loggedOn(player.getName(), player.getId(), c.getChannel(), buddyIds);
for (CharacterIdChannelPair onlineBuddy : server.getWorld(c.getWorld()).multiBuddyFind(player.getId(), buddyIds)) {
@@ -206,6 +209,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
}
}
}
+
player.showNote();
if (player.getParty() != null) {
MaplePartyCharacter pchar = player.getMPC();
@@ -253,9 +257,18 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
Server.getInstance().broadcastGMMessage(MaplePacketCreator.earnTitleMessage("GM " + player.getName() + " has logged in"));
}
- if (player.getMap().getHPDec() > 0) {
- player.doHurtHp();
+
+ }
+
+ if (player.getMap().getHPDec() > 0) {
+ final MapleCharacter mc = player;
+
+ ScheduledFuture> hpDecreaseTask = TimerManager.getInstance().schedule(new Runnable() {
+ @Override
+ public void run() {
+ mc.doHurtHp();
}
+ }, 10000);
}
}
}
diff --git a/src/net/server/handlers/login/AfterLoginHandler.java b/src/net/server/handlers/login/AfterLoginHandler.java
index f48d8876a6..acb54d19a8 100644
--- a/src/net/server/handlers/login/AfterLoginHandler.java
+++ b/src/net/server/handlers/login/AfterLoginHandler.java
@@ -30,6 +30,8 @@ public final class AfterLoginHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
+ System.out.println("after login");
+
byte c2 = slea.readByte();
byte c3 = 5;
if (slea.available() > 0) {
diff --git a/src/server/CashShop.java b/src/server/CashShop.java
index d5dfc566e2..73edf5f985 100644
--- a/src/server/CashShop.java
+++ b/src/server/CashShop.java
@@ -175,6 +175,7 @@ public class CashShop {
if (rs != null) rs.close();
if (ps != null) ps.close();
} catch (SQLException ex) {
+ ex.printStackTrace();
}
}
}