Exemplo n.º 1
0
        public static void ProcessEvents()
        {
            byte[] opCodeAndSize = new byte[2];
            byte[] buffer        = new byte[1];
            opCodeAndSize[0] = (byte)MimesisHelpers.opCodes.QueryEvent;
            opCodeAndSize[1] = 0;

            NetworkStream clientStream = client.GetStream();

            clientStream.Write(opCodeAndSize, 0, 2);
            clientStream.Flush();

            // Now wait for an answer
            try
            {
                int bytesRead = clientStream.Read(opCodeAndSize, 0, 2);
                int len       = opCodeAndSize[1];
                if (len > 0)
                {
                    buffer     = new byte[len];
                    bytesRead += clientStream.Read(buffer, 0, len);
                }
            }
            catch (Exception e)
            {
                Logging.WriteError("MimesisClientCom > ProcessEvents(): " + e);
                return;
            }
            if ((MimesisHelpers.opCodes)opCodeAndSize[0] == MimesisHelpers.opCodes.ReplyEvent && opCodeAndSize[1] > 0)
            {
                MimesisHelpers.MimesisEvent evt = MimesisHelpers.BytesToStruct <MimesisHelpers.MimesisEvent>(buffer);
                if (oldTaskList.Contains(evt))
                {
                    return;
                }
                switch (evt.eType)
                {
                case MimesisHelpers.eventType.pickupQuest:
                    oldTaskList.Add(evt);
                    break;
                    Logging.WriteDebug("Received pickupquest " + evt.EventValue2);
                    myTaskList.Add(evt);
                    break;

                case MimesisHelpers.eventType.turninQuest:
                    oldTaskList.Add(evt);
                    break;
                    Logging.WriteDebug("Received turninquest " + evt.EventValue2);
                    myTaskList.Add(evt);
                    break;

                case MimesisHelpers.eventType.mount:
                    Logging.WriteDebug("Received mount type " + (MountCapacity)evt.EventValue1);
                    myTaskList.Add(evt);
                    oldTaskList.Add(evt);
                    break;
                }
            }
        }
Exemplo n.º 2
0
        public static void DoTasks()
        {
            MimesisHelpers.MimesisEvent evt = GetBestTask;
            if (evt.eType == MimesisHelpers.eventType.none)
            {
                return; // "new instance of MimesisEvent" => nothing to do
            }
            switch (evt.eType)
            {
            case MimesisHelpers.eventType.pickupQuest:
            case MimesisHelpers.eventType.turninQuest:
                List <WoWUnit> listU = ObjectManager.GetWoWUnitByEntry(evt.EventValue1);
                if (listU.Count > 0)
                {
                    WoWUnit u       = listU[0];
                    Npc     quester = new Npc();
                    quester.Entry    = evt.EventValue1;
                    quester.Position = u.Position;
                    quester.Name     = u.Name;
                    bool cancelPickUp = false;
                    if (evt.eType == MimesisHelpers.eventType.pickupQuest && !Quest.GetQuestCompleted(evt.EventValue2) && !Quest.GetLogQuestId().Contains(evt.EventValue2))
                    {
                        Quest.QuestPickUp(ref quester, evt.EventString1, evt.EventValue2, out cancelPickUp);
                    }
                    else if (evt.eType == MimesisHelpers.eventType.turninQuest && Quest.GetLogQuestId().Contains(evt.EventValue2) && Quest.GetLogQuestIsComplete(evt.EventValue2))
                    {
                        Quest.QuestTurnIn(ref quester, Quest.GetLogQuestTitle(evt.EventValue2), evt.EventValue2);
                    }
                    CleanQuestEvents(cancelPickUp);
                }
                break;

            case MimesisHelpers.eventType.mount:
                switch ((MountCapacity)evt.EventValue1)
                {
                case MountCapacity.Ground:
                    MountTask.MountingGroundMount(true);
                    break;

                case MountCapacity.Fly:
                    MountTask.MountingFlyingMount(true);
                    break;

                case MountCapacity.Swimm:
                    MountTask.MountingAquaticMount(true);
                    break;

                default:
                    MountTask.DismountMount(true);
                    break;
                }
                myTaskList.Remove(evt);
                break;
            }
        }
Exemplo n.º 3
0
 public static void EventMount()
 {
     // Build an event in _globalEvent
     _eventSerialNumber++;
     MimesisHelpers.MimesisEvent evt = new MimesisHelpers.MimesisEvent();
     evt.SerialNumber = _eventSerialNumber;
     evt.eType        = MimesisHelpers.eventType.mount;
     evt.EventValue1  = (int)_myMountStatus;
     // now add this new event to the globale list
     lock (_myLock) _globalList.Add(evt);
     _cleanupTimer.Reset(); // Let 5 seconds for all client threads to pickup this event before purging it
 }
Exemplo n.º 4
0
        public static void EventQuestFinished()
        {
            WoWObject questGiverO = ObjectManager.GetObjectByGuid(ObjectManager.Me.Target);

            if (questGiverO == null || !questGiverO.IsValid)
            {
                return;
            }
            WoWUnit questGiver = new WoWUnit(questGiverO.GetBaseAddress);

            if (!questGiver.IsValid)
            {
                return;
            }
            // First, let's check if it was a quest Turn-in
            int        questId      = 0;
            List <int> newQuestList = Quest.GetLogQuestId();

            foreach (var quest in _currentQuestList)
            {
                if (!newQuestList.Contains(quest))
                {
                    questId = quest;
                    break;
                }
            }
            // if questId is still 0, then it was not a quest turn in
            if (questId == 0)
            {
                return;
            }
            _eventSerialNumber++;
            // Now we know it was realy a Turn in
            // We create a global event based on the gathered data
            MimesisHelpers.MimesisEvent evt = new MimesisHelpers.MimesisEvent();
            evt.SerialNumber = _eventSerialNumber;
            evt.eType        = MimesisHelpers.eventType.turninQuest;
            evt.EventValue1  = questGiver.Entry;
            evt.EventValue2  = questId;
            // now add this new event to the globale list
            lock (_myLock) _globalList.Add(evt);
            _currentQuestList.Remove(questId);
            _cleanupTimer.Reset(); // Let 5 seconds for all client threads to pickup this event before purging it
        }
Exemplo n.º 5
0
        public static void EventTaxi(object sender, EventArgs args)
        {
            var eventArgs = new Travel.TaxiEventArgs();

            if (args is Travel.TaxiEventArgs)
            {
                eventArgs = args as Travel.TaxiEventArgs;
            }
            // Build an event in _globalEvent
            _eventSerialNumber++;
            MimesisHelpers.MimesisEvent evt = new MimesisHelpers.MimesisEvent();
            evt.SerialNumber = _eventSerialNumber;
            evt.eType        = MimesisHelpers.eventType.taxi;
            evt.EventValue1  = eventArgs.From;
            evt.EventValue2  = eventArgs.To;
            //evt.EventString1 = arrived.ToString();
            // now add this new event to the globale list
            lock (_myLock) _globalList.Add(evt);
            _cleanupTimer.Reset(); // Let 5 seconds for all client threads to pickup this event before purging it
        }
Exemplo n.º 6
0
        /*
         * We create a callback method which create a global list of events with a serial number
         */

        public static void EventQuestAccepted()
        {
            WoWObject questGiverO = ObjectManager.GetObjectByGuid(ObjectManager.Me.Target);

            if (questGiverO == null || !questGiverO.IsValid)
            {
                return;
            }
            WoWUnit questGiver = new WoWUnit(questGiverO.GetBaseAddress);

            if (!questGiver.IsValid)
            {
                return;
            }
            _eventSerialNumber++;
            // We create a global event based on the data we will gather
            MimesisHelpers.MimesisEvent evt = new MimesisHelpers.MimesisEvent();
            evt.SerialNumber = _eventSerialNumber;
            evt.eType        = MimesisHelpers.eventType.pickupQuest;
            evt.EventValue1  = questGiver.Entry;
            // we diff current quest list vs old one
            List <int> newQuestList = Quest.GetLogQuestId();

            foreach (var quest in newQuestList)
            {
                if (!_currentQuestList.Contains(quest))
                {
                    evt.EventValue2  = quest;
                    evt.EventString1 = Quest.GetLogQuestTitle(quest);
                    break;
                }
            }
            // now add this new event to the globale list
            lock (_myLock) _globalList.Add(evt);
            _currentQuestList.Add(evt.EventValue2);
            _cleanupTimer.Reset(); // Let 5 seconds for all client threads to pickup this event before purging it
        }
Exemplo n.º 7
0
 private static void ListenForClients(int port)
 {
     if (_listenThread == null || !_listenThread.IsAlive)
     {
         return;
     }
     StartListenOnPort(port);
     while (_listenThread != null && _listenThread.IsAlive && _tcpListener != null && _tcpListener.Server != null)
     {
         if (_tcpListener.Pending())
         {
             // Wait for a connection
             TcpClient client = _tcpListener.AcceptTcpClient();
             // We got one, create a thread for it
             Socket s = client.Client;
             Logging.Write("Bot with address " + IPAddress.Parse(((IPEndPoint)s.RemoteEndPoint).Address.ToString()) + " has connected.");
             ClientThread cThread      = new ClientThread();
             Thread       clientThread = new Thread(new ParameterizedThreadStart(cThread.HandleClientComm));
             clientThread.Start(client);
         }
         else
         {
             Thread.Sleep(200);
             if (_cleanupTimer.IsReady) // Every 5 seconds, we drop the head event from the list
             {
                 lock (_myLock)
                 {
                     if (_globalList.Count > 0)
                     {
                         MimesisHelpers.MimesisEvent evt = _globalList[0];
                         _globalList.Remove(evt);
                     }
                 }
                 _cleanupTimer.Reset();
             }
             // Now check if mount status changed
             bool update = false;
             if (MountTask.OnGroundMount())
             {
                 if (_myMountStatus != MountCapacity.Ground)
                 {
                     update = true;
                 }
                 _myMountStatus = MountCapacity.Ground;
             }
             else if (MountTask.OnFlyMount())
             {
                 if (_myMountStatus != MountCapacity.Fly)
                 {
                     update = true;
                 }
                 _myMountStatus = MountCapacity.Fly;
             }
             else if (MountTask.OnAquaticMount())
             {
                 if (_myMountStatus != MountCapacity.Swimm)
                 {
                     update = true;
                 }
                 _myMountStatus = MountCapacity.Swimm;
             }
             else if (_myMountStatus != MountCapacity.Feet)
             {
                 update         = true;
                 _myMountStatus = MountCapacity.Feet;
             }
             if (update)
             {
                 EventMount();
             }
         }
     }
 }
Exemplo n.º 8
0
            public void HandleClientComm(object client)
            {
                if (_listenThread == null || !_listenThread.IsAlive || _tcpListener == null || _tcpListener.Server == null)
                {
                    return;
                }
                TcpClient     tcpClient    = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();

                byte[] opCodeAndLen = new byte[2];
                byte[] message      = new byte[0];
                int    bytesRead;
                List <MimesisHelpers.MimesisEvent> eventList = new List <MimesisHelpers.MimesisEvent>();
                uint _currentSerialNumber = 0;

                while (_listenThread != null && _listenThread.IsAlive && _tcpListener != null && _tcpListener.Server != null)
                {
                    bytesRead = 0;
                    try
                    {
                        // non blocking call
                        if (clientStream.DataAvailable)
                        {
                            bytesRead = clientStream.Read(opCodeAndLen, 0, 2);
                            int len = opCodeAndLen[1];
                            if (len > 0)
                            {
                                message    = new byte[len];
                                bytesRead += clientStream.Read(message, 0, len);
                            }
                        }
                    }
                    catch
                    {
                        Logging.Write("Client connection lost!");
                        break;
                    }

                    if (bytesRead > 0)
                    {
                        // Do something with this message
                        switch ((MimesisHelpers.opCodes)opCodeAndLen[0])
                        {
                        case MimesisHelpers.opCodes.QueryPosition:
                            var masterPosition = ObjectManager.Me.Position.Array;
                            // create a byte array and copy the floats into it...
                            var bufferPos = new byte[13];     // 3 float[4] + 1 byte (type)
                            Buffer.BlockCopy(masterPosition, 0, bufferPos, 0, 12);
                            byte typeByte = 0;
                            if (ObjectManager.Me.Position.Type == "Flying")
                            {
                                typeByte = 2;
                            }
                            else if (ObjectManager.Me.Position.Type == "Swimming")
                            {
                                typeByte = 1;
                            }
                            bufferPos[12]   = typeByte;
                            opCodeAndLen[0] = (byte)MimesisHelpers.opCodes.ReplyPosition;
                            opCodeAndLen[1] = (byte)bufferPos.Length;
                            clientStream.Write(opCodeAndLen, 0, 2);
                            clientStream.Write(bufferPos, 0, bufferPos.Length);
                            break;

                        case MimesisHelpers.opCodes.QueryGuid:
                            byte[] bufferGuid = MimesisHelpers.StructToBytes(ObjectManager.Me.Guid);
                            opCodeAndLen[0] = (byte)MimesisHelpers.opCodes.ReplyGuid;
                            opCodeAndLen[1] = (byte)bufferGuid.Length;
                            clientStream.Write(opCodeAndLen, 0, 2);
                            clientStream.Write(bufferGuid, 0, bufferGuid.Length);
                            break;

                        case MimesisHelpers.opCodes.Disconnect:
                            tcpClient.Close();
                            Logging.Write("Client diconnected");
                            return;

                        case MimesisHelpers.opCodes.QueryEvent:
                            opCodeAndLen[0] = (byte)MimesisHelpers.opCodes.ReplyEvent;
                            if (eventList.Count > 0)
                            {
                                MimesisHelpers.MimesisEvent mevent = eventList[0];
                                byte[] bufferEvent = MimesisHelpers.StructToBytes(mevent);
                                opCodeAndLen[1] = (byte)bufferEvent.Length;
                                Logging.WriteDebug("Sending to client event " + mevent.eType + " for quest " + mevent.EventValue2);
                                clientStream.Write(opCodeAndLen, 0, 2);
                                clientStream.Write(bufferEvent, 0, bufferEvent.Length);
                                eventList.Remove(mevent);
                            }
                            else
                            {
                                opCodeAndLen[1] = 0;
                                clientStream.Write(opCodeAndLen, 0, 2);
                            }
                            break;

                        case MimesisHelpers.opCodes.RequestGrouping:
                            if (!ObjectManager.Me.IsHomePartyLeader)
                            {
                                RollId = 0;
                            }
                            string sentName = MimesisHelpers.BytesToString(message);
                            Lua.LuaDoString("InviteUnit(\"" + sentName + "\")");
                            opCodeAndLen[0] = (byte)MimesisHelpers.opCodes.ReplyGrouping;
                            opCodeAndLen[1] = 4;
                            clientStream.Write(opCodeAndLen, 0, 2);
                            clientStream.Write(BitConverter.GetBytes(RollId), 0, 4);
                            break;

                            /* Some more things to replicate
                             * - TAXIMAP_OPENED
                             */
                        }
                        clientStream.Flush();
                        Thread.Sleep(250);
                        // We should code here event collecting (eg.: pickup quest, turnin quest, interact with object...)

                        /*
                         * We loop throu the global list which is out of this thread, if an event has an higher serial number
                         * than the last we know localy, we copy the event to the local list in this thread.
                         */
                        uint highestSerialNumber = 0;
                        lock (_myLock)
                        {
                            foreach (MimesisHelpers.MimesisEvent evt in _globalList)
                            {
                                if (evt.SerialNumber > _currentSerialNumber)
                                {
                                    eventList.Add(evt);
                                    if (evt.SerialNumber > highestSerialNumber) // Useless most probably because the list should be sorted
                                    {
                                        highestSerialNumber = evt.SerialNumber;
                                    }
                                }
                            }
                        }
                        _currentSerialNumber = highestSerialNumber;
                    }
                }
                clientStream.Dispose();
                tcpClient.Close();
            }