public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_Corpses.CorpseObject updateObject) { checked { packet.AddInt8((byte)updateType); packet.AddPackGUID(updateObject.GUID); if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT) { packet.AddInt8(7); packet.AddInt8(88); packet.AddSingle(updateObject.positionX); packet.AddSingle(updateObject.positionY); packet.AddSingle(updateObject.positionZ); packet.AddSingle(updateObject.orientation); packet.AddUInt64(updateObject.GUID); } if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT || updateType == ObjectUpdateType.UPDATETYPE_VALUES) { int updateCount = 0; int num = UpdateMask.Count - 1; for (int j = 0; j <= num; j++) { if (UpdateMask.Get(j)) { updateCount = j; } } packet.AddInt8((byte)(checked (updateCount + 32) / 32)); packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4); int num2 = UpdateMask.Count - 1; for (int i = 0; i <= num2; i++) { if (UpdateMask.Get(i)) { if (UpdateData[i] is uint) { packet.AddUInt32(Conversions.ToUInteger(UpdateData[i])); } else if (UpdateData[i] is float) { packet.AddSingle(Conversions.ToSingle(UpdateData[i])); } else { packet.AddInt32(Conversions.ToInteger(UpdateData[i])); } } } UpdateMask.SetAll(value: false); } if (packet is UpdatePacketClass @class) { @class.UpdatesCount++; } } }
public void LoadSpawns(byte TileX, byte TileY, uint TileMap, uint TileInstance) { checked { float MinX = (32 - TileX) * WorldServiceLocator._Global_Constants.SIZE; float MaxX = (32 - (TileX + 1)) * WorldServiceLocator._Global_Constants.SIZE; float MinY = (32 - TileY) * WorldServiceLocator._Global_Constants.SIZE; float MaxY = (32 - (TileY + 1)) * WorldServiceLocator._Global_Constants.SIZE; if (MinX > MaxX) { float tmpSng2 = MinX; MinX = MaxX; MaxX = tmpSng2; } if (MinY > MaxY) { float tmpSng = MinY; MinY = MaxY; MaxY = tmpSng; } ulong InstanceGuidAdd = 0uL; if (TileInstance > 0L) { InstanceGuidAdd = Convert.ToUInt64(decimal.Add(new decimal(1000000L), decimal.Multiply(new decimal(TileInstance - 1L), new decimal(100000L)))); } DataTable MysqlQuery = new DataTable(); WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid WHERE map={TileMap} AND position_X BETWEEN '{MinX}' AND '{MaxX}' AND position_Y BETWEEN '{MinY}' AND '{MaxY}';", ref MysqlQuery); IEnumerator enumerator = default; try { enumerator = MysqlQuery.Rows.GetEnumerator(); while (enumerator.MoveNext()) { DataRow row = (DataRow)enumerator.Current; if (WorldServiceLocator._WorldServer.WORLD_CREATUREs.ContainsKey(Convert.ToUInt64(decimal.Add(decimal.Add(new decimal(row.As <long>("guid")), new decimal(InstanceGuidAdd)), new decimal(WorldServiceLocator._Global_Constants.GUID_UNIT))))) { continue; } try { WS_Creatures.CreatureObject tmpCr = new WS_Creatures.CreatureObject(Convert.ToUInt64(decimal.Add(new decimal(row.As <long>("guid")), new decimal(InstanceGuidAdd))), row); if (tmpCr.GameEvent == 0) { tmpCr.instance = TileInstance; tmpCr.AddToWorld(); } } catch (Exception ex5) { ProjectData.SetProjectError(ex5); Exception ex4 = ex5; WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "Error when creating creature [{0}].{1}{2}", row["id"], Environment.NewLine, ex4.ToString()); ProjectData.ClearProjectError(); } } } finally { if (enumerator is IDisposable) { (enumerator as IDisposable).Dispose(); } } MysqlQuery.Clear(); WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid WHERE map={TileMap} AND spawntimesecs>=0 AND position_X BETWEEN '{MinX}' AND '{MaxX}' AND position_Y BETWEEN '{MinY}' AND '{MaxY}';", ref MysqlQuery); IEnumerator enumerator2 = default; try { enumerator2 = MysqlQuery.Rows.GetEnumerator(); while (enumerator2.MoveNext()) { DataRow row = (DataRow)enumerator2.Current; if (WorldServiceLocator._WorldServer.WORLD_GAMEOBJECTs.ContainsKey(row.As <ulong>("guid") + InstanceGuidAdd + WorldServiceLocator._Global_Constants.GUID_GAMEOBJECT) || WorldServiceLocator._WorldServer.WORLD_GAMEOBJECTs.ContainsKey(row.As <ulong>("guid") + InstanceGuidAdd + WorldServiceLocator._Global_Constants.GUID_TRANSPORT)) { continue; } try { WS_GameObjects.GameObjectObject tmpGo = new WS_GameObjects.GameObjectObject(row.As <ulong>("guid") + InstanceGuidAdd, row); if (tmpGo.GameEvent == 0) { tmpGo.instance = TileInstance; tmpGo.AddToWorld(); } } catch (Exception ex6) { ProjectData.SetProjectError(ex6); Exception ex3 = ex6; WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "Error when creating gameobject [{0}].{1}{2}", row["id"], Environment.NewLine, ex3.ToString()); ProjectData.ClearProjectError(); } } } finally { if (enumerator2 is IDisposable) { (enumerator2 as IDisposable).Dispose(); } } MysqlQuery.Clear(); WorldServiceLocator._WorldServer.CharacterDatabase.Query(string.Format("SELECT * FROM corpse WHERE map={0} AND instance={5} AND position_x BETWEEN '{1}' AND '{2}' AND position_y BETWEEN '{3}' AND '{4}';", TileMap, MinX, MaxX, MinY, MaxY, TileInstance), ref MysqlQuery); IEnumerator enumerator3 = default; try { enumerator3 = MysqlQuery.Rows.GetEnumerator(); while (enumerator3.MoveNext()) { DataRow InfoRow = (DataRow)enumerator3.Current; if (!WorldServiceLocator._WorldServer.WORLD_CORPSEOBJECTs.ContainsKey(Conversions.ToULong(InfoRow["guid"]) + WorldServiceLocator._Global_Constants.GUID_CORPSE)) { try { WS_Corpses.CorpseObject tmpCorpse = new WS_Corpses.CorpseObject(Conversions.ToULong(InfoRow["guid"]), InfoRow) { instance = TileInstance }; tmpCorpse.AddToWorld(); } catch (Exception ex7) { ProjectData.SetProjectError(ex7); Exception ex2 = ex7; WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "Error when creating corpse [{0}].{1}{2}", InfoRow["guid"], Environment.NewLine, ex2.ToString()); ProjectData.ClearProjectError(); } } } } finally { if (enumerator3 is IDisposable) { (enumerator3 as IDisposable).Dispose(); } } try { WorldServiceLocator._WorldServer.WORLD_TRANSPORTs_Lock.AcquireReaderLock(1000); foreach (KeyValuePair <ulong, WS_Transports.TransportObject> Transport in WorldServiceLocator._WorldServer.WORLD_TRANSPORTs) { try { if (Transport.Value.MapID == TileMap && Transport.Value.positionX >= MinX && Transport.Value.positionX <= MaxX && Transport.Value.positionY >= MinY && Transport.Value.positionY <= MaxY) { if (!Maps[TileMap].Tiles[TileX, TileY].GameObjectsHere.Contains(Transport.Value.GUID)) { Maps[TileMap].Tiles[TileX, TileY].GameObjectsHere.Add(Transport.Value.GUID); } Transport.Value.NotifyEnter(); } } catch (Exception ex8) { ProjectData.SetProjectError(ex8); Exception ex = ex8; WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "Error when creating transport [{0}].{1}{2}", Transport.Key - WorldServiceLocator._Global_Constants.GUID_MO_TRANSPORT, Environment.NewLine, ex.ToString()); ProjectData.ClearProjectError(); } } } catch (Exception projectError) { ProjectData.SetProjectError(projectError); ProjectData.ClearProjectError(); } finally { WorldServiceLocator._WorldServer.WORLD_TRANSPORTs_Lock.ReleaseReaderLock(); } } }