Weapon level command

08/06/2016 00:08 sebariio#1
hello
this command work with __WEAPON_LEVEL system

Code:
#ifdef __WEAPON_LEVELING
BOOL TextCmd_SetWeaponLevel( CScanner& scanner )
{
#ifdef __WORLDSERVER
	CUser* pUser = (CUser*)scanner.dwValue;
	if( IsValidObj( pUser ) )
	{
		CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);
		if( pItemElem )
		{
			ItemProp* pProp = pItemElem->GetProp();
			int nLevel = scanner.GetNumber();
			int nExp = 0;

			if( pProp )
			{
				if( pProp->dwItemKind == IK1_WEAPON || pProp->dwItemKind3 == IK3_SHIELD )
				{
					if( nLevel < 1)
						nLevel = 1;
					if( nLevel > 100 )
						nLevel = 100;
					
					if( pUser->IsMode( TRANSPARENT_MODE ) == 0 )
					{
						g_UserMng.AddCreateSfxObj( pUser, XI_INT_SUCCESS, pUser->GetPos().x, pUser->GetPos().y, pUser->GetPos().z );
						pUser->AddPlaySound( SND_INF_UPGRADESUCCESS );
					}
					pUser->UpdateItem( (BYTE)pItemElem->m_dwObjId, UI_WEAPON_LEVEL, nLevel );
					pUser->UpdateItem( (BYTE)pItemElem->m_dwObjId, UI_WEAPON_EXP, nExp );
				}
			}
		}
	}
#endif // __WORLDSERVER
    return TRUE;
}
#endif // __WEAPON_LEVELING
put an item in 1st inventory slot and use command like /WeaponLevel 100 to put your weapon level to 100

credit : me
08/06/2016 01:38 Meutledaron#2
Possible crash :
CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);
ItemProp* pProp = pItemElem->GetProp();

pItemElem n'est pas vérifier avant de l'appeler dans pItemElem->GetProp();


if( nLevel > 100 )
nLevel = 100;

Que se passe-t-il si une valeur négative est passer ?

Pareil pUser n'est pas vérifier dans if( pUser->IsMode( TRANSPARENT_MODE ) == 0 )
08/06/2016 02:19 ZeroTwo02#3
J'adore les noobs :p

Quote:
#ifdef __WEAPON_LEVELING
BOOL TextCmd_SetWeaponLevel( CScanner& scanner )
{
#ifdef __WORLDSERVER
CUser* pUser = (CUser*)scanner.dwValue;
if( !IsValidObj( pUser ) )
return FALSE;

CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);
if( !pItemElem )
return FALSE;

ItemProp* pProp = pItemElem->GetProp();
if( !pProp )
return FALSE;

int nLevel = scanner.GetNumber();
int nExp = 0;
if( pItemElem )
{
if( pProp->dwItemKind3 == IK3_SWD
|| pProp->dwItemKind3 == IK3_AXE
|| pProp->dwItemKind3 == IK3_KNUCKLEHAMMER
|| pProp->dwItemKind3 == IK3_CHEERSTICK
|| pProp->dwItemKind3 == IK3_WAND
|| pProp->dwItemKind3 == IK3_STAFF
|| pProp->dwItemKind3 == IK3_BOW
|| pProp->dwItemKind3 == IK3_YOYO
|| pProp->dwItemKind3 == IK3_SHIELD )
{
if( nLevel < 1 )
nLevel = 1;
if( nLevel > 100 )
nLevel = 100;

if( pUser && pUser->IsMode( TRANSPARENT_MODE ) == 0 )
{
g_UserMng.AddCreateSfxObj( pUser, XI_INT_SUCCESS, pUser->GetPos().x, pUser->GetPos().y, pUser->GetPos().z );
pUser->AddPlaySound( SND_INF_UPGRADESUCCESS );
}

pUser->UpdateItem( (BYTE)pItemElem->m_dwObjId, UI_WEAPON_LEVEL, nLevel );
pUser->UpdateItem( (BYTE)pItemElem->m_dwObjId, UI_WEAPON_EXP, nExp );

}
else
pUser->AddDefinedText( TID_REALLY_NIGGA );
}
#endif // __WORLDSERVER
return TRUE;
}
#endif // __WEAPON_LEVELING
08/06/2016 02:40 sebariio#4
Quote:
Originally Posted by Meutledaron View Post
Possible crash :
CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);
ItemProp* pProp = pItemElem->GetProp();

pItemElem n'est pas vérifier avant de l'appeler dans pItemElem->GetProp();


if( nLevel > 100 )
nLevel = 100;

Que se passe-t-il si une valeur négative est passer ?

Pareil pUser n'est pas vérifier dans if( pUser->IsMode( TRANSPARENT_MODE ) == 0 )
C'est une commande que j'ai fait en vitesse c'est vrai que je ne l'ai pas faite correctement merci de ta remarque je vais la corriger ;)
08/06/2016 15:47 ZeroTwo02#5
Toujours pas bon...
08/06/2016 20:11 sebariio#6
Ma commande est tout à fait bonne
pProp vérifié
pItem vérifié
pUser vérifié
08/06/2016 21:35 Meutledaron#7
Tu fais appel à

CItemElem* pItemElem = pUser->m_Inventory.GetAt(0); sans l'avoir vérifier.

Ensuite à
ItemProp* pProp = pItemElem->GetProp(); pareil sans vérification, il faut y aller étape par étape.

CUser* pUser = (CUser*)scanner.dwValue;
On vérifier pUser avant d'aller plus loin.

CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);
On vérifie pItemElem avant d'aller plus loin.

Les vérifications dans ton script arrivent trop tard et si l'objet n'est pas bon c'est le crash du worldserver.

Ps : Il manque également la seconde partie de la commande ou tu attribue les droits.
08/06/2016 21:44 sebariio#8
Code:
#ifdef __WEAPON_LEVELING
	ON_TEXTCMDFUNC( TextCmd_SetWeaponLevel,					"SetWeaponLevel",			"setweaponlevel",	"swl",		"SWL",		TCM_BOTH,	AUTH_GAMEMASTER3,	""	)
#endif // __WEAPON_LEVELING
Je pensais qu'il n'était pas nécessaire de le poster car facile à refaire ^^
08/07/2016 01:01 ZeroTwo02#9
Toujours pas bon...

Tu doit vérifier ton puser avant, car ici tu l'appel :
CItemElem* pItemElem = pUser->m_Inventory.GetAt(0);

Idem tu doit vérifier ton pItemElem avant, car ici tu l'appel :
ItemProp* pProp = pItemElem->GetProp();
12/06/2016 10:50 direktbottle#10
Did you fix the script? I look forward to it :)
12/06/2016 12:53 Meutledaron#11
The script is good now.
12/06/2016 13:42 direktbottle#12
Which post contains the complete final script? Is it the original post?
12/06/2016 19:42 Meutledaron#13
Quote:
Originally Posted by direktbottle View Post
Is it the original post
:)