Werte aus Struct auslesen

01/05/2014 19:05 bloodx#1
Hey Hou, also es ist kein wirkliches Problem das ich habe es Funktioniert soweit einwandfrei doch Interessiert es mich was IHR für Lösungsvorschläge hättet um so etwas zu Lösen.
Player.h

Code:
#ifndef __PLAYER__H
#define __PLAYER__H


class CPlayer
{
public:
	int unk_0; // 0
	int unk_4; // 4
	int unk_8; // 8
	int unk_12; // 12
	int unk_16; // 16
	int unk_20;  // 20
	int Type; // 24
	int PlayerID; // 28
	char Name[14]; // 32
	char Guild[14]; // 56
	int Level; // 60
	int Strength; // 64
	int Health; // 68
	int Intelligence; // 72
	int Wisdom; // 76
	int Agility; // 80
	int MaxHealth; // 84
	int MaxMana; // 88
	int unk_92; // 92
	int unk_96; // 96
	int unk_100; // 100
	int unk_104; // 104
	int unk_108; // 108
	int unk_112; // 112
	int unk_116; // 116
	int OnTargetPoint; // 120
	int Evasion; // 124
	int MinimalPhysicalAttack; // 128
	int MaximalPhysicalAttack; // 132
	int MinimalMagicanAttack; // 136
	int MaximalMagicanAttack; // 140
	int MinDef; // 144
	int MaxDef;  // 148
	int Absorbtion; // 152
	int ASpeed; // 156
	int FireResistence; // 160
	int IceResistence; // 164
	int ElementResistence; // 168
	int LightResisitence; // 172
	int CurseResistence; // 176
	int unk_180; // 180
	int unk_184; // 184
	int unk_188; // 188
	int unk_192; // 192
	int unk_196; // 196
	int unk_200; // 200
	int unk_204; // 204
	int unk_208; // 208
	int unk_212; // 212
	int unk_216; // 216
	int unk_220; // 220
	int unk_224; // 224
	int unk_228; // 228
	int unk_232; // 232
	int unk_236; // 236
	int unk_240; // 240
	int unk_244; // 244
	int unk_248; // 248
	int unk_252; // 252
	int unk_256; // 256
	int Speed; // 260
	int unk_264; // 264
	int unk_268; // 268
	int CurrentHealth; // 272
	int CurrentMana; // 276
	int GState; // 280
	int unk_284; // 284
	int unk_288; // 288
	int unk_292; // 292
	int unk_296; // 296
	int unk_300; // 300
	int unk_304; // 304
	int unk_308; // 308
	int unk_312; // 312
	int Map; // 316
	int unk_320; // 320
	int unk_324; // 324
	int unk_328; // 328
	int Position_X; // 332
	int Position_Y; // 336
	int Position_Z; // 340
	int unk_344; // 344
	int unk_348; // 348
	int unk_352; // 352
	int unk_356; // 356
	int unk_360; // 360
	int unk_364; // 364
	int unk_368; // 368
	int unk_372; // 372
	int unk_376; // 376
	int unk_380; // 380
	int unk_384; // 384
	int unk_388; // 388
	int unk_392; // 392
	int unk_396; // 396
	int unk_400; // 400
	int unk_404; // 404
	int unk_408; // 408
	int unk_412; // 412
	int unk_416; // 416
	int unk_420; // 420
	int unk_424; // 424
	int unk_428; // 428
	int unk_432; // 432
	int unk_436; // 436
	int unk_440; // 440
	int unk_444; // 444
	int UID; // 448
	int PID; // 452
	int Admin; // 456
	int Class; // 460
	int Job; // 464
	int Contribute; // 468
	int Exp; // 472
	int Exp_2; // 476
	int unk_480; // 480
	int unk_484; // 484
	int unk_488; // 488
	int unk_492; // 492
	int unk_496; // 496
	int unk_500; // 500
	int unk_504; // 504
	int unk_508; // 508
	int unk_512; // 512
	int unk_516; // 516
	int unk_520; // 520
	int unk_524; // 524
	int unk_528; // 528
	int unk_532; // 532
	int GRole; // 536
	int unk_540; // 540
	int StatPoints; // 544
	int SkillPoints; // 548
	int Rage; // 552
};
class CPlayerFunktion : CPlayer
{
public:
	int* ThisPtr;
	int GetAdminLevel(); // Return Player Admin Level Database
	int GetID();		 // Return Player UID
	void InsertItem(int index, int amount)
	{
		//Server::CItem::InsertItem(reinterpret_cast< int >(this), 21, index, 0, amount, -1);
	}
	void CancelBuff(int BuffIndex)
	{
		MainServer::CharacterCore::CancelBuff(reinterpret_cast< int >(this), BuffIndex);
	}
	void Buff(int BuffIndex, int LastTime, int Grade)
	{
		int retBuf = MainServer::CharacterCore::CreateBuff(BuffIndex, LastTime, Grade, 0);
		MainServer::PlayerCore::AddBuff(reinterpret_cast< int >(this), retBuf);

	}
};

#endif
Player.cpp
Code:
#include "DllCore.h"
#include "Player.h"

int CPlayerFunktion::GetAdminLevel()
{
	return this->Admin;
}
int CPlayerFunktion::GetID()
{
	return this->PlayerID;
}
und aufgerufen wird das ganze dann so ->

Code:
CPlayerFunktion *MyPlayer = (CPlayerFunktion*)PlayerPtr;
if ( MyPlayer->GetAdminLevel() >= 15 )
xyz....
die Structur ist mir bekannt deswegen habe ich sie selbst in eine Class geschrieben, sie befindet sich im "PlayerPtr" den ich bekomme.

Hierbei handelt es sich um eine DLL die in einen GameService Injeziert wird um Sachen zu Modifizieren bzw. Hinzuzufügen.
01/06/2014 00:02 Dr. Coxxy#2
jo, die lösung ist i.o. würd die unknowns noch zu arrays zusammenziehen und nen doppelunterstrich vor den namen setzen "__" um zu kennzeichnen, dass die keine "normalen" member sind.
Wieso machste die funktionen in eine extra klasse? - eigtl doch garnicht nötig?
ob sich die kapselung über ne funktion lohnt musste für dich selbst entscheiden - dann sollteste die member aber auch private machen.
Code:
if ( MyPlayer->GetAdminLevel() >= 15 )
die "15" gehört in ne konstante oder nen enum, oder wenn dus nur 1x benutzt - auskommentieren.
01/06/2014 02:19 +Yazzn#3
Mit __ wäre ich vorsichtig.
Aus dem c++11 working draft (n3337):

Quote:
17.6.4.3.2 Global names [global.names]
Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.
— Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.