Po roce žádost o píchnutí :) (DWORD flagy) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Po roce žádost o píchnutí :) (DWORD flagy) – C / C++ – Fórum – Programujte.comPo roce žádost o píchnutí :) (DWORD flagy) – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
CZIvo0
Newbie
29. 6. 2017   #1
-
0
-

Ahoj všem, zase se obracím o drobnou pomoc k někomu tady, zatím jste mi vždy dobře poradili a já si toho velice cenním.

Teď již k tématu:

mám DWORD dwSettings[2];

(musel jsem použít pole, protože mám definováno víc než 32 flagů, takže dwSettings[0] a dwSettings[1])..

ale mám problém s funkcí, která se volá při čtení configu a má nastavovat flagy. 


void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
   int ptr = num / 32;

   int flag = num % 32;

   if(status==1)
     dwSettings[ptr] |= num;
   else
     dwSettings[ptr] &= ~num;

g_pGameServerShell->RDbg(ptr, dwSettings[ptr], -1);
//vypíšeme si do debug logu ptr (0/1), a výpis hodnoty celého DWORDu
//-1 značí, že RDbg() zavolala nějaká vnitřní funkce a neobsahuje
//data o klientovi (odesílateli)
}

a problém je jednoduchý, aplikace hapá vždycky na řádku

int ptr = num / 32;

myslel jsem že / bude fungovat - pokud je num/32 tak to hodí 1, pokud ne, hodí 0, modulo by mělo posouvat ten flag když tam přijde flag větší než je schopno pojmout dwSettings[0] tak ho uloží do [1] zase od nuly..

jakože flagy 0,1.......31 do [0]

a flagy 32, 33, ... 36 jako 0, 1, 2, 3.. do [1]

volání probíhá pro představu takhle:

...
if(Settings[18]=='1') {SetFlag(FLAG_IDINNAMES,1);} else{SetFlag(FLAG_IDINNAMES,0);}
...

int ptr = num / 32; (snažím se flagy 0-31 cpát do dwSettings[0] a další do dwSettings[1]), neví někdo kde je chyba? Musel jsem to udělat takhle, protože moje visual studio podporuje jen 32bitová pole (VS6, nesmějte se :D), nemůžu použít třeba DWORD64 a nebo LONG LONG a bohužel mám 36 flagů (0-36, takže vlastně 37) tzn. jsem nucen použít dva DWORDy.

Pokud někdo poradí budu rád :)

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #2
-
0
-

#1 CZIvo
hele zkus si tu proměnou ptr natypovat jako DWORD

DWORD ptr = num/32

nebo num v argumentech jako int - rozsah by měl být více než dostačující

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
29. 6. 2017   #3
-
0
-

#2 MilanL
a pokud by nefachalo to typování, tak přes

1) podmínku num<32 ptr =0 else ptr=1

2) přes rotaci a masku  ptr = (num >> 5) || 1

Nahlásit jako SPAM
IP: 91.139.9.–
CZIvo0
Newbie
29. 6. 2017   #4
-
0
-

Udělal jsem, ale pořád to padá.. trochu jsem tu funkci upravil, ale asi nějak špatně odečítám ty flagy po else if?

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
	/*int*/DWORD ptr = num / 32;

	//int flag = num % 32;
if(ptr==0)
{
	if(Status==1)
		dwSettings[ptr] |= num;
	else
		dwSettings[ptr] &= ~num;
}
else if(ptr==1)
{
	if(Status==1)
		dwSettings[ptr] |= num-32;
	else
		dwSettings[ptr] &= ~num-32;
}
}
Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #5
-
0
-

#4 CZIvo

jestli ti funguje to přetypování u ptr udělej si to samé u Flags

u přiřazení do flagu si musíš narotovat 1 nebo 0 o počet ve flags

tzn 

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
   DWORD ptr = num / 32;

   DWORD flag = num % 32;

   if(status==1)
     dwSettings[ptr] |= (1 << flag);
   else
     dwSettings[ptr] &= ~(1 << flag);


g_pGameServerShell->RDbg(ptr, dwSettings[ptr], -1);
//vypíšeme si do debug logu ptr (0/1), a výpis hodnoty celého DWORDu
//-1 značí, že RDbg() zavolala nějaká vnitřní funkce a neobsahuje
//data o klientovi (odesílateli)
}
Nahlásit jako SPAM
IP: 91.139.9.–
CZIvo0
Newbie
29. 6. 2017   #6
-
0
-

zkusím...

Nahlásit jako SPAM
IP: 77.48.132.–
CZIvo0
Newbie
29. 6. 2017   #7
-
0
-

Tak 

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
   DWORD ptr = num / 32;

   DWORD flag = num % 32;

   if(Status==1)
     dwSettings[ptr] |= (1 << flag);
   else
     dwSettings[ptr] &= (0 << flag);
}

padá, jdu tam vrazit nějak debug kód abych zjistil kde přesně..

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #8
-
0
-

#6 CZIvo
ještě jsem to upravil koukni  na to ted by to mělo bejt v pořádku

já v práci nemám VS, za 1/2h budu doma tak na to juknu.

Nahlásit jako SPAM
IP: 91.139.9.–
CZIvo0
Newbie
29. 6. 2017   #9
-
0
-

Překládá se ta tvoje posl. úprava, tak uvidíme..

 tzn.

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
   DWORD ptr = num / 32;

   DWORD flag = num % 32;

   if(Status==1)
     dwSettings[ptr] |= (1 << flag);
   else
     dwSettings[ptr] &= ~(1 << flag);
}
Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #10
-
0
-

Pokud vím VS umí krokovat dej si tam break a pak krokuj.

Nahlásit jako SPAM
IP: 91.139.9.–
CZIvo0
Newbie
29. 6. 2017   #11
-
0
-

Bohužel tohle pravěký VS tohle sice umí, ale debugging nejde používat, nevím proč, prostě to nejde "naroubovat" na běžící aplikaci..

Problém je ten že tenhle kód běží v DLL která je součástí toho běžícího serveru s mrakem jiných.. a be běžícího serveru nejde debugovat tu knihovnu, protože je na něm závislá (dostává z něj data a posílá je tam)

Jediný debuging na který se můžu spolehnout jsou výstupy do nějakýho txt souboru krok za krokem a nebo selskej rozum :). a ještě větší prča je že ten vykompilovanej soubor musí být zavřenej v .REZ archivu, ten server ani hra ho jinak ignoruje :D

poslední kód padá, jdu do toho nacpat log, ať vidím kde..

Nahlásit jako SPAM
IP: 77.48.132.–
Radek Chalupa
~ Redaktor
+1
Super člen
29. 6. 2017   #12
-
0
-

no nevím, ale podle mě jediné co v té funkci SetFlag může spadnout, je index mimo rozsah, tj hodnota ptr (jako index dwSettings je různá od (0 nebo 1)...

Nahlásit jako SPAM
IP: 89.177.51.–
CZIvo0
Newbie
29. 6. 2017   #13
-
0
-

No..

já to napíšu logičtěji než na začátku :)

.h soubor:


DWORD dwSettings[2];
//SERVER
#define FLAG_ADMINPEEP			(1<<0)
#define FLAG_CHARBAN			(1<<1)
#define FLAG_JOINERALERT		(1<<2)
#define FLAG_ALLWEAP			(1<<3)
#define FLAG_DISABLENAMECHANGE	(1<<4)
#define FLAG_TIEREDADMIN		(1<<5)
#define FLAG_AUTOBAN			(1<<6)
#define FLAG_SPAWNPOINTF1ONLY	(1<<7)
#define FLAG_MELEEMODE			(1<<8)
#define FLAG_PINGAUTOKICK		(1<<9)
#define FLAG_BOUNCEFIRE			(1<<10)
#define FLAG_SPAWNSHIELD		(1<<11)
#define FLAG_USEWBAN			(1<<12)
#define FLAG_WBANMAPPROFILES	(1<<13)
#define FLAG_STRICTAMMOCHAR		(1<<14)
#define FLAG_IDINNAMES			(1<<15)
#define FLAG_SPEARGUNCLOAKOFF	(1<<16)
#define FLAG_FLARES				(1<<17)
#define FLAG_WORMSPROTECTED		(1<<18)
#define FLAG_GODMODECHECK		(1<<19)
#define FLAG_OVERRIDESPECLOCK	(1<<20)
#define FLAG_MAPSRANDOMORDER	(1<<21)
#define FLAG_HARDCORESURV		(1<<22)
#define FLAG_QDM				(1<<23)
#define FLAG_QVE				(1<<24)
#define FLAG_MADCOMPOUND		(1<<25)
#define FLAG_KILLMESSAGES		(1<<26)
#define FLAG_HARDCOREEVAC		(1<<27)
#define FLAG_SHITLIST			(1<<28)
#define FLAG_STRICTCRC			(1<<29)
#define FLAG_SNIPERSTAGOFF		(1<<30)
#define FLAG_CORNERBUGFIX		(1<<31)
#define FLAG_PULSESTAGOFF		(1<<32)
#define FLAG_MINIGUNSTAGGEROFF	(1<<33)
#define FLAG_GLOBALBAN			(1<<34)
#define FLAG_ANNOUNCER			(1<<35)
#define FLAG_SERVERBRAND		(1<<36)
//SERVER

.cpp:

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
   DWORD ptr = num / 32;

   DWORD flag = num % 32;

   if(Status==1)
     dwSettings[ptr] |= (1 << flag);
   else
     dwSettings[ptr] &= ~(1 << flag);
}

voláme SetFlag:

...

	if(Settings[23]=='1'){SetFlag(FLAG_QDM,1);}				 else{SetFlag(FLAG_QDM,0);}
	if(Settings[24]=='1'){SetFlag(FLAG_QVE,1);}				 else{SetFlag(FLAG_QVE,0);}
	if(Settings[25]=='1'){SetFlag(FLAG_MADCOMPOUND,1);}		 else{SetFlag(FLAG_MADCOMPOUND,0);}
	if(Settings[26]=='1'){SetFlag(FLAG_KILLMESSAGES,1);}		 else{SetFlag(FLAG_KILLMESSAGES,0);}
	if(Settings[27]=='1'){SetFlag(FLAG_HARDCOREEVAC,1);}		 else{SetFlag(FLAG_HARDCOREEVAC,0);}
	if(Settings[28]=='1'){SetFlag(FLAG_SHITLIST,1);}			 else{SetFlag(FLAG_SHITLIST,0);}
	if(Settings[29]=='1'){SetFlag(FLAG_STRICTCRC,1);}		 else{SetFlag(FLAG_STRICTCRC,0);}
	if(Settings[30]=='1'){SetFlag(FLAG_SNIPERSTAGOFF,1);}	 else{SetFlag(FLAG_SNIPERSTAGOFF,0);}
	
...

účelem SetFlag() je aby flagy 0-31 cpala do dwSettings[0] a flagy 32 a dál do dwSettings[1] s tím že v dwSettings[1] pojedou zase od nuly (aby se mi do těch dvou dwordů vešlo 37 flagů) :) Možná jsem to předtim napsal blbě..

Nahlásit jako SPAM
IP: 77.48.132.–
CZIvo0
Newbie
29. 6. 2017   #14
-
0
-

jsem tam vrazil primitivni log do txt souboru a prekvapilo me co z toho vylezlo..

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{

#ifdef XTREME_DEBUGING
	RommieDebug(__FILENAME__, __LINE__, "SetFlag(1)");
#endif

	DWORD ptr = num / 32;

#ifdef XTREME_DEBUGING
	RommieDebug(__FILENAME__, __LINE__, "SetFlag(2)");
#endif

   DWORD flag = num % 32;

#ifdef XTREME_DEBUGING
	RommieDebug(__FILENAME__, __LINE__, "SetFlag(3)");
#endif

   if(Status==1)
     dwSettings[ptr] |= (1 << flag);
   else
     dwSettings[ptr] &= ~(1 << flag);

#ifdef XTREME_DEBUGING
	RommieDebug(__FILENAME__, __LINE__, "SetFlag(4)");
#endif

	char FlGDebug[64];
	sprintf(FlGDebug,"%d-%d",ptr,dwSettings[ptr]);
	ChatMessage(FlGDebug, 0, -1);

#ifdef XTREME_DEBUGING
	RommieDebug(__FILENAME__, __LINE__, "SetFlag(5)");
#endif
}
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->577->MultiplayerMgr(x)
MultiplayerMgr.cpp->11216->LoadLevel()
MultiplayerMgr.cpp->11441->ServerAppPreStartWorld()
MultiplayerMgr.cpp->11453->ServerAppPreStartWorld(x)
MultiplayerMgr.cpp->11473->ServerAppPostStartWorld()
MultiplayerMgr.cpp->11497->ServerAppPostStartWorld(x)
MultiplayerMgr.cpp->12625->ReadConfig()
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)
MultiplayerMgr.cpp->13643->SetFlag(4)
MultiplayerMgr.cpp->11974->ChatMessage()
MultiplayerMgr.cpp->12075->ChatMessage(x)
MultiplayerMgr.cpp->13649->SetFlag(5)
MultiplayerMgr.cpp->13628->SetFlag(1)
MultiplayerMgr.cpp->13632->SetFlag(2)
MultiplayerMgr.cpp->13636->SetFlag(3)

při 27. flagu to spadne při 3. kroku (před if(Status==1) dwSettings[ptr] |= (1 << flag); else dwSettings[ptr] &= ~(1 << flag);) a teď babo raď xD :D

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #15
-
0
-

#14 CZIvo
používáš to blbě ty máš flagy nadefinovaný jako masku ne jako pozici ve flag slově

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #16
-
0
-

Eh.. a jak to napravit? ja jen okopiroval a zvetsil strukturu, kterou bez problemu pouzivam u hracu, ale tam je min flagu:

//CLIENT
#define FLAG_JOINEDTOFOM			(1<<0)
#define FLAG_WELCOME				(1<<1)
#define FLAG_VNLVOTE				(1<<2)
#define FLAG_MUTED					(1<<3)
#define FLAG_GUIDMUTECHECK			(1<<4)
#define FLAG_CLASSLOCKED			(1<<5)
#define FLAG_ISADMIN				(1<<6)
#define FLAG_USER					(1<<7)
#define FLAG_ADMIN1					(1<<8)
#define FLAG_ADMIN2					(1<<9)
#define FLAG_ADMIN3					(1<<10)
#define FLAG_AFK					(1<<11)
#define FLAG_BOTTOMFEEDER			(1<<12)
#define FLAG_SILENTMAINADMIN		(1<<13)
#define FLAG_AGREE					(1<<14)

#define CLIENT_FLAG_BADPACKET		(1<<15)
#define CLIENT_FLAG_BADJOIN			(1<<16)
#define CLIENT_FLAG_BADCHECKSUM		(1<<17)
#define CLIENT_FLAG_BADID			(1<<18)

#ifdef PTS_BUILD
#define FLAG_FOMAGREEMENT			(1<<19)
#endif

jo a to ptr je taky spatne, schvalne jsem to nechal vyblit do debug logu..

prvni cislo pred - je ptr (to ma byt 0 nebo 1) misto toho jsou tam nejaky blbiny :D

No jasne, PTR ma byt jen 0, nebo 1 (pokud flag bit je mensi nez POZICE 32 tak to ma byt 0, pokud je vetsi, ma to byt 1) jako ukazatel toho jakej ten dwSettings se ma pouzit, misto toho to tam cpe nasobilku z DWORDu :D

MultiplayerMgr.cpp->13639->0-2
MultiplayerMgr.cpp->13639->0-6
MultiplayerMgr.cpp->13639->0-22
MultiplayerMgr.cpp->13639->0-278
MultiplayerMgr.cpp->13639->0-65814
MultiplayerMgr.cpp->13639->1-0
MultiplayerMgr.cpp->13639->2-959591169
MultiplayerMgr.cpp->13639->4-959787058
MultiplayerMgr.cpp->13639->8-959858232
MultiplayerMgr.cpp->13639->16-1
MultiplayerMgr.cpp->13639->32-0
MultiplayerMgr.cpp->13639->64-0
MultiplayerMgr.cpp->13639->128-1
MultiplayerMgr.cpp->13639->256-0
MultiplayerMgr.cpp->13639->512-1
MultiplayerMgr.cpp->13639->1024-1
MultiplayerMgr.cpp->13639->2048-0
MultiplayerMgr.cpp->13639->4096-1313153135
MultiplayerMgr.cpp->13639->8192-0
MultiplayerMgr.cpp->13639->16384-1
MultiplayerMgr.cpp->13639->32768-0
MultiplayerMgr.cpp->13639->65536-0
MultiplayerMgr.cpp->13639->131072-544839728

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #17
-
0
-

#15 MilanL
pokud VS neumí 64bit tak ti nejspíš nepůjdou ani definice flagů od (1 <<32) vejš bo už je to mimo dword rozsah jedině že by se to vrátilo na začátek, ale pak by (1 <<32) bylo stejný jako (1<<0)

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #18
-
0
-

#17 MilanL
Jasne no, proto chci pouzit tu fci SetFlag() a ReadFlag() s tim aby si to nejak samo prebralo jestli ten flag je v dwSettings[0] a nebo dwSettings[1].. protoze kdybych si mel pamatovat kde je kterej flag a v tom milionu volani co jich v tom programu je spravne pouzit g_myRommieServer->dwSettings[0] nebo 1 spravne, tak se  toho blaznim :D :D

Mi asi nezbude nic jinyho nez ty jednotlivy nastaveni (flagy) nejak roztridit.. treba nastaveni serveru, nastaveni hry, omezeni... a pak pro ne vytvorit samostatny dwordy se samostatnyma define flagama, ale to bude proste bordel a chaos :(

Nahlásit jako SPAM
IP: 77.48.132.–
Radek Chalupa
~ Redaktor
+1
Super člen
29. 6. 2017   #19
-
0
-

#14 CZIvo
už při hodnotě 128 toho 1. parametru dostaneš index 4 (128/32 je 4) a jsi mimo rozsah toho pole....a že to spadne "až" při 1<<27 je zřejmě tím že do té doby "pouze" přepisuješ jiné proměnné co jsou v paměti, ale jakmile se dostaneš do paměti která je chráněná proti zápisu, spadne to..

Nahlásit jako SPAM
IP: 89.177.51.–
MilanL+1
Grafoman
29. 6. 2017   #20
-
0
-

#17 MilanL
program nech je třeba spíš předělat ty definice nepoužívat masky, když to nejde do 1 slova, ale indexy pozic ve slově tzn 0 1 2 3 4 5 6 ... 36

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #21
-
0
-

Ja uz se dostal tak daleko, ze jsem mel sto chuti vsechno nastaveni nacpat do CHARu jako 0001010101111010100101111000... a pak to kontrolovat jako if(string[0-36]=='1')...else...

jediny duvod proc jsem se do tech flagu vrhl bylo ze jsem zjistil ze je to 100x rychlejsi a prehlednejsi v tom klientu nez mit m_hClient.Muted==true/false, m_hClient.neco==true/false.....

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #22
-
0
-

#20 MilanL
tak jak máš ty masky původně, tak se ti posouvají bity ve slově, tzn že
#define FLAG_AUTOBAN (1<<6)
není 6 ale 1 na 7 pozici což znamená 64 číselně

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #23
-
0
-

No a jak jinak se dají ty flagy nadefinovat?

než

#define FLAG_ADMINPEEP (1<<0)

...

?

já viděl v nějakým návodu, že to definují jako enum

a pak value 0

value 1

value 2

value 4

8

16

32

...

value 2048 a tak dále, ale nevím jak se to pak čte, nebo se to používá stejně jako ty moje flagy?

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #24
-
0
-

#23 CZIvo
jako pozici v těch setting slovech, tzn bez rotace jen to druhý číslo v závorce a pozor podobně si musíš udělat i Get flags a předělat si vše kde jsi pracoval přímo s tím seting slovem když jsi měl jen 32bitů

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
29. 6. 2017   #25
-
0
-

#24 MilanL
nebo pracovat s tou druhou skupinou bitů zvlášť

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #26
-
0
-

No, to dwSettings je "nový", takže jsem to zatím nikde nepoužil, všude jsou zatím jen původní booly.

Můžeš mi ukázat jak tedy bude vypadat nový 

#define FLAG_AUTOBAN (1<<6)

?

jestli to správně chápu..

#define FLAG_AUTOBAN (6) ?

to je asi blbost, co? :D

a SetFlag


if(Status==1)
dwRommieSettings[ptr] |= flag;

taky asi kravina :D :D
 

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #27
-
0
-

#26 CZIvo
setflag bude vypadat jak byl a bude to i správně počítat

těmi rotacemi jsi měl ty flagy definovaný jako násobky 2 tzn při tom flagu (1<<6) = 64 jsi se dostal na PTR=2 !!!! což je mimo rozsah pole.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
29. 6. 2017   #28
-
0
-

#27 MilanL
nemůžeš používat masku slova jako index každý je něco jiného, maska určuje pozici v bitu ale tak, že jí obsazuje, tzn (1<<6) dá v bináru 1 na 7 (první pozice je 1<<0) pozici tzn .....0000 0000 0100 0000

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
29. 6. 2017   #29
-
0
-

#29 CZIvo
NEEEE  - to je to samé jako ty <<

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #30
-
0
-

To vim, že například (1<<26) nastaví 27 bit v tom DWORDU na 1

0000000000000000000000000010000000

takže místo

#define FLAG_AUTOBAN (1<<6)

butu mít

#define FLAG_AUTOBAN 6 ? a nebo to co používají v těch enumech, že s každým dalším flagem se to číslo zdvojnásobuje? 0, 1, 2, 4, 8, 16... tzn 

#define FLAG_AUTOBAN (1<<6)

#define FLAG_AUTOBAN 32

?

takže...

#define FLAG_ADMINPEEP			0
#define FLAG_CHARBAN			1
#define FLAG_JOINERALERT		2
#define FLAG_ALLWEAP			4
#define FLAG_DISABLENAMECHANGE		8
#define FLAG_TIEREDADMIN		16
#define FLAG_AUTOBAN			32
#define FLAG_SPAWNPOINTF1ONLY		64
#define FLAG_MELEEMODE			128
#define FLAG_PINGAUTOKICK		256
#define FLAG_BOUNCEFIRE			512
#define FLAG_SPAWNSHIELD		1024
#define FLAG_USEWBAN			2048
#define FLAG_WBANMAPPROFILES		4092
....
Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #31
-
0
-

#29 MilanL
v okamžiku kdy se dostaneš přes 63 (<<6) ti to hodí chybu to je ten 7 flag co ti to shodil

hele odemkl jsem e-mail pošli kontakt jestli máš FB nebo Skype přes forum je to zdlouhavé

Nahlásit jako SPAM
IP: 185.112.167.–
Radek Chalupa
~ Redaktor
+1
Super člen
29. 6. 2017   #32
-
0
-

#30 CZIvo
ty flagy máš dobře, ale jako ten parametr nesmíš zadávat hodnotu flagu. ale když použiješ unsigned __int64, tak si ušetříš starosti s polem a vejde se ti tam i těch max. 64 parametrů

Nahlásit jako SPAM
IP: 89.177.51.–
MilanL+1
Grafoman
29. 6. 2017   #33
-
0
-

#32 Radek Chalupa
psal že má nějaký předpotopní VS co neumí 64bit, a ano jinak by mu to fungovalo,

sakra ten meil je do práce na ten se ted nedostanu.

Nahlásit jako SPAM
IP: 185.112.167.–
Radek Chalupa
~ Redaktor
+1
Super člen
29. 6. 2017   #34
-
0
-

nějak takhle:

unsigned __int64 _settings = 0;

void set_flag(unsigned _int64 flg, bool zapni)

{

if (zapni)

settings |= flag;

else

settings &= ~flag;

}

Nahlásit jako SPAM
IP: 89.177.51.–
CZIvo0
Newbie
29. 6. 2017   #35
-
0
-

No, bohužel ani unsigned __int64 tady nefunguje :D

je to tam někde natvrdo nadefinovaný ve zbytku kódu, co je sdílenej mezi klentem a serverem a když to přepíšu, tak mi to tam nepustí klienty, protože se změní hashe :D a stejně to linker překope a je to pořád jenom 32bit :D, zkoušeli jsme to :D

Díky, já jsem na tohle fakt natvrdlej :D

Skype mám, ale jenom v telefonu :) - info@mujmail.eu, případně facebook, tam mě snad lzze najít stejným mailem..

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #36
-
0
-

#35 CZIvo
to budeš mít problém s klienty i tak pokud tu knihovnu a to seting slovo používají,

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #37
-
0
-

Nebudu.. dwSettings je POUZE A JEN nastavení na serveru, nikam se to "neposílá". posílá se dwData co jsem ukazoval ty klienty a ty jsou ok, protože fagů není ani 20 a jsou definovaný i u klienta :) nebo lépe řečeno nejsou ani u klienta, klient mi slouží jen jako úložitě mezi mapama aby zůstal třeba zamutovanej a nějaký další nastavení co si pak jen z toho klientskýho dwordu překopnu do dwdata na serveru.

Nahlásit jako SPAM
IP: 77.48.132.–
MilanL+1
Grafoman
29. 6. 2017   #38
-
0
-

hele trošku teorie, kdyby v

if(Settings[18]=='1') {SetFlag(FLAG_IDINNAMES,1);} else{SetFlag(FLAG_IDINNAMES,0);}

ten index [18] odpovídal indexu FLAG_IDINNAMES, tak by se to dalo použít i jako vstup do tý funkce, jinak v nastavování až takovej problém nevidím, problémem bude čtení, podmínky a další operace na to si budeš muset udělat funkce a volat je s parametry, tam kde máš třeba v původním kodu např dwSetting || Flag XY to budeš muset předělat do nějaké funkce

Nahlásit jako SPAM
IP: 185.112.167.–
CZIvo0
Newbie
29. 6. 2017   #39
-
0
-

no hracsky flagy co uz tam jsou se pouzivaji nejak takhle:

m_ClientData[i].dwPlayerFlags |= (FLAG_GUIDMUTECHECK | FLAG_BOTTOMFEEDER);

m_ClientData[i].dwPlayerFlags |= FLAG_WELCOME;

if(!(m_ClientData[nIndex].dwPlayerFlags & FLAG_ISADMIN))

m_ClientData[senderID].dwPlayerFlags &= ~FLAG_FOMAGREEMENT;

a tak podobně..

ju těch nastavení by to bylo jednodušší, protože by to bylo jen if(ReadFlag(FLAG_NECO)).. protože to neni uložený v žádný další struktuře jako třeba to dwPlayerFlags, což je u každýho hráče (nindex) v m_ClientData. a je tam 16 klientů :) A ty serverový zatím neexistují.. mám jen nadefinovaný ty flagy a rozdělanou tu funkci SetFlag(), nikde to není použité, takže s tím můžu dělat psí kusy, zatím :D

Nahlásit jako SPAM
IP: 77.48.132.–
Řešení
CZIvo0
Newbie
29. 6. 2017   #40
-
0
-
Vyřešeno Nejlepší odpověď

Tak problém mi pomohl po skypu vyřešit MilanL, 

void MultiplayerMgr::SetFlag(DWORD num, int Status)
{
	DWORD ptr = num / 32;
	DWORD flag = num % 32;

	if(Status==1)
		dwRommieSettings[ptr] |= (1 << flag);
	else
		dwRommieSettings[ptr] &= ~(1 << flag);
}

LTBOOL MultiplayerMgr::ReadFlag(DWORD num)
{
	DWORD ptr = num / 32;
	DWORD flag = num % 32;

	return (dwRommieSettings[ptr] & (1<<flag));
}


flagy nejsou definované jako masky #define FLAG_ADMINPEEP (1<<0)
ale jako 
#define FLAG_ADMINPEEP 1
a tak dále..
Vše se zdá funguje, ještě ladíme :)


Jako vždy mi tu bylo pomoženo, tohle je snad jediný místo na českým netu, kde se schází lidi co opravdu VÍ co dělají a neváhají pomoct i úplný lamě :)

DÍKY!
 

Nahlásit jako SPAM
IP: 77.48.132.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 18 hostů

Podobná vlákna

Výpočet dnů v roce — založil Michal

Žádost o radu — založil Isanek

Zadost o pomoc (H8S) — založil Maikee

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý