lundi 18 décembre 2006

courte nouvelle

Pour ceux(celle) qui on de la difficulté à installé le serveur j'ai mis un installateur sur sourceforge : http://sourceforge.net/projects/javathena/

Et j'ai retirer temporairement la console.

mardi 12 décembre 2006

La solution aux struct

J'ai finalement trouvé une solution. Et cela était plus simple que je le pensait.
Exemple pour PartyMember:

public void toByteTable(byte[] tab, int startInd)
{
//copi l'entier à partir de startInd j'usqu'à (startInd + la longueur du champ)
Functions.intToByteTab(account_id, startInd,
startInd += Constants.INT_LENTH, tab);
Functions.intToByteTab(char_id, startInd,
startInd += Constants.INT_LENTH, tab);
//les String sont en fait des tableaux de charatères(char) et un char a
//la même dimention qu'un byte
Functions.stringToUnsignedByteTable(name, tab, startInd,
startInd += Constants.NAME_LENGTH);
Functions.intToByteTab(class_, startInd,
startInd += Constants.SHORT_LENTH, tab);
Functions.intToByteTab(map, startInd,
startInd += Constants.SHORT_LENTH, tab);
Functions.intToByteTab(lv, startInd, startInd += Constants.SHORT_LENTH,
tab);
Functions.intToByteTab(leader ? 1 : 0, startInd, startInd++, tab);
Functions.intToByteTab(online ? 1 : 0, startInd, startInd++, tab);
}
Functions.intToByteTab(int aInt, int startInd, int endInd, byte[] aByteTab) :

public static void intToByteTab(int aInt, int startInd, int endInd, byte[] aByteTab)
{
for (int i = startInd; i < endInd && aInt != 0; i++)
{
//donne le reste de la division de l'entier par 256
aByteTab[i] = (byte) (aInt % 256);
aInt /= 256;
}
}

exemple après l'exécutionde
Functions.intToByteTab(1283402, 0, 4, aByteTab);
aByteTab contiendra : {74, 149, 19, 0}
dans le sens inverse : 74 * 256^0 + 149 * 256^1 + 19 * 256^2 + 0 * 256^3

dimanche 10 décembre 2006

Les structs pausent problèmes

Les structs sont un peu l'encêtre des object en java ou en C++. Ils regroupent un ensemble de variables, mais ils ne peuvent ni contenir de méthode, ni de contructeur et ils ont d'autre particularitées dont je ne ferai pas mention ici.

Le problème que pausent les structs dans eathena n'est pas dans sa convertion en tant que tel mais plutot lors déchanges entre le serveur char et le le serveur map. En effet lors du transfère le struct est transformer implicitement en tableau.
Exemple dans int_party.c :

int mapif_party_info(int fd, struct party *p)
{
unsigned char buf[2048];

WBUFW(buf,0) = 0x3821; //entête du paquet
//buf + 4 dis à memcpy de copier la variable p dans le tableau buff à partir de
//l'index 4 du tableau
//sizeof(struct party) donne la quantité de memoire pour necessaire pour stocké //le struct dans le tableau
memcpy(buf + 4, p, sizeof(struct party));
// ajoute la dimention du tableau
WBUFW(buf,2) = 4 + sizeof(struct party);
if (fd < 0)
mapif_sendall(buf, WBUFW(buf,2));
else
mapif_send(fd, buf, WBUFW(buf,2));
return 0;
}
La difficulter est donc de transformé un object java en tableau compatible avec ce que le serveur map attend, ce qui à première vue me semble fesable mais long et un peu compliquer. J'ai déja une petite idée de ce que je vais faire. Dès que cela sera foncionnel je la mettrai sur mon blogue.

mardi 5 décembre 2006

Beanshell

Beanshell est un terminal java qui interprète du code java directement sans compile.
Il peut interpréter aussi un langage scripte semblable au java. Je pense qu'il pourrait êtres tres utiles a mon projet javAthena. J'ai d'ailleurs fait une console pour le serveur login JavAthena il est disponible sur : https://sourceforge.net/projects/javathena/ .

JavAthena se sert aussi de javolution une librairie principalement de collection comme fastTable, fastMap, etc. Ces class ont leurs équivalents dans la jdk de sun mais elles sont plus rapide lorsqu'elles contiennent de grandes quantité d'information.