Improved Delete Character

Improved the Delete Character feature, now aiming to clean all leftovers
of the character from the DB. Only works with the ENABLE_PIC flag
activated.
This commit is contained in:
ronancpl
2017-06-01 21:46:16 -03:00
parent a6ac40a351
commit fee0aa7e39
52 changed files with 352 additions and 93 deletions

View File

@@ -1,4 +1,4 @@
#Thu, 01 Jun 2017 00:42:50 -0300 #Thu, 01 Jun 2017 21:33:39 -0300
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2= C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=

BIN
dist/MapleSolaxia.jar vendored

Binary file not shown.

View File

@@ -271,4 +271,7 @@ MapleCouponInstaller: ferramenta desenvolvida para coleta de informa
31 Maio 2017, 31 Maio 2017,
Compilada uma nova tabela de EXP para equips no jogo. Compilada uma nova tabela de EXP para equips no jogo.
Adicionado novo sistema de EXP e nivelamento para todos os equipamentos, para além daqueles de tipo Reverse e Timeless. Adicionado novo sistema de EXP e nivelamento para todos os equipamentos, para além daqueles de tipo Reverse e Timeless.
01 Junho 2017,
Consertadas mecânicas principais para deletar character, possivelmente eliminando quaisquer resíduos do mesmo da DB. Requer que ENABLE_PIC esteja ativado para funcionar.

View File

@@ -12,9 +12,18 @@
</editor-bookmarks> </editor-bookmarks>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group> <group>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/AllianceOperationHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/guild/MapleGuild.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/MapleServerHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/guild/MapleAlliance.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/Server.java</file> <file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/Server.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/CouponWorker.java</file> <file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/npc/NPCConversationManager.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/handlers/login/CreateCharHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java</file> <file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/handlers/login/DeleteCharHandler.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleClient.java</file>
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/MaplePacketCreator.java</file>
</group> </group>
</open-files> </open-files>
</project-private> </project-private>

View File

@@ -1524,6 +1524,213 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
private void nextPendingRequest(MapleClient c) {
CharacterNameAndId pendingBuddyRequest = c.getPlayer().getBuddylist().pollPendingRequest();
if (pendingBuddyRequest != null) {
c.announce(MaplePacketCreator.requestBuddylistAdd(pendingBuddyRequest.getId(), c.getPlayer().getId(), pendingBuddyRequest.getName()));
}
}
private void notifyRemoteChannel(MapleClient c, int remoteChannel, int otherCid, BuddyList.BuddyOperation operation) {
MapleCharacter player = c.getPlayer();
if (remoteChannel != -1) {
c.getWorldServer().buddyChanged(otherCid, player.getId(), player.getName(), c.getChannel(), operation);
}
}
public void deleteBuddy(int otherCid) {
BuddyList bl = getBuddylist();
if (bl.containsVisible(otherCid)) {
notifyRemoteChannel(client, client.getWorldServer().find(otherCid), otherCid, BuddyList.BuddyOperation.DELETED);
}
bl.remove(otherCid);
client.announce(MaplePacketCreator.updateBuddylist(getBuddylist().getBuddies()));
nextPendingRequest(client);
}
public static boolean deleteCharFromDB(MapleCharacter player) {
int cid = player.getId(), accId = -1, world = 0;
Connection con = DatabaseConnection.getConnection();
try {
try (PreparedStatement ps = con.prepareStatement("SELECT accountid, world FROM characters WHERE id = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
if(rs.next()) {
accId = rs.getInt("accountid");
world = rs.getInt("world");
}
}
}
try (PreparedStatement ps = con.prepareStatement("SELECT buddyid FROM buddies WHERE characterid = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
while(rs.next()) {
int buddyid = rs.getInt("buddyid");
MapleCharacter buddy = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(buddyid);
if(buddy != null) {
buddy.deleteBuddy(cid);
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM buddies WHERE characterid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("SELECT threadid FROM bbs_threads WHERE postercid = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int tid = rs.getInt("threadid");
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM bbs_replies WHERE threadid = ?")) {
ps2.setInt(1, tid);
ps2.executeUpdate();
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM bbs_threads WHERE postercid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("SELECT id, guildid, guildrank, name, allianceRank FROM characters WHERE id = ? AND accountid = ?")) {
ps.setInt(1, cid);
ps.setInt(2, accId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next() && rs.getInt("guildid") > 0) {
Server.getInstance().deleteGuildCharacter(new MapleGuildCharacter(player, cid, 0, rs.getString("name"), (byte) -1, (byte) -1, 0, rs.getInt("guildrank"), rs.getInt("guildid"), false, rs.getInt("allianceRank")));
}
}
}
if(con.isClosed()) con = DatabaseConnection.getConnection(); //wtf tho
try (PreparedStatement ps = con.prepareStatement("DELETE FROM wishlists WHERE charid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM cooldowns WHERE charid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM area_info WHERE charid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM monsterbook WHERE charid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM characters WHERE id = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM famelog WHERE characterid_to = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("SELECT inventoryitemid, petid FROM inventoryitems WHERE characterid = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int inventoryitemid = rs.getInt("inventoryitemid");
try (PreparedStatement ps2 = con.prepareStatement("SELECT ringid FROM inventoryequipment WHERE inventoryitemid = ?")) {
ps2.setInt(1, inventoryitemid);
try (ResultSet rs2 = ps2.executeQuery()) {
while (rs2.next()) {
int ringid = rs2.getInt("ringid");
if(ringid > -1) {
try (PreparedStatement ps3 = con.prepareStatement("DELETE FROM rings WHERE id = ?")) {
ps3.setInt(1, ringid);
ps3.executeUpdate();
}
}
}
}
}
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM inventoryequipment WHERE inventoryitemid = ?")) {
ps2.setInt(1, inventoryitemid);
ps2.executeUpdate();
}
if(rs.getInt("petid") > -1) {
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM pets WHERE petid = ?")) {
ps2.setInt(1, rs.getInt("petid"));
ps2.executeUpdate();
}
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("SELECT queststatusid FROM queststatus WHERE characterid = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int queststatusid = rs.getInt("queststatusid");
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM medalmaps WHERE queststatusid = ?")) {
ps2.setInt(1, queststatusid);
ps2.executeUpdate();
}
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM questprogress WHERE queststatusid = ?")) {
ps2.setInt(1, queststatusid);
ps2.executeUpdate();
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("SELECT id FROM mts_cart WHERE cid = ?")) {
ps.setInt(1, cid);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int mtsid = rs.getInt("id");
try (PreparedStatement ps2 = con.prepareStatement("DELETE FROM mts_items WHERE id = ?")) {
ps2.setInt(1, mtsid);
ps2.executeUpdate();
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM mts_cart WHERE cid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
String[] toDel = {"famelog", "inventoryitems", "keymap", "queststatus", "savedlocations", "trocklocations", "skillmacros", "skills", "eventstats", "server_queue"};
for (String s : toDel) {
MapleCharacter.deleteWhereCharacterId(con, "DELETE FROM `" + s + "` WHERE characterid = ?", cid);
}
con.close();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
private void deleteWhereCharacterId(Connection con, String sql) throws SQLException { private void deleteWhereCharacterId(Connection con, String sql) throws SQLException {
try (PreparedStatement ps = con.prepareStatement(sql)) { try (PreparedStatement ps = con.prepareStatement(sql)) {

View File

@@ -60,6 +60,7 @@ import net.server.world.World;
import org.apache.mina.core.session.IoSession; import org.apache.mina.core.session.IoSession;
import client.inventory.MapleInventoryType; import client.inventory.MapleInventoryType;
import constants.ServerConstants;
import scripting.event.EventManager; import scripting.event.EventManager;
import scripting.npc.NPCConversationManager; import scripting.npc.NPCConversationManager;
import scripting.npc.NPCScriptManager; import scripting.npc.NPCScriptManager;
@@ -445,6 +446,8 @@ public class MapleClient {
} }
public boolean checkPic(String other) { public boolean checkPic(String other) {
if(!ServerConstants.ENABLE_PIC) return true;
picattempt++; picattempt++;
if (picattempt > 5) { if (picattempt > 5) {
getSession().close(true); getSession().close(true);
@@ -899,50 +902,12 @@ public class MapleClient {
} }
public boolean deleteCharacter(int cid) { public boolean deleteCharacter(int cid) {
Connection con = DatabaseConnection.getConnection(); try {
return MapleCharacter.deleteCharFromDB(MapleCharacter.loadCharFromDB(cid, this, false));
MapleCharacter player = Server.getInstance().getWorld(0).getPlayerStorage().getCharacterById(cid); } catch(SQLException ex) {
if (player != null){ ex.printStackTrace();
player.getClient().disconnect(false, false); return false;
disconnect(false, false); }
return false; //DC both and return, fuck that
}
try {
try (PreparedStatement ps = con.prepareStatement("SELECT id, guildid, guildrank, name, allianceRank FROM characters WHERE id = ? AND accountid = ?")) {
ps.setInt(1, cid);
ps.setInt(2, accId);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) {
return false;
}
if (rs.getInt("guildid") > 0) {
try {
Server.getInstance().deleteGuildCharacter(new MapleGuildCharacter(player, cid, 0, rs.getString("name"), (byte) -1, (byte) -1, 0, rs.getInt("guildrank"), rs.getInt("guildid"), false, rs.getInt("allianceRank")));
} catch (Exception re) {
re.printStackTrace();
return false;
}
}
}
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM wishlists WHERE charid = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM characters WHERE id = ?")) {
ps.setInt(1, cid);
ps.executeUpdate();
}
String[] toDel = {"famelog", "inventoryitems", "keymap", "queststatus", "savedlocations", "skillmacros", "skills", "eventstats"};
for (String s : toDel) {
MapleCharacter.deleteWhereCharacterId(con, "DELETE FROM `" + s + "` WHERE characterid = ?", cid);
}
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
} }
public String getAccountName() { public String getAccountName() {

View File

@@ -26,6 +26,8 @@ import constants.ServerConstants;
import constants.ExpTable; import constants.ExpTable;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.HashMap;
import java.util.Map;
import server.MapleItemInformationProvider; import server.MapleItemInformationProvider;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.Pair; import tools.Pair;
@@ -52,7 +54,7 @@ public class Equip extends Item {
private float itemExp; private float itemExp;
private int ringid = -1; private int ringid = -1;
private boolean wear = false; private boolean wear = false;
private boolean isElemental = false; // timeless or reverse private boolean isUpgradeable, isElemental = false; // timeless or reverse
public Equip(int id, short position) { public Equip(int id, short position) {
this(id, position, 0); this(id, position, 0);
@@ -260,6 +262,8 @@ public class Equip extends Item {
} }
private int getStatModifier(boolean isAttribute) { private int getStatModifier(boolean isAttribute) {
// each set of stat points grants a chance for a bonus stat point upgrade at equip level up.
if(ServerConstants.USE_EQUIPMNT_LVLUP_POWER) { if(ServerConstants.USE_EQUIPMNT_LVLUP_POWER) {
if(isAttribute) return 2; if(isAttribute) return 2;
else return 4; else return 4;
@@ -270,11 +274,42 @@ public class Equip extends Item {
} }
} }
private int randomizeStatUpgrade(int limit) {
Map<Integer, Integer> pool = new HashMap<>();
pool.put(0, 1);
pool.put(1, 1);
for(int i = 2; i <= limit; i++) {
for(int j = 0; j < i; j++) {
pool.put(j, pool.get(j) + 1);
}
pool.put(i, 1);
}
int poolCount = 0;
for(Integer i: pool.values()) {
poolCount += i;
}
int rnd = Randomizer.rand(0, poolCount);
int stat = 0;
for(Integer i: pool.values()) {
if(rnd < i) break;
stat++;
rnd -= i;
}
return(stat);
}
private void getUnitStatUpgrade(List<Pair<String, Integer>> stats, String name, int curStat, boolean isAttribute) { private void getUnitStatUpgrade(List<Pair<String, Integer>> stats, String name, int curStat, boolean isAttribute) {
int maxUpgrade = Randomizer.rand(0, 1 + (curStat / getStatModifier(isAttribute))); isUpgradeable = true;
int maxUpgrade = randomizeStatUpgrade((int)(1 + (curStat / getStatModifier(isAttribute))));
if(maxUpgrade == 0) return; if(maxUpgrade == 0) return;
stats.add(new Pair<>(name, maxUpgrade)); // each 4 stat point grants a bonus stat upgrade on equip level up. stats.add(new Pair<>(name, maxUpgrade));
} }
private void getUnitSlotUpgrade(List<Pair<String, Integer>> stats, String name) { private void getUnitSlotUpgrade(List<Pair<String, Integer>> stats, String name) {
@@ -302,76 +337,103 @@ public class Equip extends Item {
public void gainLevel(MapleClient c) { public void gainLevel(MapleClient c) {
List<Pair<String, Integer>> stats = MapleItemInformationProvider.getInstance().getItemLevelupStats(getItemId(), itemLevel); List<Pair<String, Integer>> stats = MapleItemInformationProvider.getInstance().getItemLevelupStats(getItemId(), itemLevel);
if(stats.isEmpty()) improveDefaultStats(stats); if(!stats.isEmpty()) {
if(ServerConstants.USE_EQUIPMNT_LVLUP_SLOTS) {
if(ServerConstants.USE_EQUIPMNT_LVLUP_SLOTS) { if(vicious > 0) getUnitSlotUpgrade(stats, "incVicious");
getUnitSlotUpgrade(stats, "incVicious"); getUnitSlotUpgrade(stats, "incSlot");
getUnitSlotUpgrade(stats, "incSlot"); }
}
else {
isUpgradeable = false;
do {
improveDefaultStats(stats);
if(ServerConstants.USE_EQUIPMNT_LVLUP_SLOTS) {
if(vicious > 0) getUnitSlotUpgrade(stats, "incVicious");
getUnitSlotUpgrade(stats, "incSlot");
}
} while(stats.isEmpty() && isUpgradeable);
} }
itemLevel++; itemLevel++;
if(ServerConstants.USE_DEBUG) c.getPlayer().dropMessage(6, "'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "' has LEVELED UP to level " + itemLevel + "!"); boolean gotVicious = false, gotSlot = false;
String lvupStr = "'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "' is now level " + itemLevel + "! ";
for (Pair<String, Integer> stat : stats) { for (Pair<String, Integer> stat : stats) {
switch (stat.getLeft()) { switch (stat.getLeft()) {
case "incDEX": case "incDEX":
dex += stat.getRight(); dex += stat.getRight();
lvupStr += "+" + stat.getRight() + "DEX ";
break; break;
case "incSTR": case "incSTR":
str += stat.getRight(); str += stat.getRight();
lvupStr += "+" + stat.getRight() + "STR ";
break; break;
case "incINT": case "incINT":
_int += stat.getRight(); _int += stat.getRight();
lvupStr += "+" + stat.getRight() + "INT ";
break; break;
case "incLUK": case "incLUK":
luk += stat.getRight(); luk += stat.getRight();
lvupStr += "+" + stat.getRight() + "LUK ";
break; break;
case "incMHP": case "incMHP":
hp += stat.getRight(); hp += stat.getRight();
lvupStr += "+" + stat.getRight() + "HP ";
break; break;
case "incMMP": case "incMMP":
mp += stat.getRight(); mp += stat.getRight();
lvupStr += "+" + stat.getRight() + "MP ";
break; break;
case "incPAD": case "incPAD":
watk += stat.getRight(); watk += stat.getRight();
lvupStr += "+" + stat.getRight() + "WATK ";
break; break;
case "incMAD": case "incMAD":
matk += stat.getRight(); matk += stat.getRight();
lvupStr += "+" + stat.getRight() + "MATK ";
break; break;
case "incPDD": case "incPDD":
wdef += stat.getRight(); wdef += stat.getRight();
lvupStr += "+" + stat.getRight() + "WDEF ";
break; break;
case "incMDD": case "incMDD":
mdef += stat.getRight(); mdef += stat.getRight();
lvupStr += "+" + stat.getRight() + "MDEF ";
break; break;
case "incEVA": case "incEVA":
avoid += stat.getRight(); avoid += stat.getRight();
lvupStr += "+" + stat.getRight() + "AVOID ";
break; break;
case "incACC": case "incACC":
acc += stat.getRight(); acc += stat.getRight();
lvupStr += "+" + stat.getRight() + "ACC ";
break; break;
case "incSpeed": case "incSpeed":
speed += stat.getRight(); speed += stat.getRight();
lvupStr += "+" + stat.getRight() + "SPEED ";
break; break;
case "incJump": case "incJump":
jump += stat.getRight(); jump += stat.getRight();
lvupStr += "+" + stat.getRight() + "JUMP ";
break; break;
case "incVicious": case "incVicious":
if(vicious > 0) { vicious -= stat.getRight();
vicious -= stat.getRight(); gotVicious = true;
if(vicious < 0) vicious = 0;
c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
}
break; break;
case "incSlot": case "incSlot":
upgradeSlots += stat.getRight(); upgradeSlots += stat.getRight();
c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!"); gotSlot = true;
break; break;
} }
} }
c.getPlayer().dropMessage(6, lvupStr);
if(gotVicious) c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
if(gotSlot) c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
c.announce(MaplePacketCreator.showEquipmentLevelUp()); c.announce(MaplePacketCreator.showEquipmentLevelUp());
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignEffect(c.getPlayer().getId(), 15)); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignEffect(c.getPlayer().getId(), 15));
c.getPlayer().forceUpdateItem(this); c.getPlayer().forceUpdateItem(this);

View File

@@ -15,7 +15,7 @@ public class ServerConstants {
public static final long PURGING_INTERVAL = 5 * 60 * 1000; public static final long PURGING_INTERVAL = 5 * 60 * 1000;
public static final long RANKING_INTERVAL = 60 * 60 * 1000; //60 minutes, 3600000. public static final long RANKING_INTERVAL = 60 * 60 * 1000; //60 minutes, 3600000.
public static final long COUPON_INTERVAL = 60 * 60 * 1000; //60 minutes, 3600000. public static final long COUPON_INTERVAL = 60 * 60 * 1000; //60 minutes, 3600000.
public static final boolean ENABLE_PIC = false; //Pick true/false to enable or disable Pic. public static final boolean ENABLE_PIC = true; //Pick true/false to enable or disable Pic.
//Ip Configuration //Ip Configuration
public static String HOST; public static String HOST;
@@ -33,6 +33,7 @@ public class ServerConstants {
public static final boolean USE_CUSTOM_KEYSET = true; public static final boolean USE_CUSTOM_KEYSET = true;
public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range. public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range.
public static final boolean USE_DEBUG = true; //Will enable some text prints and new commands in the client oriented for debugging. public static final boolean USE_DEBUG = true; //Will enable some text prints and new commands in the client oriented for debugging.
public static final boolean USE_DEBUG_SHOW_RCVD_PACKETS = false;
public static final boolean USE_MTS = false; public static final boolean USE_MTS = false;
public static final boolean USE_FAMILY_SYSTEM = false; public static final boolean USE_FAMILY_SYSTEM = false;
public static final boolean USE_DUEY = true; public static final boolean USE_DUEY = true;

View File

@@ -131,7 +131,7 @@ public class MapleServerHandler extends IoHandlerAdapter {
short packetId = slea.readShort(); short packetId = slea.readShort();
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY); MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
//System.out.println("Received packet id " + packetId); if(ServerConstants.USE_DEBUG_SHOW_RCVD_PACKETS) System.out.println("Received packet id " + packetId);
final MaplePacketHandler packetHandler = processor.getHandler(packetId); final MaplePacketHandler packetHandler = processor.getHandler(packetId);
if (packetHandler != null && packetHandler.validateState(client)) { if (packetHandler != null && packetHandler.validateState(client)) {
try { try {

View File

@@ -484,6 +484,10 @@ public class Server implements Runnable {
} }
} }
public MapleGuild getGuild(int id, int world) {
return getGuild(id, world, null);
}
public MapleGuild getGuild(int id, int world, MapleCharacter mc) { public MapleGuild getGuild(int id, int world, MapleCharacter mc) {
synchronized (guilds) { synchronized (guilds) {
if (guilds.get(id) != null) { if (guilds.get(id) != null) {

View File

@@ -62,16 +62,8 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
if (c.getPlayer().getGuild().getAllianceId() == 0 || c.getPlayer().getGuildId() < 1 || c.getPlayer().getGuildRank() != 1) { if (c.getPlayer().getGuild().getAllianceId() == 0 || c.getPlayer().getGuildId() < 1 || c.getPlayer().getGuildRank() != 1) {
return; return;
} }
int guildid = c.getPlayer().getGuildId();
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.removeGuildFromAlliance(alliance, guildid, c), -1, -1); MapleAlliance.removeGuildFromAlliance(c.getPlayer().getGuild().getAllianceId(), c.getPlayer().getGuildId(), c.getPlayer().getWorld());
Server.getInstance().removeGuildFromAlliance(alliance.getId(), guildid);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, c), -1, -1);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1);
Server.getInstance().guildMessage(guildid, MaplePacketCreator.disbandAlliance(alliance.getId()));
alliance.dropMessage("[" + c.getPlayer().getGuild().getName() + "] guild has left the union.");
break; break;
} }
case 0x03: // send alliance invite... or at least it would be this way if i could find the right way to call it! case 0x03: // send alliance invite... or at least it would be this way if i could find the right way to call it!
@@ -129,10 +121,10 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
return; return;
} }
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.removeGuildFromAlliance(alliance, guildid, c), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.removeGuildFromAlliance(alliance, guildid, c.getWorld()), -1, -1);
Server.getInstance().removeGuildFromAlliance(alliance.getId(), guildid); Server.getInstance().removeGuildFromAlliance(alliance.getId(), guildid);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, c), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, c.getWorld()), -1, -1);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1);
Server.getInstance().guildMessage(guildid, MaplePacketCreator.disbandAlliance(allianceid)); Server.getInstance().guildMessage(guildid, MaplePacketCreator.disbandAlliance(allianceid));
@@ -189,7 +181,7 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
newLeader.getMGC().setAllianceRank(1); newLeader.getMGC().setAllianceRank(1);
newLeader.saveGuildStatus(); newLeader.saveGuildStatus();
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, newLeader.getClient()), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, newLeader.getWorld()), -1, -1);
alliance.dropMessage("'" + newLeader.getName() + "' has been appointed as the new head of this Alliance."); alliance.dropMessage("'" + newLeader.getName() + "' has been appointed as the new head of this Alliance.");
} }
@@ -200,7 +192,7 @@ public final class AllianceOperationHandler extends AbstractMaplePacketHandler {
chr.getMGC().setAllianceRank(newRank); chr.getMGC().setAllianceRank(newRank);
chr.saveGuildStatus(); chr.saveGuildStatus();
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, chr.getClient()), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, chr.getWorld()), -1, -1);
alliance.dropMessage("'" + chr.getName() + "' has been reassigned as '" + alliance.getRankTitle(newRank) + "' in this Alliance."); alliance.dropMessage("'" + chr.getName() + "' has been reassigned as '" + alliance.getRankTitle(newRank) + "' in this Alliance.");
} }

View File

@@ -192,12 +192,7 @@ public class BuddylistModifyHandler extends AbstractMaplePacketHandler {
nextPendingRequest(c); nextPendingRequest(c);
} else if (mode == 3) { // delete } else if (mode == 3) { // delete
int otherCid = slea.readInt(); int otherCid = slea.readInt();
if (buddylist.containsVisible(otherCid)) { player.deleteBuddy(otherCid);
notifyRemoteChannel(c, c.getWorldServer().find(otherCid), otherCid, BuddyOperation.DELETED);
}
buddylist.remove(otherCid);
c.announce(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies()));
nextPendingRequest(c);
} }
} }

View File

@@ -294,6 +294,19 @@ public class MapleAlliance {
} }
} }
public static void removeGuildFromAlliance(int allianceId, int guildId, int worldId) {
MapleAlliance alliance = Server.getInstance().getAlliance(allianceId);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.removeGuildFromAlliance(alliance, guildId, worldId), -1, -1);
Server.getInstance().removeGuildFromAlliance(alliance.getId(), guildId);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.getGuildAlliances(alliance, worldId), -1, -1);
Server.getInstance().allianceMessage(alliance.getId(), MaplePacketCreator.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1);
Server.getInstance().guildMessage(guildId, MaplePacketCreator.disbandAlliance(alliance.getId()));
alliance.dropMessage("[" + Server.getInstance().getGuild(guildId, worldId) + "] guild has left the union.");
}
public void updateAlliancePackets(MapleCharacter chr) { public void updateAlliancePackets(MapleCharacter chr) {
if (allianceId > 0) { if (allianceId > 0) {
this.broadcastMessage(MaplePacketCreator.updateAllianceInfo(this, chr.getClient())); this.broadcastMessage(MaplePacketCreator.updateAllianceInfo(this, chr.getClient()));

View File

@@ -136,6 +136,7 @@ public class MapleGuild {
public void writeToDB(boolean bDisband) { public void writeToDB(boolean bDisband) {
try { try {
Connection con = DatabaseConnection.getConnection(); Connection con = DatabaseConnection.getConnection();
if (!bDisband) { if (!bDisband) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("UPDATE guilds SET GP = ?, logo = ?, logoColor = ?, logoBG = ?, logoBGColor = ?, "); builder.append("UPDATE guilds SET GP = ?, logo = ?, logoColor = ?, logoBG = ?, logoBGColor = ?, ");
@@ -496,6 +497,13 @@ public class MapleGuild {
} }
public void disbandGuild() { public void disbandGuild() {
if(allianceId > 0) {
MapleAlliance alliance = Server.getInstance().getAlliance(allianceId);
if(alliance.getLeader().getGuildId() != id) MapleAlliance.removeGuildFromAlliance(allianceId, id, world);
else MapleAlliance.disbandAlliance(allianceId);
}
this.writeToDB(true); this.writeToDB(true);
this.broadcast(null, -1, BCOp.DISBAND); this.broadcast(null, -1, BCOp.DISBAND);
} }

View File

@@ -88,7 +88,7 @@ public final class CreateCharHandler extends AbstractMaplePacketHandler {
for (int i = 0; i < items.length; i++){ for (int i = 0; i < items.length; i++){
if (!isLegal(items[i])) { if (!isLegal(items[i])) {
AutobanFactory.PACKET_EDIT.alert(newchar, name + " tried to packet edit in character creation."); AutobanFactory.PACKET_EDIT.alert(newchar, name + " tried to packet edit in character creation.");
FilePrinter.printError(FilePrinter.EXPLOITS + newchar + ".txt", "Tried to packet edit in char creation."); FilePrinter.printError(FilePrinter.EXPLOITS + newchar + ".txt", "Tried to packet edit in char creation.");
c.disconnect(true, false); c.disconnect(true, false);
return; return;
} }

View File

@@ -34,7 +34,7 @@ public final class DeleteCharHandler extends AbstractMaplePacketHandler {
String pic = slea.readMapleAsciiString(); String pic = slea.readMapleAsciiString();
int cid = slea.readInt(); int cid = slea.readInt();
if (c.checkPic(pic)) { if (c.checkPic(pic)) {
FilePrinter.printError(FilePrinter.DELETED_CHARACTERS + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid + "\r\n"); FilePrinter.printError(FilePrinter.DELETED_CHARACTERS + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid + "\r\n");
c.announce(MaplePacketCreator.deleteCharResponse(cid, 0)); c.announce(MaplePacketCreator.deleteCharResponse(cid, 0));
c.deleteCharacter(cid); c.deleteCharacter(cid);
} else { } else {

View File

@@ -16,10 +16,10 @@ public final class RegisterPicHandler extends AbstractMaplePacketHandler {
slea.readByte(); slea.readByte();
int charId = slea.readInt(); int charId = slea.readInt();
String macs = slea.readMapleAsciiString(); String macs = slea.readMapleAsciiString();
String hwid = slea.readMapleAsciiString(); String hwid = slea.readMapleAsciiString();
c.updateMacs(macs); c.updateMacs(macs);
c.updateHWID(hwid); c.updateHWID(hwid);
if (c.hasBannedMac() || c.hasBannedHWID()) { if (c.hasBannedMac() || c.hasBannedHWID()) {
c.getSession().close(true); c.getSession().close(true);

View File

@@ -5944,13 +5944,13 @@ public class MaplePacketCreator {
return mplew.getPacket(); return mplew.getPacket();
} }
public static byte[] getGuildAlliances(MapleAlliance alliance, MapleClient c) { public static byte[] getGuildAlliances(MapleAlliance alliance, int worldId) {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.ALLIANCE_OPERATION.getValue()); mplew.writeShort(SendOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(0x0D); mplew.write(0x0D);
mplew.writeInt(alliance.getGuilds().size()); mplew.writeInt(alliance.getGuilds().size());
for (Integer guild : alliance.getGuilds()) { for (Integer guild : alliance.getGuilds()) {
getGuildInfo(mplew, Server.getInstance().getGuild(guild, c.getWorld(), null)); getGuildInfo(mplew, Server.getInstance().getGuild(guild, worldId, null));
} }
return mplew.getPacket(); return mplew.getPacket();
} }
@@ -6018,7 +6018,7 @@ public class MaplePacketCreator {
return mplew.getPacket(); return mplew.getPacket();
} }
public static byte[] removeGuildFromAlliance(MapleAlliance alliance, int expelledGuild, MapleClient c) { public static byte[] removeGuildFromAlliance(MapleAlliance alliance, int expelledGuild, int worldId) {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.ALLIANCE_OPERATION.getValue()); mplew.writeShort(SendOpcode.ALLIANCE_OPERATION.getValue());
mplew.write(0x10); mplew.write(0x10);
@@ -6034,7 +6034,7 @@ public class MaplePacketCreator {
mplew.writeInt(alliance.getCapacity()); mplew.writeInt(alliance.getCapacity());
mplew.writeMapleAsciiString(alliance.getNotice()); mplew.writeMapleAsciiString(alliance.getNotice());
mplew.writeInt(expelledGuild); mplew.writeInt(expelledGuild);
getGuildInfo(mplew, Server.getInstance().getGuild(expelledGuild, c.getWorld(), null)); getGuildInfo(mplew, Server.getInstance().getGuild(expelledGuild, worldId, null));
mplew.write(0x01); mplew.write(0x01);
return mplew.getPacket(); return mplew.getPacket();
} }