Sign in to follow this  
Aesir

 tutoriel / partage [JAVA] Commande : Surveiller un joueur

Recommended Posts

import common.Commands;Bonjour, bonsoir,

 

Dans ce sujet vous trouverai les lignes de code (Java) d'une commande GM de "Surveillance".

Si vous avez des suggestions afin d'amélioré le code et/ou des remarques nécessité pas.

Je débute dans le "Java" et vos commentaires peuvent m’aidai.

 

Description de l’effet:

Rend le GM, ou un autre, invisible (Size 0) et suit le joueur ciblé a chaque changement de map.

[Ajout] Le GM reçois les MP reçu et envoyer du joueur Surveillé.

 

( Par la suite je regarderai si il est possible de faire un listing de tout les comptes jouer par l'IP, et/ou d’afficher les messages privé de la cible et/ou d'autres informations comme les kamas )

 

Syntaxe:

SURVEILLE [PseudoJoueur] [PseudoGM_*]

*Facultatif: utile pour désigné un autre GM.

 

Ligne de Code (Java):

Parti Téléportation et vérification (MapID_joueur = MapID_GM)

 

Dans Commands.java > public class Commands { :

Dans Commands.java > public class Commands {
public static boolean OnOff;
public static Personnage P1 ;
public static Personnage target1 ;

private boolean _TimerStart1 = false;
Timer _timer1;

private Timer createTimer1(final int time1, final Personnage target1, final Personnage P1)
{
    ActionListener action = new ActionListener ()
      {
    	int Time1 = time1;
        public void actionPerformed (ActionEvent event)

    	{
        	Time1 = Time1-1;
        	if(Time1 <= 0)
        	{
				short mapID1 = P1.get_curCarte().get_id();
				short mapGM = target1.get_curCarte().get_id();
				int cellID1 = P1.get_curCell().getID();

        		if(mapID1 != mapGM)
        		{
        		target1.teleport(mapID1, cellID1);
    			String str = "Le joueur a ete teleporte";
    			SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);
        		}
        		if(P1.get_fight() != null)
        		{
        			target1.get_fight().joinAsSpect(target1);
        		}
        	}
        }
      };
    return new Timer (2000, action); //Toutes les deux secondes (2000) vérifie si il a pas eu de déplacement
}

 

Partie "Commande":

 

Dans Commands.java > public void commandGmXXXX :

Dans Commands.java > public void commandGmXXXX

	if (command.equalsIgnoreCase("SURVEILLE"))
	{        // Vérifications // 
		P1 = World.getPersoByName(infos[1]);
		if(P1 == null)
		{
			String str = "Le personnage n'existe pas";
			SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);
			return;
		}
		target1 = _perso;  
		if(infos.length > 2)									//Si un nom de perso est specifier
		{
			target1 = World.getPersoByName(infos[2]);
			if(target1 == null || target1.get_compte().get_gmLvl() < 1) // vérifie si le surveillant est bien GM
			{
				String str = "Le personnage n'a pas ete trouve ou n'est pas un GM";
				SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);
				return;
			}
			if(target1.get_fight() != null)
			{
				String str = "La cible est en combat";
				SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);
				return;
			} 	// FIN des Vérifications // 
		}
	int time1 = 1;
				// Demande de surveillance faite //
		if(OnOff = false || !_TimerStart1 && target1.get_compte().get_gmLvl() >= 1) // Si pas activé OU Timer pas activé ET GMlvl sup a 1 = OK
		{
			target1.set_size(0);  								// on réduit la taille a zero
			SocketManager.GAME_SEND_ERASE_ON_MAP_TO_MAP(target1.get_curCarte(), target1.get_GUID());
			SocketManager.GAME_SEND_ADD_PLAYER_TO_MAP(target1.get_curCarte(), target1);

			_timer1 = createTimer1(time1, target1, P1); 		// on lance le timer
			_timer1.start();
			_TimerStart1 = true;
			OnOff = true;

			SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out, "Surveillance Activer !" );
		}
		else 
					// demande d'arret de surveillance //
		if(OnOff = true && _TimerStart1) 						// Si activé ET timer activé = OK
		{
			_timer1.stop();										//on stop le timer
			_TimerStart1 = false;
			OnOff = false; 

			target1.set_size(100); 								// on rend sa taille normal
			SocketManager.GAME_SEND_ERASE_ON_MAP_TO_MAP(target1.get_curCarte(), target1.get_GUID());
			SocketManager.GAME_SEND_ADD_PLAYER_TO_MAP(target1.get_curCarte(), target1);
			SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out, "Surveillance Arreter !");
		}
	}else	

 

[Note] J'ai désigné "commandGmXXXX" car libre a vous de le placer dans "commandGmFour" ou "One"

 

Partie "Basic_chatMessage"

 

Dans GameThread > Basic_chatMessage :

Dans GameThread > Basic_chatMessage


import common.Commands;


if((Commands.target1).get_compte().get_gmLvl() >= 1 && Commands.OnOff) // Si le GM est grade1 (mini) et comme surveillance activé = OK
				{
					SocketManager.GAME_SEND_cMK_PACKET(Commands.target1, "F", Commands.P1.get_GUID(), Commands.P1.get_name(), msg);
					SocketManager.GAME_SEND_cMK_PACKET(target, "F", _perso.get_GUID(), _perso.get_name(), msg);
					SocketManager.GAME_SEND_cMK_PACKET(_perso, "T", target.get_GUID(), target.get_name(), msg);
					return;
				}

 

Ajout d'une conditions "Si le GM est grade1 (mini) et comands surveillance activé = OK" afin de récupérai ces MP's

-------------------------

 

Edited by Nicosti
Correction spoilers
  • Like 3

Share this post


Link to post
Share on other sites

@Nicky31:

Merci, j'ai toujours un peu de mal a donné un titre a mes sujets !

 

@Défense:

Je comprend que "testé" toutes les secondes doit "coûter cher".

Mais plus on agrandi la duré, plus le TP sera moins proche au changement de map du joueur.

 

Par expérience, lorsque tu vois des "Speed-Hackers" sur un serveur, il ne reste pas plus de 2secondes sur une map, lorsqu'il traque (PvP par exemple).

Alors qu'une traversé de bout a bout doit bien faire 5-6 secondes.

-------------------

Maintenant si quelqu'un a une suggestion a faire pour remplacer le Timer, je suis preneur !

( Le "Wait" et "sleep" fige le Thread (Client Dofus répond pas) il me semble ... )

Share this post


Link to post
Share on other sites

Mise a jour du Code

 

nicky serais bien de le mettre sur cyon ému que ta modifier ^^ ??? si l'envie te prend

Rien de plus simple:

http://www.mediafire.com/?6j35a17y5qt98d0

 

Ici tu as que l'émulateur et les sources.

La base de donnée étant la même, il faut juste remplacer "CyonEmu.jar" après avoir fait une sauvegarde du *.jar d'origine (par sécurité).

  • Like 1

Share this post


Link to post
Share on other sites

Ton code comporte des erreurs, il faudrait les corrigés avant de compiler sur l'émulateur.

 

Mind,

Share this post


Link to post
Share on other sites

@Mind:

Hier à 23h17 suite au message j'ai "corriger" les erreurs qu'il avait et ajouter la surveillance des MP's.

Normalement tout devrai fonctionné.

 

Mais si tu parle du code actuel, pourrai tu détaillé un peu ?

Share this post


Link to post
Share on other sites
Dans Commands.java > public class Commands {

public static boolean OnOff;

public static Personnage P1 ;

public static Personnage target1 ;

 

private boolean _TimerStart1 = false;

Ton timer est mal configuré, il ne peut indiqué que le booleanTimer1=Start

Timer _timer1;

 

private Timer createTimer1(final int time1, final Personnage target1, final Personnage P1)

{

ActionListener action = new ActionListener ()

{

int Time1 = time1;

public void actionPerformed (ActionEvent event)

 

{

Time1 = Time1-1;

if(Time1 <= 0)

{

short mapID1 = P1.get_curCarte().get_id();

short mapGM = target1.get_curCarte().get_id();

int cellID1 = P1.get_curCell().getID();

 

if(mapID1 != mapGM)

{

target1.teleport(mapID1, cellID1);

String str = "Le joueur a ete teleporte";

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);

}

if(P1.get_fight() != null)

Si tu procèdes comme cela, aucun joueur n'est selectionné puisque ton ¨P1 n'est pas launch.

{

target1.get_fight().joinAsSpect(target1);

}

}

}

};

return new Timer (2000, action); //Toutes les deux secondes (2000) vérifie si il a pas eu de déplacement

}

 

 

Parti "Commande":

Dans Commands.java > public void commandGmXXXX

if (command.equalsIgnoreCase("SURVEILLE"))

{ // Vérifications //

P1 = World.getPersoByName(infos[1]);

if(P1 == null) Même chose.

{

String str = "Le personnage n'existe pas";

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);

return;

}

target1 = _perso;

if(infos.length > 2) //Si un nom de perso est specifier

{

target1 = World.getPersoByName(infos[2]);

if(target1 == null || target1.get_compte().get_gmLvl() < 1) // vérifie si le surveillant est bien GM

{

String str = "Le personnage n'a pas ete trouve ou n'est pas un GM";

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);

return;

}

if(target1.get_fight() != null)

{

String str = "La cible est en combat";

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out,str);

return;

} // FIN des Vérifications //

}

int time1 = 1;

// Demande de surveillance faite //

if(OnOff = false || !_TimerStart1 && target1.get_compte().get_gmLvl() >= 1) // Si pas activé OU Timer pas activé ET GMlvl sup a 1 = OK

{

target1.set_size(0); // on réduit la taille a zero

SocketManager.GAME_SEND_ERASE_ON_MAP_TO_MAP(target1.get_curCarte(), target1.get_GUID());

SocketManager.GAME_SEND_ADD_PLAYER_TO_MAP(target1.get_curCarte(), target1);

 

_timer1 = createTimer1(time1, target1, P1); // on lance le timer Ton timer est incorrecte, P1 non lancé, time non préparé.

_timer1.start();

_TimerStart1 = true;

OnOff = true;

 

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out, "Surveillance Activer !" );

}

else

// demande d'arret de surveillance //

if(OnOff = true && _TimerStart1) // Si activé ET timer activé = OK

{

_timer1.stop(); //on stop le timer

_TimerStart1 = false;

OnOff = false;

 

target1.set_size(100); // on rend sa taille normal

SocketManager.GAME_SEND_ERASE_ON_MAP_TO_MAP(target1.get_curCarte(), target1.get_GUID());

SocketManager.GAME_SEND_ADD_PLAYER_TO_MAP(target1.get_curCarte(), target1);

SocketManager.GAME_SEND_CONSOLE_MESSAGE_PACKET(_out, "Surveillance Arreter !");

}

}else

 

 

 

[Note] J'ai désigné "commandGmXXXX" car libre a vous de le placer dans "commandGmFour" ou "One"

 

Parti "Basic_chatMessage"

Dans GameThread > Basic_chatMessage

if((Commands.target1).get_compte().get_gmLvl() >= 1 && Commands.OnOff) // Si le GM est grade1 (mini) et comme surveillance activé = OK

{

SocketManager.GAME_SEND_cMK_PACKET(Commands.target1, "F", Commands.P1.get_GUID(), Commands.P1.get_name(), msg);

SocketManager.GAME_SEND_cMK_PACKET(target, "F", _perso.get_GUID(), _perso.get_name(), msg);

SocketManager.GAME_SEND_cMK_PACKET(_perso, "T", target.get_GUID(), target.get_name(), msg);

 

Le socket n'est pas renvoyé, ni envoyé au perso. tu oublies des liaisons binaire importantes.

return;

}

 

 

Ajout d'une conditions "Si le GM est grade1 (mini) et comands surveillance activé = OK" afin de récupérai ces MP's

-------------------------

 

 

 

Des erreurs qui ne permettent pas l'utilisation du code optimale.

Share this post


Link to post
Share on other sites

Merci beaucoup Mind,

pour le future je pense éviter de publié mes codes ... et retourné a mes cours de Java !

 

De rien!

 

@Défense: Non, on s'en "tape" pas. Si ces liaison ne sont pas faites son code tournera mais ne sera pas optimisé à 100%.

Share this post


Link to post
Share on other sites

Mind a raison, et c'est pour ce genre de commentaire que je pose mes "codes".

Si je ne vois pas les défauts, ou une optimisation possible, me le faire remarquer me permet de progressé.

Share this post


Link to post
Share on other sites

Mind a raison, et c'est pour ce genre de commentaire que je pose mes "codes".

Si je ne vois pas les défauts, ou une optimisation possible, me le faire remarquer me permet de progressé.

 

Exactement. ;)

Share this post


Link to post
Share on other sites
Sign in to follow this