C# Problème d’évènement.

Shornaal

Membre Actif
Inscrit
17 Février 2011
Messages
194
Reactions
0
#1
Bonsoir,

Vus que cela fait bientôt un an que je n'ai pas recommencé à développer un bot pour Dofus, je me suis intéressé de près au tutoriel suivant écrit par Maxilia : https://cadernis.fr/index.php?threads/[tuto]-bot-socket-les-fondamentaux.491/. À la fin du buffer, je veux déclencher l'événement RecievePacketBuffer mais j'obtient ce code d'erreur :

Code:
System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.
   à RMDofus.DNetwork.DBuffer.ProcessQueue() dans c:\Users\Jules\Documents\SharpDevelop Projects\MITMDofus\MITMDofus\DNetwork\DBuffer.cs:ligne 93
   à RMDofus.DNetwork.DBuffer.OnQueue(Byte[] buffer) dans c:\Users\Jules\Documents\SharpDevelop Projects\MITMDofus\MITMDofus\DNetwork\DBuffer.cs:ligne 35
   à RMDofus.DNetwork.RMSocket.listening() dans c:\Users\Jules\Documents\SharpDevelop Projects\MITMDofus\MITMDofus\DNetwork\RMSocket.cs:ligne 60
   à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   à System.Threading.ThreadHelper.ThreadStart()
Voici le code source du dit buffer :
Code:
/*
 * Created by SharpDevelop.
 * User: Jules
 * Date: 26/09/2012
 * Time: 03:49
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using RMDofus.DPacket;
using RMDofus.DNetwork;
	
namespace RMDofus.DNetwork
{
	/// <summary>
	/// Description of DBuffer.
	/// </summary>
	public class DBuffer
	{
		private Queue<byte> _byteQueue = new Queue<byte>();
		public event EventHandler<PacketBufferEventArg> RecievePacketBuffer;
		
		public DBuffer()
		{
		}
	
		public void OnQueue(byte[] buffer)
		{
			foreach (byte _byte in buffer)
			{
				_byteQueue.Enqueue(_byte);
			}
			
			ProcessQueue();
		}
		
		public void ProcessQueue()
		{
			
			while (_byteQueue.Count > 0)
			{
				if (_byteQueue.Count < 2) {
                    return;
				}
				
				DofusReader _reader = new DofusReader(_byteQueue.ToArray());
				short header = _reader.readShort();
				short protocolID = (short)(header >> 2);
				short lenghtSize = (short)(header & 3);
				
				 if (_byteQueue.Count < 2 + lenghtSize) {
                    return;
				 }
				 
				short lenght;
				
				switch (lenghtSize)
				{
				case 0:
					lenght = 0;
					break;
					
				case 1:
					lenght = _reader.readByte();
					break;
				case 2:
					lenght = _reader.readShort();
					break;
				case 3: 
					lenght = (short)((((_reader.readByte() & 255) << 16) + ((_reader.readByte() & 255) << 8) + (_reader.readByte() & 255)));
					break;
				default:
					throw new Exception();
				}
				
				if (_byteQueue.Count < lenght + lenghtSize + 2) {
					return;
				}
				
				DequeueByteUtils(lenghtSize);
				
				byte[] data = new Byte[lenght];
				
				Console.WriteLine("ID: {0}", protocolID);
				Console.Write("Message: ");
				for (int i = 0; i < data.Length; i++)
				{
					data[i] = _byteQueue.Dequeue();
				}
				
				PacketBufferEventArg Packet = new PacketBufferEventArg(protocolID, data);
				RecievePacketBuffer(null, Packet); // Ligne de l'erreur.
			}
		}
		
		 private void DequeueByteUtils(short lenghtSize)
        {
            _byteQueue.Dequeue();//
            _byteQueue.Dequeue();// Header

            if (lenghtSize > 0)
                _byteQueue.Dequeue();
            if (lenghtSize > 1)
                _byteQueue.Dequeue();
            if (lenghtSize > 2)
                _byteQueue.Dequeue();
        }
	}
}
J'ai instancié le packet à part dans une variable Packet pour vérifier son contenu, il est correctement déclaré. Je ne comprends vraiment pas pour cette exception se déclenche.

J'espère que vous allez pouvoir m'éclairer ! Amicalement.
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#2
Pour appeller un event en c# il faut ecrire

var evnt = tonevent;
if (evnt != null)
evnt(args...)

En fait si rien n est souscris a l event, il vaut null.
 

Shornaal

Membre Actif
Inscrit
17 Février 2011
Messages
194
Reactions
0
#3
J'ai beau regarder des tutoriaux ce Google, je ne trouve absolument rien de clair. Tu pourrais me montrer un exemple ? Je suis désolé, je suis passé de VB.Net à C# dans la foulée car je trouve sa syntaxe plus clair et moins brouillon mais, je manque clairement de compétences.

Edit : Héhé, en fait en relisant attentivement et en comparant avec un autre tutoriel :
Code:
if (RecievePacketBuffer != null)
       RecievePacketBuffer(this, new PacketBufferEventArg(protocolID, data));
Et ça marche parfaitement ! Merci (;
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#4
Code:
var evnt = RecievePacketBuffer;
if (evnt != null)
       evnt(this, new PacketBufferEventArg(protocolID, data));
Est plutôt conseillé, c'est une protection contre un un éventuel conflit de thread.
 
Haut Bas