Exemplo n.º 1
0
        private ServerPacket MakeCreatePacket(WorldObject obj)
        {
            BinWriter w = new BinWriter();

            w.Write(0);
            w.Write((uint)0);
            w.Write(2);
            obj.AddCreateObject(w, false, true);
            int count = 1;

            if (obj.ObjectType == OBJECTTYPE.PLAYER)
            {
                PlayerObject plr = obj as PlayerObject;
                count += plr.Inventory.AddCreateInventory(w, false);
            }
            w.Set(0, count);

            ServerPacket pkg = new ServerPacket(SMSG.COMPRESSED_UPDATE_OBJECT);

            byte[] compressed = ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length);
            pkg.Write((int)w.BaseStream.Length);
            pkg.Write(compressed);
            pkg.Finish();
            return(pkg);
        }
Exemplo n.º 2
0
 internal void CreatePlayerObject(bool isClient)
 {
     try {
         // at enter world
         DebugLogger.Logger.Log("I have a feeling... that this is whats causing it to not work.");
         BinWriter w = new BinWriter();
         w.Write((byte)1);
         w.Write((uint)0);
         if (isClient == false)
         {
             w.Write((byte)2);
             Console.WriteLine("DEBUG: 2");
         }
         else
         {
             w.Write((byte)3);
             Console.WriteLine("DEBUG: 3");
         }
         m_player.AddCreateObject(w, true, true);
         BinWriter pkg = new BinWriter();
         pkg.Write((int)w.BaseStream.Length);
         pkg.Write(ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length));
         Send(SMSG.COMPRESSED_UPDATE_OBJECT, pkg);
         m_player.updateTime();
     } catch (Exception exp) {
         DebugLogger.Logger.Log("", exp);
     }
 }
Exemplo n.º 3
0
        static void OnItemVendor(int msgID, BinReader data)
        {
            uint charID = data.ReadUInt32();
            uint itemId = data.ReadUInt32();
            int  price  = data.ReadInt32();

            WorldClient client = WorldServer.GetClientByCharacterID(charID);

            if (client == null)
            {
                return;
            }
            if (client.Player.Money < price)
            {
                Chat.System(client, "You do not have the required funds for this item");
                return;
            }
            DBItem newitem = (DBItem)DBManager.GetDBObject(typeof(DBItem), itemId);

            if (newitem == null)
            {
                Chat.System(client, "Item not found");
                return;
            }

            newitem.Template = (DBItemTemplate)DBManager.GetDBObject(typeof(DBItemTemplate), newitem.TemplateID);
            if (newitem.Template == null)
            {
                Chat.System(client, "Item Template not found");
                return;
            }
            Console.WriteLine("Slot:" + newitem.OwnerSlot);
            if (newitem.OwnerSlot == 0)
            {
                newitem.OwnerSlot = client.Player.Inventory.GetOpenBackpackSlot();
            }
            DBManager.SaveDBObject(newitem);
            ItemObject NewObj = (ItemObject)client.Player.Inventory.CreateItem(newitem);

//			client.Player.MapTile.Map.Enter(NewObj);

            BinWriter w = new BinWriter();

            w.Write(1);
            w.Write((byte)0);
            NewObj.AddCreateObject(w, false, true);

            ServerPacket pkg = new ServerPacket(SMSG.COMPRESSED_UPDATE_OBJECT);

            byte[] compressed = ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length);
            pkg.Write((int)w.BaseStream.Length);
            pkg.Write(compressed);
            pkg.Finish();
            client.Player.MapTile.SendSurrounding(pkg);
            client.Player.Money = client.Player.Money - price;
            client.Player.UpdateData();

//			Chat.System (client, "Buy Item working on Worldserver side");
        }
Exemplo n.º 4
0
        public void Send(BinWriter w)
        {
            ushort len = (ushort)(w.BaseStream.Length - 2);

            len = (ushort)((len >> 8) + ((len & 0xFF) << 8));
            w.Set(0, len);
            Send(w.GetBuffer(), (int)w.BaseStream.Length);
        }
Exemplo n.º 5
0
        public void Send(BinWriter w)
        {
//			DebugLogger.Logger.Log("Sending packet: " + w.ToString());
            ushort len = (ushort)(w.BaseStream.Length - 2);

            len = (ushort)((len >> 8) + ((len & 0xFF) << 8));
            w.Set(0, len);
            Send(w.GetBuffer(), (int)w.BaseStream.Length);
        }
Exemplo n.º 6
0
        public void Send(SMSG msgID, BinWriter data)
        {
            ServerPacket pkg = new ServerPacket(msgID);

            pkg.Write(data.GetBuffer(), 0, (int)data.BaseStream.Length);
            pkg.Finish();
            pkg.AddDestination(m_character.ObjectId);
            WorldServer.Send(pkg);
        }
Exemplo n.º 7
0
 public void Send(SMSG msgID, BinWriter data)
 {
     try {
         ServerPacket pkg = new ServerPacket(msgID);
         pkg.Write(data.GetBuffer(), 0, (int)data.BaseStream.Length);
         pkg.Finish();
         pkg.AddDestination(m_character.ObjectId);
         WorldServer.Send(pkg);
     } catch (Exception exp) {
         DebugLogger.Logger.Log("", exp);
     }
 }
Exemplo n.º 8
0
        public virtual void UpdateRealmList(string Description, string IP, int Users)
        {
            BinWriter w = new BinWriter();

            w.Write(0);
            w.Write(Password);
            w.Write(Description);
            w.Write(IP);
            w.Write(Users);
            w.Set(0, (int)w.BaseStream.Length - 4);
            m_client.Send(w.GetBuffer(), w.BaseStream.Length);
        }
Exemplo n.º 9
0
        public void UpdatePlayerObject(WorldObject obj, bool self, DBCharacter m_character)
        {
            w.Write((byte)1);
            w.Write(0);
            w.Write((byte)0);
            w.Write((byte)2);
            w.Write(obj.GUID);
            w.Write((byte)obj.ObjectType);
            w.Write(0);
            w.Write(0);
            w.WriteVector(obj.Position);
            w.Write(obj.Facing);
            w.Write(obj.WalkSpeed);
            w.Write(obj.RunningSpeed);
            w.Write(obj.RunBackSpeed);
            w.Write(obj.SwimSpeed);
            w.Write(obj.SwimBackSpeed);
            w.Write(obj.TurnRate);
            if (self == true)
            {
                w.Write(1);
            }
            else
            {
                w.Write(0);
            }
            w.Write(1);
            w.Write(0);
            w.Write(0);
            w.Write(0);

            c = 0;

            Add((int)OBJECTFIELDS.GUID, obj.GUID);
            Add((int)OBJECTFIELDS.HIER_TYPE, (long)obj.HierType);
            Add((int)OBJECTFIELDS.SCALE, (float)1.0);



            BinWriter pkg = new BinWriter();

            pkg.Write((int)w.BaseStream.Length);
            pkg.Write(w.GetBuffer());
            Send(SMSG.UPDATE_OBJECT, pkg, m_character);



            /*pkg.Write((int)w.BaseStream.Length);
             * pkg.Write(ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length));
             * Send(SMSG.UPDATE_OBJECT, pkg);*/
        }
Exemplo n.º 10
0
        internal void CreatePlayerObject()
        {
            BinWriter w = new BinWriter();

            w.Write(0);
            m_player.AddCreateObject(w, true, true);
            w.Set(0, m_player.Inventory.AddCreateInventory(w, true) + 1);

            BinWriter pkg = new BinWriter();

            pkg.Write((int)w.BaseStream.Length);
            pkg.Write(ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length));
            Send(SMSG.COMPRESSED_UPDATE_OBJECT, pkg);
        }
        private void UpdateList()
        {
            LastRealmListUpdate = DateTime.Now;
            if (realms.Count > 0)
            {
                ArrayList list = new ArrayList(realms.Values);
                DateTime  now  = DateTime.Now;
                TimeSpan  span;
                foreach (RealmInfo info in list)
                {
                    span = now.Subtract(info.LastUpdate);
                    if (span.TotalSeconds > 30)
                    {
                        realms.Remove(info.IP);
                        realmListDirty = true;
                    }
                }
            }

            if (realmListDirty)
            {
                realmListDirty = false;
                BinWriter w = new BinWriter();
                w.Write((byte)0x10);
                w.Write((short)0);
                w.Write(0);
                w.Write((byte)realms.Count);
                if (realms.Count > 0)
                {
                    IEnumerator e = realms.Values.GetEnumerator();
                    while (e.MoveNext())
                    {
                        //						Console.WriteLine("Realm: ");
                        RealmInfo info = (RealmInfo)e.Current;
                        w.Write(0);
                        w.Write((byte)0);
                        w.Write(info.Description);
                        w.Write(info.IP);
                        w.Write(info.Users);
                        w.Write(0);
                        w.Write((byte)0);
                    }
                    w.Set(1, (short)(w.BaseStream.Length - 3));
                    byte[] newList = new byte[w.BaseStream.Length];
                    Array.Copy(w.GetBuffer(), 0, newList, 0, newList.Length);
                    realmList = newList;
                }
            }
        }
Exemplo n.º 12
0
        internal void CreatePlayerObject()
        {
            try {
                // at enter world
                BinWriter w = new BinWriter();
                w.Write(0);
                w.Write((byte)0);                 //A9 Fix by Phaze
                w.Set(0, m_player.Inventory.AddCreateInventory(w, true) + 1);
                m_player.AddCreateObject(w, true, true);
                BinWriter pkg = new BinWriter();
                pkg.Write((int)w.BaseStream.Length);

                pkg.Write(ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length));
                Send(SMSG.COMPRESSED_UPDATE_OBJECT, pkg);

                m_player.updateTime();
            } catch (Exception exp) {
                DebugLogger.Log("", exp);
            }
        }
        public void realm_proof(BinReader read, RealmListClient client)
        {
            int t;

            byte[] A   = read.ReadBytes(32);
            byte[] kM1 = read.ReadBytes(20);

            byte [] rA = Reverse(A);

            byte [] AB = Concat(A, Reverse(client.B.getBytes(32)));

            SHA1 shaM1 = new SHA1CryptoServiceProvider();

            byte [] U = shaM1.ComputeHash(AB);

            byte [] rU = Reverse(U);

            // SS_Hash
            BigInteger temp1 = client.v.modPow(new BigInteger(rU), new BigInteger(rN));
            BigInteger temp2 = temp1 * new BigInteger(rA);
            BigInteger temp3 = temp2.modPow(new BigInteger(client.rb), new BigInteger(rN));

            byte [] S1 = new byte[16];
            byte [] S2 = new byte[16];
            byte [] S  = temp3.getBytes(32);
            byte [] rS = Reverse(S);

            for (t = 0; t < 16; t++)
            {
                S1[t] = rS[t * 2];
                S2[t] = rS[(t * 2) + 1];
            }

            byte [] hashS1  = shaM1.ComputeHash(S1);
            byte [] hashS2  = shaM1.ComputeHash(S2);
            byte [] SS_Hash = new byte[hashS1.Length + hashS2.Length];
            for (t = 0; t < hashS1.Length; t++)
            {
                SS_Hash[t * 2]       = hashS1[t];
                SS_Hash[(t * 2) + 1] = hashS2[t];
            }

            // cal M1
            byte [] NHash    = shaM1.ComputeHash(N);
            byte [] GHash    = shaM1.ComputeHash(client.G.getBytes());
            byte [] userHash = shaM1.ComputeHash(client.Busername);
            byte [] NG_Hash  = new byte[20];
            for (t = 0; t < 20; t++)
            {
                NG_Hash[t] = (byte)(NHash[t] ^ GHash[t]);
            }
            byte [] Temp = Concat(NG_Hash, userHash);
            Temp = Concat(Temp, client.salt);
            Temp = Concat(Temp, A);
            Temp = Concat(Temp, Reverse(client.B.getBytes(32)));
            Temp = Concat(Temp, SS_Hash);

            byte [] M1 = shaM1.ComputeHash(Temp);

            BinWriter pkg;

            if (!Same(M1, kM1))
            {
                Console.WriteLine("{0} Failed authentication", client.username);

                pkg = new BinWriter();
                pkg.Write((byte)1);
                pkg.Write((byte)3);
                client.Send(pkg.GetBuffer(), 26);
                client.Close("Failed authentication");
                return;
            }

            Console.WriteLine("{0} authenticated", client.username);
            setHash(client, SS_Hash);             // sets session key in db

            // cal M2
            Temp = Concat(A, M1);
            Temp = Concat(Temp, SS_Hash);
            byte [] M2 = shaM1.ComputeHash(Temp);

            pkg = new BinWriter();
            pkg.Write((byte)1);
            pkg.Write((byte)0);
            pkg.Write(M2);
            pkg.Write(new byte[4]);
            client.Send(pkg.GetBuffer(), 26);
        }
        public void realm_challenge(BinReader read, RealmListClient client)
        {
            int       t;
            BinWriter pkg;

            byte[] useless = read.ReadBytes(32);
            int    namelen = read.ReadByte();

            client.Busername = read.ReadBytes(namelen);
            client.username  = System.Text.Encoding.ASCII.GetString(client.Busername);

            getPassword(client);

            if (client.password == null)
            {
                Console.WriteLine("Can not retreive password for: " + client.username);
                pkg = new BinWriter();
                pkg.Write((byte)1);
                pkg.Write((byte)3);
                client.Send(pkg.GetBuffer(), 26);
                client.Close("Accountless");
            }

            byte [] hash = GetUserPasswordHash(client.username, client.password);

            if (hash == null)
            {
                Console.WriteLine("Can not calculate hash for: " + client.username);
                pkg = new BinWriter();
                pkg.Write((byte)1);
                pkg.Write((byte)3);
                client.Send(pkg.GetBuffer(), 26);
                client.Close("Accountless");
            }

            byte [] res = new Byte[hash.Length + client.salt.Length];
            Const.rand.NextBytes(client.salt);

            t = 0;
            foreach (byte s in client.salt)
            {
                res[t++] = s;
            }
            foreach (byte s in hash)
            {
                res[t++] = s;
            }

            SHA1 sha = new SHA1CryptoServiceProvider();

            byte [] hash2 = sha.ComputeHash(res, 0, res.Length);
            byte [] x     = Reverse(hash2);

            rN = Reverse(N);
            Const.rand.NextBytes(client.b);

            client.rb = Reverse(client.b);

            BigInteger bi  = new BigInteger(x);
            BigInteger bi2 = new BigInteger(rN);

            client.G = new BigInteger(new byte[] { 7 });
            client.v = client.G.modPow(bi, bi2);

            client.K = new BigInteger(new Byte[] { 3 });
            BigInteger temp1 = client.K * client.v;
            BigInteger temp2 = client.G.modPow(new BigInteger(client.rb), new BigInteger(rN));
            BigInteger temp3 = temp1 + temp2;

            client.B = temp3 % new BigInteger(rN);

            pkg = new BinWriter();
            pkg.Write((byte)0);
            pkg.Write((byte)0);
            pkg.Write((byte)0);
            pkg.Write(Reverse(client.B.getBytes(32)));
            pkg.Write((byte)1);
            pkg.Write((byte)7);
            pkg.Write((byte)32);
            pkg.Write(N);
            pkg.Write(client.salt);
            pkg.Write((byte[])new byte[16]);

            client.Send(pkg.GetBuffer(), 118);
        }
Exemplo n.º 15
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="obj">Object to create for the players on this maptile</param>
 /// <param name="objCreationPkg">creation packet of obj</param>
 /// <returns>Returns true if there was any players to send objCreationPkg to</returns>
 internal bool CreateObject(WorldObject obj, ServerPacket objCreationPkg)
 {
     if (obj.ObjectType == OBJECTTYPE.PLAYER)
     {
         // we might want to change this incase there would be alot
         // of objects on a single maptile cause it could possibly
         // overgo the packet size limit (which is 0xFFFF or less, not sure)
         // and only send one at a time or X at a time. Hopefully we
         // won't have to since it's compressed...
         bool      ret = false;
         BinWriter w   = new BinWriter();
         w.Write(0);
         int objcount = 0;
         for (int i = 0; i < (int)OBJECTTYPE.PLAYER; i++)
         {
             if (m_objects[i].Count > 0)
             {
                 objcount += m_objects[i].Count;
                 foreach (WorldObject anObject in m_objects[i].Values)
                 {
                     anObject.AddCreateObject(w, false, true);
                 }
             }
         }
         if (m_objects[(int)OBJECTTYPE.PLAYER].Count > 0)
         {
             ret       = true;
             objcount += m_objects[(int)OBJECTTYPE.PLAYER].Count;
             foreach (PlayerObject plr in m_objects[(int)OBJECTTYPE.PLAYER].Values)
             {
                 objCreationPkg.AddDestination(plr.CharacterID);
                 plr.AddCreateObject(w, false, true);
                 objcount += plr.Inventory.AddCreateInventory(w, false);
             }
         }
         for (int i = ((int)OBJECTTYPE.PLAYER) + 1; i < (int)OBJECTTYPE.MAX; i++)
         {
             if (m_objects[i].Count > 0)
             {
                 objcount += m_objects[i].Count;
                 foreach (WorldObject anObject in m_objects[i].Values)
                 {
                     anObject.AddCreateObject(w, false, true);
                 }
             }
         }
         if (objcount > 0)
         {
             w.Set(0, objcount);
             ServerPacket pkg        = new ServerPacket(SMSG.COMPRESSED_UPDATE_OBJECT);
             byte[]       compressed = ZLib.Compress(w.GetBuffer(), 0, (int)w.BaseStream.Length);
             pkg.Write((int)w.BaseStream.Length);
             pkg.Write(compressed);
             pkg.Finish();
             pkg.AddDestination((obj as PlayerObject).CharacterID);
             WorldServer.Send(pkg);
         }
         return(ret);
     }
     else
     {
         if (m_objects[(int)OBJECTTYPE.PLAYER].Count > 0)
         {
             foreach (PlayerObject plr in m_objects[(int)OBJECTTYPE.PLAYER].Values)
             {
                 objCreationPkg.AddDestination(plr.CharacterID);
             }
             return(true);
         }
         return(false);
     }
 }