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; } } }
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; } }
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 }
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 }
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 }
/* * 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 }
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(); } } } }
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(); }