Example #1
0
        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);
        }
Example #2
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);
        }