VB/VB.Net [Up] Lancer un sort

A

Anonymous

Invité
#1
Bonsoir,

sa fait pas mal de temps que je cherche a lancer un sort sur un ennemie mais malgré une bonne semaine de test je n'ai pas trouvé.

Voila mon case pour envoyer le sort:
Case 714
ID_Message = New com.ankamagames.dofus.network.messages.game.context.fight.GameFightTurnStartMessage
ID_Message.Deserialize(PacketData)
'On detecte le début de son tour
'On attaque un monstre
Dim Param1 As New Dofus.DofusWriter
Param1.WriteShort(161) 'l'id du sort
Param1.WriteShort(id_cellmonster) 'la cellid
Dofus.DofusWriter.Send(1005, _socket_Jeu) 'on envoi
'On attend une seconde
Thread.Sleep(1000)
'On passe son tour
Dofus.DofusWriter.Send(718, _socket_Jeu)

Mon case pour réceptionner la cellid de l'ennemi: (code moche je sais mais je fais des test avec un seul monstre en combat)
Case 5696
ID_Message = New com.ankamagames.dofus.network.messages.game.context.GameEntitiesDispositionMessage
ID_Message.Deserialize(PacketData)

For i = 0 To ID_Message.dispositions.count - 1
id_cellmonster = ID_Message.dispositions(i).cellId
Next

Cela me déconnecte a l'envoi du packet de mon sort
J'attend de l'aide
Bonne soirée
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
Re: [Combat] Lancer un sort

c'est je pense car tu ne detectes pas le tour du bot ?
Code:
 Case 714 ' GameFightTurnStartMessage
                    ID_Message = New Messages.Game.Context.Fight.GameFightTurnStartMessage
                    ID_Message.Deserialize(PacketData)
                    If ID_Message.id = ID_Bot Then ' tour du bot ?
                              'lance le sort et passe le tour
                    end if
pour etre sur que la cell est celle d'un monstre il faut regarder avec :
Code:
Case 5921 ' Synchronization du combat
                ID_Message = New Network.Messages.Game.Context.Fight.GameFightSynchronizeMessage
                ID_Message.deserialize(PacketData)
                For i As Integer = 0 To ID_Message.fighters.count - 1
                    Select Case ID_Message.fighters(i).protocolId
                        Case 46
                            ' Humanoid
                            ' ID_Message.fighters(i).ContextualId, ID_Message.fighters(i).name, ID_Message.fighters(i).Level, ID_Message.fighters(i).stats.lifePoints.ToString, ID_Message.fighters(i).stats.maxLifePoints.ToString, ID_Message.fighters(i).disposition.cellId
                        Case 29
                            ' monstre
                            ' ID_Message.fighters(i).ContextualId, Decode(I18nFile.ReadText(Monsters.ReadObject(ID_Message.fighters(i).creatureGenericId).nameid)), ID_Message.fighters(i).creatureGrade, ID_Message.fighters(i).stats.lifePoints.ToString, ID_Message.fighters(i).stats.maxLifePoints.ToString, ID_Message.fighters(i).disposition.cellId
                    End Select
                Next
hs : tu m'etonnes dans le bon sens mon cher alexandre tu as bien avancé , bravo
 
A

Anonymous

Invité
#3
Re: [Combat] Lancer un sort

Bonsoir,

tout d'abord merci de ton aide précieuse,

Cela ne vient pas du 714, on ne le recois qu'au commencement de son tour.

J'ai utilisé ta méthode pour la reception de la cellid du monstre qui a l'air de marcher mais ma fenêtre de sortie m'indique un dépassement de capacité au niveau de l'ecriture des donnes dans le param1.
Cela vient de mon short, je reessayerais demain.

Bonne soiree
 
A

Anonymous

Invité
#4
Re: [Combat] Lancer un sort

Tonton ToOnS a toujours raison
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#5
Re: [Combat] Lancer un sort

Le writeshort de la base overedge ne fonctionne pas , il faut mettre le code de writeint16 dans writeshort.
pour le 714 tu le recois a tout les tours (que ce soit le tien ou pas tu le recois , c'est pourca qu'il faut verifier que c'est bien ton tour)

apres pour etre au top il faut verifier que tu peux reellement lancer le sort sur le montre (avec la ligne de vue et la PO) mais ca c'est une autre histoire
 
A

Anonymous

Invité
#6
Re: [Combat] Lancer un sort

Oui, j'avais pense a ceci mais pour le moment on va lancer un sort^^
Merci de ton aide je test cela ce soir
 
A

Anonymous

Invité
#7
Re: [Combat] Lancer un sort

Bonjour,

Alors j'ai réussi a lancé mon sort ! :D

Mais mon bot a un retard, il récupère la cellid du monstre avant le commencement de son tour du coup le monstre bouge et il lance le sort sur la mauvaise cellid.

Edit:

Apres divers test, j'ai remarqué que je ne recois le packet qu'a la fin de tout les tour, donc les monstres se déplacent et je tape sur la mauvaise cellid a moins de commencer son tour en premier.

Ce doit être un autre packet ou bien un packet a envoyé pour le mettre a jour...
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#8
Re: [Combat] Lancer un sort

Se que j'aime c'est que je voie que Alexandre a bien changer sur skype comme sur le forum :p est il avance doucement mais surement :p continue ne lâche pas.
 
A

Anonymous

Invité
#9
Re: [Combat] Lancer un sort

Merci tifoux :p
J'ai perdu mes ID skype :S
 
A

Anonymous

Invité
#10
Re: [Combat] Lancer un sort

Si je me souvient bien tu doit mettre tes info a jour, exemple tu reçois le 951 (un deplacement) tu doit mettre à jour la cellid de l'actor en question un peut à la maniere de mapcomplementary...
 
A

Anonymous

Invité
#11
Re: [Combat] Lancer un sort

Il y a plusieurs packets qui influent sur la position des monstres (ainsi que de toi meme et des alliés). Voici une liste probablement non exclusive :

GameActionFightSlideMessage
GameFightShowFighterMessage
GameEntitiesDispositionMessage
GameFightSynchronizeMessage
GameActionFightSummonMessage
 
A

Anonymous

Invité
#12
Re: [Combat] Lancer un sort

Bonjour,

On avance :)
Je vais etudier ces packets...

Bonne journee
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#13
Re: [Combat] Lancer un sort

donc en gros faudrais faire une liste des monstre qui est dans le combat avec leur id quand on reçois 951 on cherche dans la liste l'id du monstre est on modifi par la nouvel cellId?
 
A

Anonymous

Invité
#14
Re: [Combat] Lancer un sort

exactement, le code ci-dessous montre bien comment gérer les positions en combat.

Code:
    private void HandleGameActionFightSlideMessage(Packets.Game.Packets.Actions.Fights.GameActionFightSlideMessage packet)
    {
        var unit = this.FightUnits.Single(n => n.UID == packet.TargetId);
        unit.CellId = packet.EndCellId;
    }

    private void HandleGameFightShowFighterMessage(Packets.Game.Packets.Context.Fight.Character.GameFightShowFighterMessage packet)
    {
        lock (FightUnitsLock)
        {
            if (this.FightUnits.Count(n => n.UID == packet.Informations.ContextualId) == 0)
            {
                var unitToAdd = new FightUnit(packet.Informations.Disposition, packet.Informations.ContextualId);
                unitToAdd.TeamId = packet.Informations.TeamId;
                if (packet.Informations is Data.Game.Context.Fight.GameFightCharacterInformations)
                {

                    var characterInformations = packet.Informations as Data.Game.Context.Fight.GameFightCharacterInformations;

                    onDebugLog("Adding GameFightCharacterInformation with name " + characterInformations.Name);
                    unitToAdd.Name = characterInformations.Name;
                }
                this.FightUnits.Add(unitToAdd);
            }
            else
            {
                var unitToModify = this.FightUnits.Single(n => n.UID == packet.Informations.ContextualId);
                unitToModify.CellId = packet.Informations.Disposition.CellId;
                unitToModify.Direction = packet.Informations.Disposition.Direction;
                unitToModify.TeamId = packet.Informations.TeamId;
                if (packet.Informations is Data.Game.Context.Fight.GameFightCharacterInformations)
                {
                    var characterInformations = packet.Informations as Data.Game.Context.Fight.GameFightCharacterInformations;
                    onDebugLog("Modifying name from  GameFightCharacterInformation: " + characterInformations.Name);
                    unitToModify.Name = characterInformations.Name;
                }
            }
        }
    }

    private void HandleGameEntitiesDispositionMessage(Packets.Game.Packets.Context.GameEntitiesDispositionMessage packet)
    {
        foreach (var disposition in packet.Dispositions)
        {
            lock (FightUnitsLock)
            {
                if (FightUnits.Count(n => n.UID == disposition.Id) > 0)
                {
                    var fightUnit = this.FightUnits.Single(n => n.UID == disposition.Id);
                    fightUnit.Direction = disposition.Direction;
                    fightUnit.CellId = disposition.CellId;
                }
                else
                {
                    this.FightUnits.Add(new FightUnit(disposition));
                }
            }
        }
    }

    private void HandleGameFightSynchronizeMessage(Packets.Game.Packets.Context.Fight.GameFightSynchronizeMessage packet)
    {
        foreach (var syncFighter in packet.Fighters)
        {
            lock (FightUnitsLock)
            {
                if (this.FightUnits.Count(n => n.UID == syncFighter.ContextualId) > 0)
                {

                    var matchingFightUnit = this.FightUnits.Single(n => n.UID == syncFighter.ContextualId);
                    matchingFightUnit.CellId = syncFighter.Disposition.CellId;
                    matchingFightUnit.Direction = syncFighter.Disposition.Direction;
                    matchingFightUnit.TeamId = syncFighter.TeamId;
                    matchingFightUnit.Alive = syncFighter.Alive;
                    matchingFightUnit.Stats = syncFighter.Stats;
                    if (syncFighter is Data.Game.Context.Fight.GameFightCharacterInformations)
                    {
                        Data.Game.Context.Fight.GameFightCharacterInformations syncCharacter = syncFighter as Data.Game.Context.Fight.GameFightCharacterInformations;
                        matchingFightUnit.Name = syncCharacter.Name;
                    }
                    else if (syncFighter is Data.Game.Context.Fight.GameFightMonsterInformations)
                    {
                        Data.Game.Context.Fight.GameFightMonsterInformations syncMonster = syncFighter as Data.Game.Context.Fight.GameFightMonsterInformations;
                        matchingFightUnit.Name = ((Dofusator.Data.Game.MonsterType)syncMonster.CreatureGenericId).ToString();
                    }
                }
                else
                {
                    onDebugLog("Received sync information befor units were defined with entities disposition message");
                }
            }
        }
    }

    private void HandleGameFightSummonMessage(Packets.Game.Packets.Actions.Fights.GameActionFightSummonMessage packet)
    {
        if (Self.UID == packet.SourceId)
        {
            if (packet.Summon is Dofusator.Data.Game.Context.Fight.GameFightMonsterInformations)
            {
                var summonMonsterInformations = packet.Summon as Dofusator.Data.Game.Context.Fight.GameFightMonsterInformations;
                onDebugLog("Summoned a creature of type " + summonMonsterInformations.CreatureGenericId);
                FightUnit summonedCreature = new FightUnit(summonMonsterInformations.Disposition, summonMonsterInformations.ContextualId);
                lock (FightUnitsLock)
                    this.FightUnits.Add(summonedCreature);
                this.Summon = summonedCreature;
            }
            else
            {
                onDebugLog("Received summon message but summon is not of type GameFightMonsterInformations");
            }
        }
        else
        {
            FightUnit summon = new FightUnit(packet.Summon.Disposition, packet.Summon.ContextualId);
            lock (FightUnitsLock)
                this.FightUnits.Add(summon);
        }
    }
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#15
Re: [Combat] Lancer un sort

Ok Ok mike je pourrait te parler en privé :p j'aurait une question?
 
A

Anonymous

Invité
#16
Re: [Combat] Lancer un sort

envoi un mp
 
A

Anonymous

Invité
#17
Re: [Combat] Lancer un sort

Bonjour,

Merci de votre aide je test tout sa...

Bonne journee
 
A

Anonymous

Invité
#18
Re: [Combat] Lancer un sort

Bonsoir,

Durant ces quelque jours j'ai bien etudier et sniffer tout les packets en combat.
J'ai reussi a resoudre mon décalage et j'en ai profité pour creer ma fonction pour verifier si le monstre est sur la portée de mon sort. Tout marche parfaitement, fonction combat au point. :D
Merci de votre aide a tous...
Sujet résolu !

Bonne soirée
 
A

Anonymous

Invité
#19
Re: [Résolu] Lancer un sort

Bonsoir,

j'up ce topic pour un petit problème avec mon packet 5921 (GameFightSynchronizeMessage).
Voila mon code:
Select Case ID_Message.fighters(i).protocolId
Case 46
'Humanoid()
'ID_Message.fighters(i).ContextualId, ID_Message.fighters(i).name, ID_Message.fighters(i).Level, ID_Message.fighters(i).stats.lifePoints.ToString, ID_Message.fighters(i).stats.maxLifePoints.ToString, ID_Message.fighters(i).disposition.cellId
Case 29
' monstre()
'ID_Message.fighters(i).ContextualId, Decode(I18nFile.ReadText(Monsters.ReadObject(ID_Message.fighters(i).creatureGenericId).nameid)), ID_Message.fighters(i).creatureGrade, ID_Message.fighters(i).stats.lifePoints.ToString, ID_Message.fighters(i).stats.maxLifePoints.ToString, ID_Message.fighters(i).disposition.cellId
If Not ID_Message.fighters(i).stats.lifePointegers.ToString = 0 Then
Invoke(list4, Listfightmonsters, ID_Message.fighters(i).ContextualId, ID_Message.fighters(i).disposition.cellId)
End If
End Select

Comme vous pouvez le voir je ne réceptionne la cellid d'un monstre que si il a une vie supérieur a 0.
If Not ID_Message.fighters(i).stats.lifePointegers.ToString = 0 Then
Invoke(list4, Listfightmonsters, ID_Message.fighters(i).ContextualId, ID_Message.fighters(i).disposition.cellId)
Mais mon code ne marche pas , je ne comprend pas. Pas d'erreur dans ma fenêtre de sortie sa fait plusieurs jours que je cherche. Mon bot attaque sans cesse un monstre qu'il vient de tuer...

Une idée ?

Bonne soirée
 
A

Anonymous

Invité
#20
"Tu abuses :"
T'as une variable "Alive" pour chaque perso dans le combat (monstre y compris)

Tu as également un packet : "GameActionFightDeathMessage"
 
Haut Bas