private int HandleSaveCharSave(ConnInfo Conn, List <byte> buf) { TGSSaveCharSaveRequest packet = new TGSSaveCharSaveRequest(); int pos = Marshal.SizeOf(packet); packet = (TGSSaveCharSaveRequest)D2DBS.core.BytesToStruct(buf.ToArray(), Marshal.SizeOf(packet), packet.GetType()); string[] Names = BytesToString(buf.GetRange(pos, buf.Count - pos - packet.datalen)).Split('\0'); string AccountName = Names[0]; string CharName = Names[1]; string GameName = Names[2]; string IPAddr = Names[3]; string ItemLog = Names[4]; string CharVersion = D2DBS.config["char_version"]; byte result = 1; byte[] data = buf.GetRange(buf.Count - packet.datalen, packet.datalen).ToArray(); if (data[0] != 0x55 || data[1] != 0xAA) { D2DBS.log.Write("error", "Invaild charsave `" + CharName + "`(*" + AccountName + ")@" + GameName + " for gs " + Conn.GSId.ToString()); } else { if (D2DBS.charfile.SetCharSave(AccountName, CharName, data) == true) { D2DBS.mysql.Execute("UPDATE LOW_PRIORITY charstat SET `ist` = '" + packet.ist.ToString() + "' WHERE version = '" + CharVersion + "' AND charname = '" + CharName + "'"); if (ItemLog.Length > 0) { D2DBS.mysql.Execute("INSERT DELAYED INTO itemrecord (`date`,`version`,`game`,`charname`,`accname`,`ipaddr`,`itemchange`,`istchange`) VALUES (UNIX_TIMESTAMP(), '" + CharVersion + "', '" + D2DBS.mysql.Escape(GameName) + "', '" + CharName + "', '" + AccountName + "', '" + IPAddr + "', '" + D2DBS.mysql.Escape(ItemLog) + "','" + packet.changedist.ToString() + "')"); } result = 0; D2DBS.log.Write("info", "Saved charsave `" + CharName + "`(*" + AccountName + ") for gs " + Conn.GSId.ToString()); } else { D2DBS.log.Write("info", "Failed to saved charsave `" + CharName + "`(*" + AccountName + ") for gs " + Conn.GSId.ToString()); } } TDBSSaveDataReply rpacket = new TDBSSaveDataReply(); byte[] rawcharname = StringToChars(CharName); rpacket.h.seqno = packet.h.seqno; rpacket.h.type = (byte)EPacketType.DBSSaveDataReply; rpacket.h.size = (short)(Marshal.SizeOf(rpacket) + rawcharname.Length); rpacket.datatype = 1; rpacket.result = result; lock (Conn.StreamLocker) { Conn.NetWriter.Write(D2DBS.core.StructToBytes(rpacket)); Conn.NetWriter.Write(rawcharname); Conn.NetWriter.Flush(); } return(0); }
private int HandleSaveCharInfo(ConnInfo Conn, List <byte> buf) { TGSSaveCharInfoRequest packet = new TGSSaveCharInfoRequest(); int pos = Marshal.SizeOf(packet); packet = (TGSSaveCharInfoRequest)D2DBS.core.BytesToStruct(buf.ToArray(), Marshal.SizeOf(packet), packet.GetType()); string[] Names = BytesToString(buf.GetRange(pos, buf.Count - pos - packet.datalen - 1)).Split('\0'); string AccountName = Names[0]; string CharName = Names[1]; string CharVersion = D2DBS.config["char_version"]; byte[] data = buf.GetRange(buf.Count - packet.datalen, packet.datalen).ToArray(); TCharInfo CharInfo = (TCharInfo)D2DBS.core.BytesToStruct(data, typeof(TCharInfo)); TDBSSaveDataReply rpacket = new TDBSSaveDataReply(); byte[] rawcharname = StringToChars(CharName); rpacket.h.seqno = packet.h.seqno; rpacket.h.type = (byte)EPacketType.DBSSaveDataReply; rpacket.h.size = (short)(Marshal.SizeOf(rpacket) + rawcharname.Length); rpacket.datatype = 2; if (D2DBS.charfile.SetCharInfo(AccountName, CharName, CharInfo) == true) { D2DBS.mysql.Execute("INSERT DELAYED INTO `charstat` (`version`, `charname`, `accname`, `charclass`, `level`, `ist`, `lastupdate`) SELECT '" + CharVersion + "', '" + CharName + "', '" + AccountName + "', '" + CharInfo.summary.charclass.ToString() + "', '" + CharInfo.summary.charlevel.ToString() + "', '0', UNIX_TIMESTAMP() FROM `charstat` WHERE NOT EXISTS (SELECT `charname` FROM `charstat` WHERE `version` = '" + CharVersion + "' `charname` = '" + CharName + "') LIMIT 1"); D2DBS.mysql.Execute("UPDATE LOW_PRIORITY `charstat` SET `accname` = '" + AccountName + "', `charclass` = '" + CharInfo.summary.charclass.ToString() + "', `level` = '" + CharInfo.summary.charlevel.ToString() + "', `lastupdate` = UNIX_TIMESTAMP() WHERE version = '" + CharVersion + "' AND charname = '" + CharName + "'"); rpacket.result = 0; D2DBS.log.Write("info", "Saved charinfo `" + CharName + "`(*" + AccountName + ") for gs " + Conn.GSId.ToString()); } else { rpacket.result = 1; D2DBS.log.Write("info", "Failed to saved charinfo `" + CharName + "`(*" + AccountName + ") for gs " + Conn.GSId.ToString()); } lock (Conn.StreamLocker) { Conn.NetWriter.Write(D2DBS.core.StructToBytes(rpacket)); Conn.NetWriter.Write(rawcharname); Conn.NetWriter.Flush(); } return(0); }