Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/Config.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/Config.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/Config.java (working copy) @@ -328,6 +328,7 @@ /** Deep Blue Mobs' Drop Rules Enabled */ public static final boolean DEEPBLUE_DROP_RULES; public static final int UNSTUCK_INTERVAL; + public static final int CHAR_DELETE_TIME; // telnet enabled public static final boolean IS_TELNET_ENABLED; @@ -523,6 +524,7 @@ STARTING_ADENA = Integer.parseInt(otherSettings.getProperty("StartingAdena", "100")); UNSTUCK_INTERVAL = Integer.parseInt(otherSettings.getProperty("UnstuckInterval", "300")); + CHAR_DELETE_TIME = Integer.parseInt(otherSettings.getProperty("CharDeleteTime", "5")); } catch (NullPointerException e) { e.printStackTrace(); Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ClientThread.java (working copy) @@ -146,7 +146,41 @@ clan.removeClanMember(cha.getName()); } - public void deleteChar(int charslot) throws Exception + /** + * Marks char as deleted, sets deletettime field + * @param charslot + */ + public void markDeleted(int charslot) + { + int objid = getObjectIdForSlot(charslot); + if (objid < 0) + return; + + java.sql.Connection con = null; + try + { + con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("UPDATE characters SET deletetime = ? WHERE obj_Id=?"); + statement.setLong(1, System.currentTimeMillis()+(60000*60*24*Config.CHAR_DELETE_TIME)); + statement.setInt(2, objid); + statement.execute(); + statement.close(); + } + catch (Exception e) + { + _log.warning("Error while marking char as deleted: " + e); + } + finally + { + try { con.close(); } catch (Exception e) {} + } + } + + /** + * Delete char + * @param objid + */ + public void deleteChar(int objid) { //have to make sure active character must be nulled if (getActiveChar() != null) @@ -156,7 +190,6 @@ _activeChar = null; } - int objid = getObjectIdForSlot(charslot); if (objid < 0) return; Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/CharacterDelete.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/CharacterDelete.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/CharacterDelete.java (working copy) @@ -55,7 +55,7 @@ try { - getClient().deleteChar(_charSlot); + getClient().markDeleted(_charSlot); } catch (Exception e) { Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/L2PcInstance.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/L2PcInstance.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/L2PcInstance.java (working copy) @@ -296,7 +296,7 @@ private int _accessLevel; private boolean _messageRefusal = false; // message refusal mode - private boolean _isInGmlist = false; // show gm gm-li + private boolean _isInGmlist = false; // show in gm list public boolean _exploring = false; @@ -4358,6 +4358,13 @@ // Calculate Henna modifiers of this L2PcInstance recalcHennaStats(); + /* + HennaInfo hi = new HennaInfo(this); + sendPacket(hi); + + UserInfo ui = new UserInfo(this); + sendPacket(ui); + */ } /** @@ -5434,7 +5441,7 @@ out.writeObject(getSaveList()); // Write the entire pathNodeMap of Positions out.flush(); // Always flush the output. out.close(); // And close the stream. - sendPacket(SystemMessage.sendString("Path Node table saved to: L2J/pathnode/"+fileName+".bin")); + sendPacket(SystemMessage.sendString("Path Node table saved to: pathnode/"+fileName+".bin")); } catch (Exception e) { Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java (working copy) @@ -113,10 +113,26 @@ { return _deleteTimer; } - public void setDeleteTimer(int deleteTimer) + + public void setDeleteTimer(long deleteTimer) { - _deleteTimer = deleteTimer; + long currentTimestamp = System.currentTimeMillis(); + int estimated = 0; + + if(currentTimestamp < deleteTimer && deleteTimer > 0) // still alive :P + { + estimated = Math.abs((int)(deleteTimer - currentTimestamp)/1000); + } + else if(currentTimestamp > deleteTimer && deleteTimer > 0) // w00t, time to kill tat fuggin char + { + _deleteTimer = -1; + //System.out.println("Char deletion time arrived, bye bye!"); + } + + //System.out.println("Char deletion infoz, estimated: "+ estimated +" delete timer: "+deleteTimer+" current timestamp: "+currentTimestamp); + _deleteTimer = (estimated); } + public long getLastAccess() { return _lastAccess; Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java (working copy) @@ -112,6 +112,9 @@ import net.sf.l2j.gameserver.handler.usercommandhandlers.Loc; import net.sf.l2j.gameserver.handler.usercommandhandlers.Time; import net.sf.l2j.gameserver.handler.voicedcommandhandlers.kill; +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.movement; +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.set; +import net.sf.l2j.gameserver.handler.voicedcommandhandlers.castle; import net.sf.l2j.gameserver.idfactory.IdFactory; import net.sf.l2j.gameserver.lib.JBForth; import net.sf.l2j.gameserver.model.AutoChatHandler; @@ -418,6 +421,9 @@ _voicedCommandHandler = VoicedCommandHandler.getInstance(); _voicedCommandHandler.registerVoicedCommandHandler(new kill()); + _voicedCommandHandler.registerVoicedCommandHandler(new set()); + _voicedCommandHandler.registerVoicedCommandHandler(new castle()); + _voicedCommandHandler.registerVoicedCommandHandler(new movement()); _log.config("VoicedCommandHandler: Loaded " + _voicedCommandHandler.size() + " handlers."); _gmList = GmListTable.getInstance(); Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/serverpackets/CharSelectInfo.java =================================================================== --- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/serverpackets/CharSelectInfo.java (revision 1184) +++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/serverpackets/CharSelectInfo.java (working copy) @@ -188,7 +188,9 @@ while (charList.next())// fills the package { charInfopackage = restoreChar(charList); - characterList.add(charInfopackage); + + if(charInfopackage != null) + characterList.add(charInfopackage); } charList.close(); @@ -233,7 +235,7 @@ charInfopackage.setRace(chardata.getInt("race")); charInfopackage.setClassId(chardata.getInt("classid")); - charInfopackage.setDeleteTimer(chardata.getInt("deletetime")); + charInfopackage.setDeleteTimer(chardata.getLong("deletetime")); charInfopackage.setLastAccess(chardata.getLong("lastAccess")); } catch (Exception e) @@ -241,6 +243,12 @@ _log.log(Level.INFO, "", e); } + if(charInfopackage.getDeleteTimer() == -1) + { + getClient().deleteChar(charInfopackage.getObjectId()); + return null; + } + return charInfopackage; }