Gamestudio Links
Zorro Links
Newest Posts
Zorro 2.70
by jcl. 09/29/25 09:24
optimize global parameters SOLVED
by dBc. 09/27/25 17:07
ZorroGPT
by TipmyPip. 09/27/25 10:05
assetHistory one candle shift
by jcl. 09/21/25 11:36
Plugins update
by Grant. 09/17/25 16:28
AUM Magazine
Latest Screens
Rocker`s Revenge
Stug 3 Stormartillery
Iljuschin 2
Galactic Strike X
Who's Online Now
0 registered members (), 18,008 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
krishna, DrissB, James168, Ed_Love, xtns
19168 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
[ANET]enet_send_data Struct nur variable? #376919
07/07/11 19:12
07/07/11 19:12
Joined: Jan 2008
Posts: 58
A
Asgadir Offline OP
Junior Member
Asgadir  Offline OP
Junior Member
A

Joined: Jan 2008
Posts: 58
Hi,
ich teste das jetzt seit ein paar tagen. Da mir nichts mehr einfällt die frage: Kann man mit enet_send_data nur rein nummerische inhalte von structs übertragen? Zahlen kommen einwandfrei an, leider keine texte.

Hier ein beispiel:

Code:
typedef struct {
	
	unsigned short		fae_castid[MAX_FAEHIGKEITEN];			
	STRING  	       *fae_bezeichnung[MAX_FAEHIGKEITEN];
	unsigned char		fae_schadensart[MAX_FAEHIGKEITEN];
	unsigned char		fae_klasse[MAX_FAEHIGKEITEN];
	unsigned short		fae_kosten[MAX_FAEHIGKEITEN];
	var			fae_castzeit[MAX_FAEHIGKEITEN];
	var			fae_cooldown[MAX_FAEHIGKEITEN];
	unsigned char		fae_reichweite[MAX_FAEHIGKEITEN];
	STRING  	       *fae_icon[MAX_FAEHIGKEITEN];
	STRING  	       *fae_tooltip[MAX_FAEHIGKEITEN];
	
} pl_faehigkeiten;

	pl_faehigkeiten _pl_faehigkeiten[MAX_CONNECTIONS];		
	memset(_pl_faehigkeiten[0],0,sizeof(pl_faehigkeiten));

enet_send_data(_pl_faehigkeiten,sizeof(pl_faehigkeiten),SERVER);



Auch ist mir das hier aus dem manual ein wenig unklar. Wir kann ich hier die armor werte schicken wenn diese in dem sendebefehl nirgends auftauchen?
//Sendet armor von players:
enet_send_data(players+sizeof(var),sizeof(var),BROADCAST);

Danke schonmal und einen schönen abend noch.
-Asgadir

Re: [ANET]enet_send_data Struct nur variable? [Re: Asgadir] #376926
07/07/11 19:34
07/07/11 19:34
Joined: Nov 2002
Posts: 913
Berlin, Germany
S
SchokoKeks Offline
User
SchokoKeks  Offline
User
S

Joined: Nov 2002
Posts: 913
Berlin, Germany
das ist in der tat etwas tricky:
es können nur texte mit fixer maximaler länge übertragen werden. du musst die länger in der struct festlegen

STRING* fallen da schon komplett weg, da der datentyp immer variabel gespeichert wird.
du kannst nur char arrays übertragen, beispiel:

typedef struct {
var variable;
char text[40];
}

jetzt hast du mit deiner struct natürlich ein problem, da es ja keine multidimensionalen arrys in lite-c gibt.

und noch was: um das gesammte array _pl_faehigkeiten[MAX_CONNECTIONS] zu senden, musst du folgendes machen:
enet_send_data(_pl_faehigkeiten,sizeof(pl_faehigkeiten) * MAX_CONNECTIONS,SERVER);
vlt wusstest du das ja auch schon.

Re: [ANET]enet_send_data Struct nur variable? [Re: SchokoKeks] #376930
07/07/11 20:13
07/07/11 20:13
Joined: Jan 2008
Posts: 58
A
Asgadir Offline OP
Junior Member
Asgadir  Offline OP
Junior Member
A

Joined: Jan 2008
Posts: 58
Erst mal vielen dank für die schnelle info.

Mal sehen wie ich das löse. Und, nein, das mit dem übertragen des gesammten array kannte ich noch nicht. Gut zu wissen. Dank dir!

Re: [ANET]enet_send_data Struct nur variable? [Re: Asgadir] #376940
07/07/11 20:51
07/07/11 20:51
Joined: Nov 2002
Posts: 913
Berlin, Germany
S
SchokoKeks Offline
User
SchokoKeks  Offline
User
S

Joined: Nov 2002
Posts: 913
Berlin, Germany
was man machen könnte wäre:
Code:
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.php


allerdings hat das manual da meiner meinung nach einen fehler. statt

Code:
enet_send_data(players,sizeof(player_struct),BROADCAST);



müsste die erste zeile der function sending

Code:
enet_send_data(&players,sizeof(player_struct),BROADCAST);



heißen (beachte das &). das gleiche auch bei dem beispiel welches du gepostet hast:

Code:
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);




Re: [ANET]enet_send_data Struct nur variable? [Re: SchokoKeks] #376968
07/08/11 06:30
07/08/11 06:30
Joined: Jan 2008
Posts: 58
A
Asgadir Offline OP
Junior Member
Asgadir  Offline OP
Junior Member
A

Joined: Jan 2008
Posts: 58
Guten morgen,

die struct, und noch einige andere, werden innerhalb des loginprozesses an den client geschickt und erfüllen auf dem client mehrere funktionen, die auf clientseite allerdings alle kosmetischer natur sind und im spielbetrieb einfach traffic sparen sollen.

Diese ist in erster linie für die spielerinformation, die so schnell abrufbar sind, ohne das netz zu belasten. Der server schickt nur änderungen. So kann die castzeit differieren, abhängig von anderen werten wie z.b. einer thempowertung, die kosten können steigen oder fallen, abhängig vom lvl usw. Sie beinhaltet aber keinen schadenswert. Der ist reine serversache und wird so gehandhabt, wie du es vorschlägst - es wird nur die castID geschickt.

In meinem beispiel hatte ich einfach die nächst beste sendeanweisung reingebastelt.
Gedacht war das ganze in etwa so, wobei jetzt die komplette übertragung nach deinem beispiel mehr sinn macht als die einzel zu übertragen.
Code:
enet_send_data(_pl_faehigkeiten[arraywert],sizeof(pl_faehigkeiten),clienID);


um die bekannten fähigkeiten an den client zu übertragen.

Die pointer-arithmetik ist mir im groben vertraut, auch wenn ich zugeben muß, daß ich mit C in allen spielarten nicht viel anfangen kann. Ist alles viel zu umständlich *g

Ich sehe das mit dem fehler im manual auch so, was der grund für meine verwirrtheit ist. Zum anderen ist diese form der syntax, gerade für einstiger, völlig unverständlich. Ich habe z.b. structs mit weit über 200 einträgen. Wie würde das "+sizeof(var)" real aussehen, wenn ich den 175zigsten senden will? Ich denke, daß sollte dark_samurai nochmal überarbeiten. Selbst fortgeschrittene einsteiger haben bekanntermaßen probleme mit dem verständnis im bereich der strukturen und pointer. Ich denke auch, ich bin nicht der einzigste, der bei einer syntaxbeschreibung innerhalb einer anleitung erstmal davon ausgeht, daß der entwickler das fest vorgegeben hat. Experimente kosten bekanntlich eine unmenge an zeit.

Vielen dank auch für dein beispiel und die erklärungen unten. Da erkennt man recht gut, daß man die beschreibungen im manual doch recht flexibel betrachten sollte.


Last edited by Asgadir; 07/08/11 06:38.

Moderated by  HeelX, Spirit 

Gamestudio download | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1