/// <summary> /// The ping timer's callback. /// </summary> /// <param name="sender">The sender.</param> /// <param name="state">The state.</param> private void PingTimerCallback(object sender, object state) { if (Environment.TickCount - LastPingTick >= 10000) { LastPingTick = Environment.TickCount; Console.WriteLine("client timeout, disconnecting (last: {0}, elapsed: {1})", LastPingTick, Environment.TickCount - LastPingTick); m_PingTimer.Reset(-1, 0); Disconnect(); } }
private void MovementTimer_Callback(object sender, object state) { bool last = (bool)state; lock (m_lock) { Vector2 old_pos = m_position.ToVector2(); //make a simple update to position for some test //before the NavMesh tests m_position = (m_position.ToVector2() + m_direction * this.Speed * (Environment.TickCount - m_lastMovementUpdate) / 1000f).ToVector3(m_position.Y); if (m_hasDestination) { if (last) { m_movementType = MovementType.NotMoving; m_hasDestination = false; m_hasAngleMovement = false; m_direction = Vector2.Zero; m_movementTimer.Reset(-1, 0); Logging.Log()("movement has ended", LogLevel.Success); } else { float arrivalT = m_destination.ToGameWorld(m_destinationRegion).Distance(m_position.ToGameWorld(m_region)) / (this.Speed / Formula.WORLD_SCALE) * 1000f; if (arrivalT < 1000f) { m_movementTimer.Reset((int)arrivalT, 0, true); } } } Vector3 result; if (Data.NavMesh.Collision.Test(m_region, old_pos.ToVector3(m_position.Y), m_position, out result)) { m_position = old_pos.ToVector3(m_position.Y); m_movementTimer.Reset(-1, 0); m_movementType = MovementType.NotMoving; m_hasDestination = false; m_hasAngleMovement = false; m_direction = Vector2.Zero; m_lastMovementUpdate = Environment.TickCount; Logging.Log()("collision detected 1", LogLevel.Info); return; } else { m_position.Y = result.Y; if (Data.NavMesh.Collision.Test(m_region, m_position, (m_position.ToVector2() + m_direction * this.Speed).ToVector3(m_position.Y), out result)) { float arrivalT = result.ToGameWorld(m_region).Distance(m_position.ToGameWorld(m_region)) / (this.Speed / Formula.WORLD_SCALE) * 1000f - 100f; if (arrivalT > 250) { m_movementTimer.Reset((int)arrivalT, 0, true); } else { m_movementTimer.Reset(0, 0, true); m_movementType = MovementType.NotMoving; m_hasDestination = false; m_hasAngleMovement = false; m_direction = Vector2.Zero; m_lastMovementUpdate = Environment.TickCount; } m_lastMovementUpdate = Environment.TickCount; Logging.Log()("collision detected 2", LogLevel.Info); return; } } UpdatePosition(); } SightCheck(); if (last) { Packet pkt = new Packet(SCommon.Opcode.Agent.GAMEOBJECT_WARP); pkt.WriteInt32(m_uniqueId); pkt.WriteInt16(m_region); pkt.WriteSingle(m_position.X); pkt.WriteSingle(m_position.Y); pkt.WriteSingle(m_position.Z); pkt.WriteUInt16(m_angle); SendPacket(pkt); BroadcastToSightList(pkt); } }