Récupérer ressources/FarmCell de la map

Inscrit
13 Avril 2016
Messages
27
Reactions
0
#1
Salut salut,

Je reviens pour un nouveau problème que je rencontre, je vais résumer rapidement.
Actuellement j'arrive a récupérer les infos des "farmCell". Sur certaines map ça fonction mais sur la plupart ça marche pas du tout. :(

Donc d'après mes test/analyse, le serveur envoi MapComplementaryInformationsDataMessage, avec StatedElement pour savoir si il est récoltable ou pas, et InteractiveElement pour les autres infos pour la lecture d2o.
Déjà premier question, pourquoi il y plus d'InteractiveElement que de ressources sur la map ?

Ensuite je compare l'elementID du de chaques InteractiveElement reçus avec l'identifier du GraphicalElement des dlm et si c'est les mêmes alors ça veut dire que la cell est une farmCell.

Sauf que sur la plupart des maps, il y a les "bonne" cell mais le reste c'est des cell où il n'y a absolument rien comme ressource.

Par exemple sur cette map on voit bien 3 ressources.



Sauf que moi j’obtiens les 3, mais 2 de trop.



Voici le code :

C#:
StaticInfos.element.Clear();
foreach (InteractiveElement i in mcidm.interactiveElements)
{
   if (i is InteractiveElementWithAgeBonus)
      StaticInfos.element.Add(i as InteractiveElementWithAgeBonus);
}
StaticInfos.statedElement = mcidm.statedElements;
MainWindow._MainWindow.setRessourceOnMap();

La fonction qui m'affiche les données :

C#:
string canGather = "";
string ressourceName;
MapData.setFarmCell();
ressourceOnMap.Items.Clear();
foreach (UsableElement i in StaticInfos.usableElement)
{
   foreach (InteractiveElementSkill ie in i.skills)
   {
      DataClass d = GameData.GetDataObject("Skills", ie.skillId);
      if ((int)d.Fields["gatheredRessourceItem"] == -1)
             continue;
      int iId = (int)d.Fields["interactiveId"];
      ressourceName = I18n.GetText((int)GameData.GetDataObject("Interactives", iId).Fields["nameId"]);
      foreach (StatedElement se in StaticInfos.statedElement)
      {
          if (se.elementId == i.elementId)
          {
             canGather = se.elementState == 0 ? "Non" : "Oui";
                break;
          }
       }
       ressourceOnMap.Items.Add(new RessourceOnMap() { Name = ressourceName, cellId = i.cellId ,canGather = canGather});
         canGather = "";
      }
   }
}

C#:
UsableElement item;
bool Bool = true;
StaticInfos.usableElement.Clear();
foreach (InteractiveElementWithAgeBonus i in StaticInfos.element)
{
   InteractiveElementWithAgeBonus ie = (InteractiveElementWithAgeBonus)i;
   if (ie.enabledSkills.Count >= 1)
   {
      foreach (Layer l in Data.layers)
      {
         foreach (Cell c in l.cells)
         {
            foreach (BasicElement b in c.elements)
            {
               if (b is GraphicalElement)
               {
                  GraphicalElement ge = b as GraphicalElement;
                  if (ge.identifier == ie.elementId)
                  {
                     item = new UsableElement()
                     {
                        cellId = c.cellId,
                        elementId = ie.elementId,
                        element = ie,
                        skills = ie.enabledSkills
                     };
                     foreach (UsableElement u in StaticInfos.usableElement)
                     {
                        if (u.cellId == item.cellId)
                           Bool = false;
                      }
                      if (Bool)
                         StaticInfos.usableElement.Add(item);
                      Bool = true;
                   }
                }
             }
          }
       }
    }
 }

Voilà si quelqu'un pourrais m'aider et me dire comment récupérer parfaitement les cells, ou me corriger ça serai top :)
 
Inscrit
16 Mars 2014
Messages
214
Reactions
30
#2
T'es sur qu'il n'y a que 3 ressources sur la maps ? Y'a une touche pour mettre en surbrillance les interactives, ressources fait le et regarde bien
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#3
Oui oui, certain.
 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#4
Avec le nouveau systeme des map en 16:9 il. À pas une histoire de chopper les éléments interactif des maps de droite et de gauche ?
 
Inscrit
18 Septembre 2016
Messages
7
Reactions
0
#5
Salut,

Est-il possible que ça prenne en compte les éléments se trouvant sur les maps autour ?
 
Inscrit
16 Mars 2014
Messages
214
Reactions
30
#6
Avec le nouveau systeme des map en 16:9 il. À pas une histoire de chopper les éléments interactif des maps de droite et de gauche ?
Je pense pas vue que ce que tu voit sur le côté n'est qu'une image il me semble et pas un bout de map

Salut,

Est-il possible que ça prenne en compte les éléments se trouvant sur les maps autour ?
Non
 

Arth

Contributeur
Inscrit
28 Aout 2016
Messages
80
Reactions
3
#7
Je pense pas vue que ce que tu voit sur le côté n'est qu'une image il me semble et pas un bout de map
Pour le client en tout cas ce n'est pas une image. En testant la nouvelle interface en étant bûcheron, j'ai à de nombreuses reprises pu cliquer sur un arbre de la map voisine.
Et le client répond que l'action est impossible ^^.
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#8
Bon je pense avoir résolu mon problème pour l'instant, j'ai rajouté une boucle qui vérifie que la cell récupéré dans les dlm correspond bien aux cells de StatedElement, ça semble faire le taff.

C#:
public static void setFarmCell()
        {
            UsableElement item;
            bool Bool = true;
            StaticInfos.usableElement.Clear();
            foreach (InteractiveElement i in StaticInfos.element)
            {
                InteractiveElement ie = i as InteractiveElement;
                foreach (Layer l in Data.layers)
                {
                    foreach (Cell c in l.cells)
                    {
                        foreach (BasicElement b in c.elements)
                        {
                            if (b is GraphicalElement)
                            {
                                GraphicalElement ge = b as GraphicalElement;
                                if (ge.identifier == ie.elementId)
                                {
                                    foreach (StatedElement cId in StaticInfos.statedElement)
                                    {
                                        if (cId.elementCellId == c.cellId)
                                        {
                                            item = new UsableElement()
                                            {
                                                cellId = (short)cId.elementCellId,
                                                elementId = ie.elementId,
                                                element = ie,
                                                skills = ie.enabledSkills
                                            };
                                            foreach (UsableElement u in StaticInfos.usableElement)
                                            {
                                                if (u.cellId == item.cellId)
                                                    Bool = false;
                                            }
                                            if (Bool)
                                                StaticInfos.usableElement.Add(item);
                                            Bool = true;
                                            break;
                                        }
                                    }
                                   
                                }
                            }
                        }
                    }
                }
            }
           
        }
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#9
Ah, hé bien non, ça marche bcp mieux mais il y a encore quelques ressources en trop qui n'existe pas.

Edit : Bon j'ai juste ce problème sur une map, mais il me l'affiche comme non récoltable donc pas de problème.
Du coup ça fonction niquel c'est bon :)
 
Dernière édition:
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#10
Bon au final, il y a toujours un problème.
En [2,-2] (cellid 293) a incarnam il me sort un frêne en trop qui existe paset qui est dit "récoltable" donc bon bot bloque dessus vu qu'il arrive pas a le couper, une idée ?

C'est le seul problème que j'ai rencontré actuellement, sinon ça marche partout.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#11
Ah mon avis tu peux vérifier l'existence de l'interactive sur ta carte avec les graphicalElements.
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#12
C'est se que je fais avec l'identifier.
Après une longue série de débogage, j'ai pas trouvé d'autres similitude des variables d'InteractiveElement avec celles de graphicalElements.

Altitude est toujours = à 0.
Cell : Rien d'exploitable.
ElementId j'ai pas trouvé a quoi ça correspond.
Identifier qui me filtre mes ressources a quelques exceptions.
Offset/PixelOffset : inexploitable.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#13
Tu as raté l'élément essentiel justement, l'elementId. C'est un identificateur qui donne un UID différent à chaque interactive.
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#14
Tu as raté l'élément essentiel justement, l'elementId. C'est un identificateur qui donne un UID différent à chaque interactive.
chez moi c'était l'identifier et non pas InteractiveId, InteractiveId c'est pour faire le lien avec le fichier ele
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#15
Voila de quelle manière je vérifie l'existence d'une porte sur une carte à l'aide des graphicalElements, je pense que tu peux faire de même pour tout autre interactive.

C#:
  foreach (Layer layer in Map.Data.Layers)
  {
     foreach (Cell cell in layer.Cells)
     {
        foreach (BasicElement layerElement in cell.Elements)
        {
           if (layerElement is GraphicalElement)
           {
              GraphicalElement graphicalElement = (GraphicalElement)layerElement;
              if (graphicalElement.Identifier == element.elementId)
                 Doors.Add(new MapDoorEntry(cell.CellId, element));
            }
          }
      }
  }
 
Inscrit
24 Septembre 2016
Messages
17
Reactions
0
#16
Alexandre, cette méthode t'avancera pas à grand chose, il me semble que de mon coté j'avais testé et en faite ton bot affichera les portes sur la carte et sur les maps voisines. Donc ta méthode n'est pas la bonne il me semble.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#17
Une fois que tu as le graphicalElement, tu as accès aux coordonnées de celui-ci, tu as juste à vérifier si l'interactive fait bien partie de ta zone de jeu ou du décor. @Sapeuh
 
Inscrit
24 Septembre 2016
Messages
17
Reactions
0
#18
c'est donc à ça que les variables servent ^^
 
Inscrit
13 Avril 2016
Messages
27
Reactions
0
#19
A quelle moment tu utilise l'elementId des graphicalElements ?
J'imagine que tu fais allusion a l'elementId du InteractiveElement ?

Une fois que tu as le graphicalElement, tu as accès aux coordonnées de celui-ci, tu as juste à vérifier si l'interactive fait bien partie de ta zone de jeu ou du décor. @Sapeuh
Comment si je ne m’abuse ? Car tout le problème est la a mon avis.
J'ai essayer de récupérer la mapid des cells problématiques mais c'est la même que là où je suis.
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#20
Via le MapComplementaryInformationsDataMessage (226) avec la méthode que je t'ai fourni un peu plus haut.

C#:
  foreach (Layer layer in Map.Data.Layers)
  {
     foreach (Cell cell in layer.Cells)
     {
        foreach (BasicElement layerElement in cell.Elements)
        {
           if (layerElement is GraphicalElement)
           {
              GraphicalElement graphicalElement = (GraphicalElement)layerElement;
              if (graphicalElement.Identifier == element.elementId)
                 Doors.Add(new MapDoorEntry(cell.CellId, element));
            }
          }
      }
  }
L'identifier correspond à l'elementId de l'interactive.
Les graphicalElements sont dans les D2P.

Après pour les positions tu fais de simples calculs, tu étudies un peu la chose.
 
Dernière édition:
Haut Bas