Cash Shop patch + new features

Cash shop fix, new item sorting features, minor patches.
This commit is contained in:
ronancpl
2016-01-03 11:13:07 -02:00
parent 7b4fcf7861
commit 7e32e5a762
21 changed files with 312 additions and 67 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build/
/dist/

View File

@@ -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";
- Run MapleStory client using these: "Windows XP (SP2)" & "(8 or 16)-bit color mode";

View File

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

View File

@@ -3,7 +3,25 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/RankingWorker.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/world/World.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/server/MapleStatEffect.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/MapleServerHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/MapleClient.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/PlayerStorage.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/command/Commands.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/client/MapleCharacter.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeMapSpecialHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/tools/MaplePacketCreator.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/EnterMTSHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/Channel.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/EnterCashShopHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeMapHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/StorageHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/PlayerLoggedinHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/PacketProcessor.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/net/server/channel/handlers/ChangeChannelHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/constants/ServerConstants.java</file>
<file>file:/C:/Nexon/MapleSolaxia/src/server/maps/MapleMap.java</file>
</group>
</open-files>
</project-private>

View File

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

View File

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

View File

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

View File

@@ -56,6 +56,7 @@ public final class MonsterBook {
c.announce(MaplePacketCreator.addCard(false, cardid, 1));
c.announce(MaplePacketCreator.showGainCard());
calculateLevel();
c.getPlayer().saveToDB();
}

View File

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

View File

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

View File

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

View File

@@ -126,6 +126,7 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
default:
c.getPlayer().dropMessage("Feature not available");
}
alliance.saveToDB();
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<Integer> intersect;
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
private void PartitionByItemId(int Esq, int Dir, ArrayList<Item> 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<Item> 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<Item> 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<Item> 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<Item> 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<Item> 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<Item> itemarray = new ArrayList<>();
List<ModifyInventory> 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));

View File

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

View File

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

View File

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

View File

@@ -175,6 +175,7 @@ public class CashShop {
if (rs != null) rs.close();
if (ps != null) ps.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}