Bonsoir,
Oui, vous vous dîtes, BlueDream en train de poser une question ! Comment est-ce possible ? (Ma dernière question remonte à Mars 2015)
Eh bien je vous avoue que cela fait longtemps que je n'ai pas été bloqué de cette manière !
J'ai fait un système de lecture de Maps assez basique, semblable à ceux de beaucoup de bots et je me retrouve face à un gros problème.
En effet il se trouve que j'ai découvert UNE map qui ne fonctionne pas avec mon système (une mais surement d'autres biens cachées :) )
Il s'agit de la carte qui se trouve en [1,-8], tout près d'astrub dont la mapId est 70778880.
Voici la carte en jeu:
Cliquez pour révéler
Cliquez pour masquer
Loading Image
Voici la carte représentée par mon bot: (Les cellules bleu étant des interactives)
Cliquez pour révéler
Cliquez pour masquer
Loading Image
On voit clairement que je n'ai pas du tout la bonne map. Je ne viens évidemment pas vous demander de l'aide juste en ayant constaté l'existence de ce problème dans mon projet.
J'ai effectué des recherches ! Et je ne suis pas le seul, Rebirth Bot est dans le même cas que moi (que ce soit la version 1.0 ou 2.0). Les classes provenant pour la plus part de BehaviorIsManaged.
Et il se trouve que BiM a mis en place un système de priorité, en effet il charge l'intégralité des cartes au démarrage du programme, et les classe par Zone, Coordonnées et MapId.
Ce que je ne peux actuellement pas faire, vu la consommation en mémoire que je recherche, qui est d'ailleurs plus que correct à l'heure actuelle.
Voici la fonction de BiM:
Cliquez pour révéler
Cliquez pour masquer
public ProgressionCounter BeginGeneration()
{
var progression = new ProgressionCounter();
var maps = MapsManager.Instance.EnumerateMaps();
Task.Factory.StartNew(() =>
{
// step 1 : load areas stuff
progression.UpdateValue(0, "(1/4) Getting areas ...");
m_subAreas = ObjectDataManager.Instance.EnumerateObjects<SubArea>().ToDictionary(x => x.id);
progression.UpdateValue(33);
m_areas = ObjectDataManager.Instance.EnumerateObjects<Area>().ToDictionary(x => x.id);
progression.UpdateValue(66);
m_superAreas = ObjectDataManager.Instance.EnumerateObjects<SuperArea>().ToDictionary(x => x.id);
progression.UpdateValue(100);
// step 2 : bind to each map his parents areas
progression.UpdateValue(0, "(2/4) Getting maps ...");
var mapsPosition = new List<MapPositionData>();
int counter = 0;
progression.Total = MapsManager.Instance.MapsCount;
foreach (var map in maps)
{
var pos = new Point(map.X, map.Y);
var subArea = m_subAreas.ContainsKey(map.SubAreaId) ? m_subAreas[map.SubAreaId] : null;
var area = subArea != null && m_areas.ContainsKey(subArea.areaId) ? m_areas[subArea.areaId] : null;
var superArea = area != null && m_subAreas.ContainsKey(area.superAreaId) ? m_superAreas[area.superAreaId] : null;
var mapWithPrority = new MapWithPriority(map);
if (subArea != null)
{
m_subAreaMaps.AddRegion(subArea.id, map.Id);
m_subAreaMaps.AddMap(subArea.id, pos, mapWithPrority);
}
if (area != null)
{
if (!m_areaChildrens.ContainsRegion(area.id, subArea.id))
m_areaChildrens.AddRegion(area.id, subArea.id);
m_areaChildrens.AddMap(area.id, pos, mapWithPrority);
}
if (superArea != null)
{
if (!m_superAreaChildrens.ContainsRegion(superArea.id, area.id))
m_superAreaChildrens.AddRegion(superArea.id, area.id);
m_superAreaChildrens.AddMap(superArea.id, pos, mapWithPrority);
}
int? worldmapId = superArea != null ? (int?)superArea.worldmapId : null;
if (superArea != null)
{
if (!m_worldMapsChildrens.ContainsRegion(worldmapId.Value, superArea.id))
m_worldMapsChildrens.AddRegion(worldmapId.Value, superArea.id);
m_worldMapsChildrens.AddMap(worldmapId.Value, pos, mapWithPrority);
}
mapsPosition.Add(new MapPositionData
{
MapId = map.Id,
SubAreaId = subArea != null ? subArea.id : (int?) null,
AreaId = area != null ? area.id : (int?) null,
SuperAreaId = superArea != null ? superArea.id : (int?) null,
WorldMapId = worldmapId,
X = map.X,
Y = map.Y
});
progression.UpdateValue(counter++);
}
progression.UpdateValue(0, "(3/4) Finding neighbours ...");
progression.Total = mapsPosition.Count;
// step 3 : found for each map his neighbours
foreach (var map in mapsPosition)
{
var enumerator = FindMapNeighbours(map).GetEnumerator();
enumerator.MoveNext();
map.RightNeighbourId = enumerator.Current;
enumerator.MoveNext();
map.TopNeighbourId = enumerator.Current;
enumerator.MoveNext();
map.LeftNeighbourId = enumerator.Current;
enumerator.MoveNext();
map.BottomNeighbourId = enumerator.Current;
Debug.Assert(!enumerator.MoveNext());
progression.Value++;
}
progression.UpdateValue(0, "(4/4) Saving ...");
// step 4 : save all the datas and dispose the allocated lists
using (var client = GetClient())
{
var typed = client.As<MapPositionData>();
typed.SetRangeInHash(typed.GetHash<int>(REDIS_KEY), mapsPosition.ToDictionary(x => x.MapId));
client.Set(REDIS_VERSION, VERSION);
}
// dispose
m_subAreaMaps.Dispose();
m_areaChildrens.Dispose();
m_superAreaChildrens.Dispose();
m_worldMapsChildrens.Dispose();
m_subAreas.Clear();
m_areas.Clear();
m_superAreas.Clear();
progression.NotifyEnded();
});
return progression;
}
Donc a priori il y aurait des maps qui auraient les même mapId, je me suis donc permis de faire une recherche dans l'intégralité des fichiers D2P pour y trouver un quelconque fichier DLM qui contiendrait dans son nom ma MapId. Eh bien il n'y en a qu'un, celui que j'utilise à l'heure actuelle: DlmName = 0/70778880.dlm contenue dans le fichier D2P app\\content\\maps\\maps1.d2p.
Je suis totalement frustré et perdu dans une incompréhension totale. Je ne vous donnerai pas de code car mon système est très semblable à celui de Rebirth.
J'effectue une recherche dans les fichiers D2P, pour savoir lequel contiendrait le fichier DLM correspondant à:
((id % 10).ToString() + "/" + id.ToString() + ".dlm")
soit 0/70778880.dlm dans notre cas, puis je lis simplement le fichier. Tout ce qu'il y a de plus basique.
Le système de BiM me parait très optimisé mais lourd et surtout que je ne trouve même pas d'autres fichiers DLM avec la même MapId.
Je ne vais surement pas en dormir de la nuit une fois de plus, c'est pour ca que je fais appel à VOUS ! :ugeek:
Développeurs, geek, quiconque que vous soyez ! Aidez moi dans mon désarroi !
Bonne soirée, si vous avez la moindre idée n'hésitez pas