Java D2P cellule de changement de map

Inscrit
15 Mai 2015
Messages
41
Reactions
0
#1
Salut tout le monde, je reviens après un long moment d'arrêt avec une nouvelle question.
Je me remets tranquillement au bot pendant les vacances et actuellement je suis sur les déplacements. Tout d'abord je voudrais juste pouvoir ajouter les fonctions top, bottom, right et left à mon bot. Elles consistent juste à se déplacer sur la map située au dessus, en dessous, à droite ou à gauche de la map actuelle.
Je pensais pouvoir utiliser les tableaux topArrowCell, bottomArrowCell, rightArrowCell et leftArrowCell mais ils sont toujours vides après l'analyse d'un fichier. Pourtant à la fin il ne reste plus aucun byte non lu. Peu import la map que je charge, les tableaux sont toujours vides.

Voici mon code :

(CellData:fromRaw)
Code:
public void fromRaw(ICustomDataInput input) throws Exception {
    int tmpbytesv9 = 0;
    boolean topArrow = false;
    boolean bottomArrow = false;
    boolean rightArrow = false;
    boolean leftArrow = false;
    int tmpBits = 0;

    floor = input.readByte() * 10;
    if (map.mapVersion >= 9) {
        tmpbytesv9 = input.readShort();
        mov = (tmpbytesv9 & 1) == 0;
        nonWalkableDuringFight = (tmpbytesv9 & 2) != 0;
        nonWalkableDuringRP = (tmpbytesv9 & 4) != 0;
        los = (tmpbytesv9 & 8) == 0;
        blue = (tmpbytesv9 & 16) == 0;
        red = (tmpbytesv9 & 32) != 0;
        visible = (tmpbytesv9 & 64) != 0;
        farmCell = (tmpbytesv9 & 128) != 0;
        if (map.mapVersion >= 10) {
            havenbagCell = (tmpbytesv9 & 256) != 0;
            topArrow = (tmpbytesv9 & 512) != 0;
            bottomArrow = (tmpbytesv9 & 1024) != 0;
            rightArrow = (tmpbytesv9 & 2048) != 0;
            leftArrow = (tmpbytesv9 & 4096) != 0;
        }
        else {
            topArrow = (tmpbytesv9 & 256) != 0;
            bottomArrow = (tmpbytesv9 & 512) != 0;
            rightArrow = (tmpbytesv9 & 1024) != 0;
            leftArrow = (tmpbytesv9 & 2048) != 0;
        }
        if (topArrow)
            map.topArrowCell.add(id);
        if (bottomArrow)
            map.bottomArrowCell.add(id);
        if (rightArrow)
            map.rightArrowCell.add(id);
        if(leftArrow)
            map.leftArrowCell.add(id);
    }
    else {
        losmov = input.readUnsignedByte();
        los = (losmov & 2) >> 1 == 1;
        mov = (losmov & 1) == 0;
        visible = (losmov & 64) >> 6 == 1;
        farmCell = (losmov & 32) >> 5 == 1;
        blue = (losmov & 16) >> 4 == 1;
        red = (losmov & 8) >> 3 == 1;
        nonWalkableDuringRP = (losmov & 128) >> 7 == 1;
        nonWalkableDuringFight = (losmov & 4) >> 2 == 1;
    }
    speed = input.readByte();
    mapChangeData = input.readByte();
    if (map.mapVersion > 5) {
        moveZone = input.readUnsignedByte();
    }
    if (map.mapVersion > 7 && map.mapVersion < 9) {
        tmpBits = input.readByte();
        arrow = 15 & tmpBits;
        if (useTopArrow())
            map.topArrowCell.add(id);
        if (useBottomArrow())
            map.bottomArrowCell.add(id);
        if (useLeftArrow())
            map.leftArrowCell.add(id);
        if (useRightArrow())
            map.rightArrowCell.add(id);
    }
}
(Map:fromRaw)
Code:
public void fromRaw(ICustomDataInput data) throws Exception {
        int oldMvtSystem = 0;

        int header = data.readByte();
        if (header != 77)
            throw new RuntimeException("ERROR HEADER!");

        mapVersion = data.readByte();
        id = data.readInt();
        if (mapVersion >= 7) {
            encrypted = data.readBoolean();
            encryptionVersion = data.readByte();
            int dataLen = data.readInt();
            if (encrypted) {
                byte decryptionKeyBytes[] = decryptionKey.getBytes();

                byte encryptedData[] = new byte[dataLen];
                data.readFully(encryptedData);
                for (int i = 0; i < encryptedData.length; ++i)
                    encryptedData[i] = (byte)(encryptedData[i] ^ decryptionKeyBytes[i % decryptionKeyBytes.length]);

                ByteArrayInputStream dataDecryptedBuffer = new ByteArrayInputStream(encryptedData);
                data = new CustomDataInput(dataDecryptedBuffer);
            }
        }
        relativeId = data.readInt();
        mapType = data.readByte();
        subareaId = data.readInt();
        topNeighbourId = data.readInt();
        bottomNeighbourId = data.readInt();
        leftNeighbourId = data.readInt();
        rightNeighbourId = data.readInt();
        shadowBonusOnEntities = data.readInt();

        if (mapVersion >= 9) {
            int readColor = data.readInt();
            backgroundAlpha = (int)((readColor & 4278190080L) >> 32);
            backgroundRed = (readColor & 16711680) >> 16;
            backgroundGreen = (readColor & 65280) >> 8;
            backgroundBlue = readColor & 255;
            readColor = data.readInt();
            int gridAlpha = (int)((readColor & 4278190080L) >> 32);
            int gridRed = (readColor & 16711680) >> 16;
            int gridGreen = (readColor & 65280) >> 8;
            int gridBlue = readColor & 255;
            gridColor = (gridAlpha & 255) << 32 | (gridRed & 255) << 16 | (gridGreen & 255) << 8 | gridBlue & 255;
        }
        else if (mapVersion >= 3) {
            backgroundRed = data.readByte();
            backgroundGreen = data.readByte();
            backgroundBlue = data.readByte();
        }
        backgroundColor = (backgroundAlpha & 255) << 32 | (backgroundRed & 255) << 16 | (backgroundGreen & 255) << 8 | backgroundBlue & 255;

        if (mapVersion >= 4) {
            zoomScale = data.readUnsignedShort() / 100;
            zoomOffsetX = data.readShort();
            zoomOffsetY = data.readShort();
            if (zoomScale < 1) {
                zoomScale = 1;
                zoomOffsetY = 0;
                zoomOffsetX = 0;
            }
        }
        useLowPassFilter = data.readByte() == 1;
        useReverb = data.readByte() == 1;
        if (useReverb)
            presetId = data.readInt();
        else
            presetId = -1;
        backgroundsCount = data.readByte();
        for (int i = 0; i < backgroundsCount; ++i) {
            Fixture tmp = new Fixture(this);
            tmp.fromRaw(data);
            backgroundsFixtures.add(tmp);
        }
        foregroundsCount = data.readByte();
        for (int i = 0; i < foregroundsCount; ++i) {
            Fixture tmp = new Fixture(this);
            tmp.fromRaw(data);
            foregroundFixtures.add(tmp);
        }
        cellsCount = AtouinConstants.MAP_CELLS_COUNT;
        data.readInt();
        groundCRC = data.readInt();

        layersCount = data.readByte();
        for (int i = 0; i < layersCount; ++i) {
            Layer tmp = new Layer(this, mapVersion);
            tmp.fromRaw(data);
            layers.add(tmp);
        }
        for (int i = 0; i < cellsCount; ++i) {
            CellData tmp = new CellData(this, i);
            tmp.fromRaw(data);
            if (oldMvtSystem == 0)
                oldMvtSystem = tmp.moveZone;
            if (tmp.moveZone != oldMvtSystem)
                isUsingNewMovementSystem = true;
            cells.add(tmp);
        }
    }
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#2
En effet, ils sont toujours vides, je ne sais pas à quoi ils servent. Tu vas devoir faire avec autre chose ;)

PS : Enfin quelqu'un qui code proprement.
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#3
Ah je pensais que cela venait de mon code. Je pense que tu parles de la variable mapChangeData qui permet pas mal d'informations ? Je vais aller jeter un coups d'oeil. Merci pour la confirmation, ça fait déjà pas mal de temps que je cherchais mon erreur.
PS : J'ai fait exprès de ne donner que les fonctions et pas la classe. Mon encapsulation est "magnifique". Mais ça, se sera pour une prochaine fois ;)
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#4
Les maps voisine sont transmissent par le serveur me semble.
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#5
si je me souviens bien (ce qui n'est pas le cas) tu a des variable du gerent "leftNeighborId" pour les quatre directions dans le currentMapMessage ou biens dans les dlm je sais plus ... et c'est maleureusement la seul info que tu obtiendra, pour changer de carte ensuite il te sufira simplement de deplacer le personages sur l'une des cellues en bordure et envoyer le changeMapMessage avec l'id de la map voisine mais le probléme c'est que dans le cas ou la map est couper en deux (comme beaucoup de carte en bordure des villes) il faudra determiner de quelle cotée de la bariére il faudra se deplacer est c'est la que les chose se pimente
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#6
Merci pour ces précisions. Je pensais convertir une map en graphe. Chaque cellule est un noeud, celle où est situé mon personnage devient le départ et toutes celles qui permettent de changer vers la map souhaitée deviennent des arrivés. Chaque cellule aura un arc vers ses voisins sauf si ils sont inaccessibles. A* devrait pouvoir faire le reste correctement je pense.
Par contre je suis encore à la recherche de la l'ID de la cellule où est mon personnage si quelqu'un pourrait m'éclairer x)
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#7
Par contre je suis encore à la recherche de la l'ID de la cellule où est mon personnage si quelqu'un pourrait m'éclairer x)
look le mapcomplementaryinformations, tu y trouveras la cellid.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Bonsoir,

Tu reçois ta position initiale sur la carte via la liste des actors du paquet MapComplementaryInformationsDataMessage ou ses dérivés MapComplementaryInformationsWithCoordsMessage, MapComplementaryInformationsDataInHavenBagMessage, MapComplementaryInformationsDataInHouseMessage.

Les actors sont tous les personnages, monstres et PNJ sur la carte.
Tu récupères ton personnage via son ID et tu auras accès à sa position ainsi que sa direction.

Sa position est mise à jour via le GameMapMovementMessage.
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#9
Merci Alexandre pour ces précisions, j'essaie de faire comme ça. Ce qui est sympa avec ces paquets c'est qu'ils dépendent de beaucoup trop d'autres paquets :mad:
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#10
Fais ton traducteur automatique :p
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#11
Il serait grand temps, oui... J'ajoute en TODO ;)
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#12
Les maps voisine sont transmissent par le serveur me semble.
Oui et non oui car le serveur a besoin de les envoyer et non car j'ai pu récupérer les map voisine depuis les dlm
il faut juste lire correctement les infos pour ne pas avoir de décalage ^^
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#13
Toute les maps voisine sont dans les MapCoodinates, juste un petit peux de logique pour distinguer les maps simple, maison, autre zone comme Incarnam, etc ...
 
Haut Bas