was man machen könnte wäre:
typedef struct {
unsigned short fae_castid;
char fae_bezeichnung[40];
unsigned char fae_schadensart;
unsigned char fae_klasse;
unsigned short fae_kosten;
var fae_castzeit;
var fae_cooldown;
unsigned char fae_reichweite;
char fae_icon[20];
char fae_tooltip[200];
} pl_faehigkeit;
typedef struct {
pl_faehigkeit faehigkeit[MAX_FAEHIGKEITEN];
} pl;
pl _pl[MAX_CONNECTIONS];
allerdings muss ich dazu noch sagen das du die ganzen daten eigentlich vermutlich nciht übers netzwerk schicken musst.
je nach spiel würde es vermutlich reichen die cast-id zu senden.
zu deiner 2. frage, die ich eben übersehen habe:
Das beispiel nutzt die sogenannte "Pointer-Arithmetik", ein feature von c, c++ und anscheind auch lite-c.
Hier eine kleine Einleitung, die leider kein beispiel mit structs macht:
http://manderc.manderby.com/operators/pointerarithmetic/index.phpallerdings hat das manual da meiner meinung nach einen fehler. statt
enet_send_data(players,sizeof(player_struct),BROADCAST);
müsste die erste zeile der function sending
enet_send_data(&players,sizeof(player_struct),BROADCAST);
heißen (beachte das
&). das gleiche auch bei dem beispiel welches du gepostet hast:
enet_send_data(&players+sizeof(var),sizeof(var),BROADCAST);
jetzt dazu noch eine kurze erklärung in meinen worten:
&players ist nicht nur der pointer auf die ganze struct, sondern zeigt generell auf den anfang der struct. nimmt man von &players nur 4 Byte (die länge eines vars), so hat man einen pointer auf die var health, die man auch ohne die struct verwenden kann.
&players +sizeof(var) schiebt den pointer nochmal 4 Bytes weiter. Nun zeigt er auf die var armor. nimmt man nur 4 Bytes (die sizeof(var) im längenfeld von enet_send_data), hat man den armor.
Somit kann man teile einer struct senden, ohne sie komplett übertragen zu müssen. einfacher wäre allerdings:
enet_send_data(&(players.armor), sizeof(var), BROADCAST);