All pastes #449789 Raw Edit

Mine

public text v1 · immutable
·published 2007-04-20 13:19 UTC
rendered paste body
		private static void NPCUpdateThreadStart()
		{
			bool running = true;
			if (log.IsDebugEnabled)
                log.Debug("NPCUpdateThread ThreadId=" + Thread.CurrentThread.ManagedThreadId);
			while (running)
			{
				try
				{
					int start = Environment.TickCount;
					for (int i = 0; i < m_clients.Length; i++)
					{
						GameClient client = m_clients[i];
						if (client == null)
							continue;

						GamePlayer player = client.Player;
						if (client.ClientState == GameClient.eClientState.Playing && player == null)
						{
							if (log.IsErrorEnabled)
								log.Error("account has no active player but is playing, disconnecting! => " + client.Account.Name);
							GameServer.Instance.Disconnect(client);
							Thread.Sleep(200);
						}
						if (client.ClientState != GameClient.eClientState.Playing)
							continue;
						if (player.ObjectState != GameObject.eObjectState.Active)
							continue;

						if (Environment.TickCount - player.LastNPCUpdate > PLAYER_UPDATE_TIME)
						{
							BitArray carray = player.CurrentUpdateArray;
							BitArray narray = player.NewUpdateArray;
							narray.SetAll(false);
							lock (player.CurrentRegion.ObjectsSyncLock)
							{
								foreach (GameNPC npc in player.GetNPCsInRadius(VISIBILITY_DISTANCE))
								{
									try
									{
										narray[npc.ObjectID-1] = true;
										/*
										if(npc.IsMoving 
											&& npc.IsOnTarget()
											&& !npc.HasArriveOnTargetHandlers()
											&& !npc.HasCloseToTargetHandlers())
										{
											npc.StopMoving();
										} 
										else*/
										if ((uint)Environment.TickCount - npc.LastUpdateTickCount > NPC_UPDATE_INTERVAL)
										{
											npc.BroadcastUpdate();
										}
										else if (carray[npc.ObjectID-1] == false)
										{
											client.Out.SendNPCUpdate(npc);
										}
									}
									catch (Exception e)
									{
										if (log.IsErrorEnabled)
											log.Error("NPC update: " + e.GetType().FullName + " (" + npc.ToString() + ")", e);
									}
								}
							}
							player.SwitchUpdateArrays();
							player.LastNPCUpdate = Environment.TickCount;
						}
					}
					int took = Environment.TickCount - start;
					if (took > 500)
					{
						if (log.IsWarnEnabled)
							log.WarnFormat("NPC update took {0}ms", took);
					}
					Thread.Sleep(50);
				}
				catch (ThreadAbortException)
				{
					if (log.IsDebugEnabled)
						log.Debug("NPC Update Thread stopping...");
					running = false;
				}
				catch (Exception e)
				{
					if (log.IsErrorEnabled)
						log.Error("Error in NPC Update Thread!", e);
				}
			}
		}