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); }
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); } }
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"); }
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); }
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); }
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); }
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); } }
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); }
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);*/ }
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; } } }
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); }
/// <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); } }