Пример #1
0
 /// <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();
     }
 }
Пример #2
0
        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);
            }
        }