הגיעו אל - net\sf\odinms\net\channel\handler
הוסיפו RegisterPinHandler.java
הקוד:
קוד:
package net.sf.odinms.net.channel.handler;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.net.login.handler.AfterLoginHandler;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
import net.sf.odinms.client.MapleClient;
import org.slf4j.LoggerFactory;
/*
* @author Rob
*/
public class RegisterPinHandler extends AbstractMaplePacketHandler {
private static org.slf4j.Logger log = LoggerFactory.getLogger(AfterLoginHandler.class);
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
byte c2 = slea.readByte();
if (c2 == 0) {
c.updateLoginState(MapleClient.LOGIN_NOTLOGGEDIN);
} else {
String pin = slea.readMapleAsciiString();
if (pin != null) {
c.setPin(pin);
c.getSession().write(MaplePacketCreator.pinRegistered());
c.updateLoginState(MapleClient.LOGIN_NOTLOGGEDIN); //Restart login attempt when pin is assigned
}
}
}
}
כנסו אל - net\sf\odinms\net\login\handler
החליפו את הקובץ שלכם AfterLoginHandler.java
בקוד הבא:
קוד:
package net.sf.odinms.net.login.handler;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.net.login.LoginServer;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AfterLoginHandler extends AbstractMaplePacketHandler {
private static Logger log = LoggerFactory.getLogger(AfterLoginHandler.class);
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
log.info(slea.toString());
byte c2 = slea.readByte();
byte c3 = 5;
try {
c3 = slea.readByte();
} catch(java.lang.ArrayIndexOutOfBoundsException e) {
//To prevent console from being spammed when user cancels pin
}
if (c2 == 1 && c3 == 1) {
// Official requests the pin here
if (c.getPin() == null && LoginServer.getInstance().isAllowPin()) {
c.getSession().write(MaplePacketCreator.registerPin());
} else if (c.getPin() !=null && LoginServer.getInstance().isAllowPin()){
c.getSession().write(MaplePacketCreator.requestPin());
} else if (!LoginServer.getInstance().isAllowPin()) {
c.getSession().write(MaplePacketCreator.pinAccepted());
}
} else if (c2 == 1 && c3 == 0) {
slea.seek(8);
String pin = slea.readMapleAsciiString();
if (pin.equals(c.getPin()) || !LoginServer.getInstance().isAllowPin()) {
c.getSession().write(MaplePacketCreator.pinAccepted());
} else {
c.getSession().write(MaplePacketCreator.requestPinAfterFailure());
}
} else if (c2 == 2 && c3 == 0) {
slea.seek(8);
String pin = slea.readMapleAsciiString();
if (pin.equals(c.getPin())) {
c.getSession().write(MaplePacketCreator.registerPin());
} else {
c.getSession().write(MaplePacketCreator.requestPinAfterFailure());
}
} else if (c2 == 0 && c3 == 5){
//Client is canceling pin, reset the login
c.updateLoginState(MapleClient.LOGIN_NOTLOGGEDIN);
} else {
// abort login attempt
}
}
}
הגיעו אל - net\sf\odinms\client
פתחו את - MapleClient.java
מצאו:
קוד:
private byte greason = 1;
הוסיפו מתחת:
קוד:
private String pin = null;
מצאו:
קוד:
PreparedStatement ps = con.prepareStatement("SELECT id,password,salt,tempban,banned,gm,macs,greason FROM accounts WHERE name = ?");
רק אם השורה הנ"ל כמו שכבתי אם לא דלגו על השלב הבא ופשוט תוסיפו
אחרי greason
החליפו ב-:
קוד:
PreparedStatement ps = con.prepareStatement("SELECT id,password,salt,tempban,banned,gm,macs,greason,pin FROM accounts WHERE name = ?");
מצאו:
קוד:
accId = rs.getInt("id");
הוסיפו מתחת:
קוד:
pin = rs.getString("pin");
מצאו:
קוד:
public void setIdleTask(ScheduledFuture<?> idleTask) {
this.idleTask = idleTask;
}
הוסיפו מתחת-:
קוד:
public void setPin(String pin) {
this.pin = pin;
Connection con = DatabaseConnection.getConnection();
try {
PreparedStatement ps = con.prepareStatement("UPDATE accounts SET pin = ? WHERE id = ?");
ps.setString(1, pin);
ps.setInt(2, accId);
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
log.error("SQL THROW");
}
}
public String getPin() {
return pin;
}
הגיעו ל- net\sf\odinms\tools
כנסו אל- MaplePacketCreator.java
הוסיפו תפונקציה הבאה:
קוד:
public static MaplePacket registerPin() {
return pinOperation((byte) 1);
}
הגיעו אל - net\sf\odinms\net
כנסו ל- PacketProcessor.java
הוסיפו import:
קוד:
import net.sf.odinms.net.channel.handler.RegisterPinHandler;
מצאו:
קוד:
registerHandler(RecvPacketOpcode.PICK_ALL_CHAR, new PickCharHandler());
הוסיפו מתחת:
קוד:
registerHandler(RecvPacketOpcode.REGISTER_PIN, new RegisterPinHandler());
הגיעו אל - net\sf\odinms\net
כנסו ל- RecvPacketOpcode.java
מצאו:
הוסיפו שורה למטה:
הגיעו אל- net\sf\odinms\net\login
כנסו ל-LoginServer.java
מצאו:
הוסיפו מתחת:
קוד:
private boolean pin;
מצאו:
קוד:
maxCharacters = Integer.parseInt(prop.getProperty("net.sf.odinms.login.maxCharacters"));
הוסיפו מתחת:
קוד:
pin = Boolean.parseBoolean(prop.getProperty("net.sf.odinms.login.pin", "false"));
ועכשיו נחזור על אותו דבר שוב מצאו עוד:
קוד:
maxCharacters = Integer.parseInt(prop.getProperty("net.sf.odinms.login.maxCharacters"));
הוסיפו מתחת:
קוד:
pin = Boolean.parseBoolean(prop.getProperty("net.sf.odinms.login.pin", "false"));
מצאו:
קוד:
@Override
public void setUserLimit(int newLimit) {
userLimit = newLimit;
}
הוסיפו מתחת:
קוד:
public boolean isAllowPin() {
return pin;
}
כנסו אל- world.properties בריפאק לשכם והוסיפו את השורה הבאה:
קוד:
# AllowPin
net.sf.odinms.login.pin=true
כאשר יש true יהיו פינים, תשנו ל-false לא יהיו... קפיש?
זהו סיימנו
תהנו.
קוד SQL:
קוד:
ALTER TABLE `accounts` ADD COLUMN `pin` VARCHAR(4) NULL;
עריכה הוסיפו:
אם השתמשתם בסקריפטים של לפני ה"עריכה" אז החליפו לסקריפטים של registerpinhandler ו-afterloginhander
עכשיו הוסיפו ל-maplepacketcreator
קוד:
public static MaplePacket pinRegistered() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PIN_ASSIGNED.getValue());
mplew.write(0);
return mplew.getPacket();
}
הוסיפו ב-SendPacketOpcode