the location swap is good, but the code that changes hero items is not working so fine.
Ok here it is, the code is activated with command /changecity, the requirements are 150 rep, and what it does is change player location and hero items.
The error comes up after logging out the game... this is the sequence:
- I press /changecity and it changes location, and changes hero normally (I can equip, drop, sell them as usual).
- Now when I logout the hg crashes.
- After I activate HG again and I login in the item bag appears 3 heros of the same type (3 leggings).
Here is the code:
Code: Select all
void CGame::AdminOrder_ChangeHero(int iClientH)
{
char notice[100];
int i, iSoX, iSoxH, iSoxI, iItemID, iEraseReq;
bool bGaveCape, bGaveArmor, bGaveHauberk, bGaveHelm, bGaveCap, bGaveRobe, bGaveLeggings;
class CItem * pItem;
//initilized variables..
pItem = NULL;
pItem = new class CItem;
if (pItem == NULL) return;
bGaveCape = bGaveArmor = bGaveHauberk = bGaveHelm = bGaveCap = bGaveRobe = bGaveLeggings = 0; //sets all bools to false
iSoxH = 0;
iItemID = -1;
iSoX = 0;
//Asks for the item...identifies if the item is present into the character
for (i = 0; i < DEF_MAXITEMS; i++) {
if (m_pClientList[iClientH]->m_pItemList[i] != NULL) {
switch (m_pClientList[iClientH]->m_pItemList[i]->m_sIDnum) {
case 400: iSoX++; iItemID = 401; break; // 400 AresdenHeroCape
case 401: iSoX++; iItemID = 400; break; // 401 ElvineHeroCape
case 403: iSoX++; iItemID = 405; break; // 403 AresHeroHelm(M)
case 404: iSoX++; iItemID = 406; break; // 404 AresHeroHelm(W)
case 405: iSoX++; iItemID = 403; break; // 405 ElvHeroHelm(M)
case 406: iSoX++; iItemID = 404; break; // 406 ElvHeroHelm(W)
case 407: iSoX++; iItemID = 409; break; // 407 AresHeroCap(M)
case 408: iSoX++; iItemID = 410; break; // 408 AresHeroCap(W)
case 409: iSoX++; iItemID = 407; break; // 409 ElvHeroCap(M)
case 410: iSoX++; iItemID = 408; break; // 410 ElvHeroCap(W)
case 411: iSoX++; iItemID = 413; break; // 411 AresHeroArmor(M)
case 412: iSoX++; iItemID = 414; break; // 412 AresHeroArmor(W)
case 413: iSoX++; iItemID = 411; break; // 413 ElvHeroArmor(M)
case 414: iSoX++; iItemID = 412; break; // 414 ElvHeroArmor(W)
case 415: iSoX++; iItemID = 417; break; // 415 AresHeroRobe(M)
case 416: iSoX++; iItemID = 418; break; // 416 AresHeroRobe(W)
case 417: iSoX++; iItemID = 415; break; // 417 ElvHeroRobe(M)
case 418: iSoX++; iItemID = 416; break; // 418 ElvHeroRobe(W)
case 419: iSoX++; iItemID = 421; break; // 419 AresHeroHauberk(M)
case 420: iSoX++; iItemID = 422; break; // 420 AresHeroHauberk(W)
case 421: iSoX++; iItemID = 419; break; // 421 ElvHeroHauberk(M)
case 422: iSoX++; iItemID = 420; break; // 422 ElvHeroHauberk(W)
case 423: iSoX++; iItemID = 425; break; // 423 AresHeroLeggings(M)
case 424: iSoX++; iItemID = 426; break; // 424 AresHeroLeggings(W)
case 425: iSoX++; iItemID = 423; break; // 425 ElvHeroLeggings(M)
case 426: iSoX++; iItemID = 424; break; // 426 ElvHeroLeggings(W)
case 427: iSoX++; iItemID = 428; break; // 427 AresdenHeroCape+1
case 428: iSoX++; iItemID = 427; break; // 428 ElvineHeroCape+1
}
iSoxH = m_pClientList[iClientH]->m_pItemList[i]->m_sIDnum; iSoxI = i;
}
if(iSoX > 0) //if player has any hero item...
{
//check if gave cape
if((iSoxH == 400) | (iSoxH == 401) | (iSoxH == 427) | (iSoxH == 428)) {
if(bGaveCape == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveCape = true;
}
}
}
//check if gave helm
else if((iSoxH == 403) | (iSoxH == 404) | (iSoxH == 405) | (iSoxH == 406)) {
if(bGaveHelm == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveHelm = true;
}
}
}
//check if gave cap
else if((iSoxH == 407) | (iSoxH == 408) | (iSoxH == 409) | (iSoxH == 410)) {
if(bGaveCap == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveCap = true;
}
}
}
//check if gave armor
else if((iSoxH == 411) | (iSoxH == 412) | (iSoxH == 413) | (iSoxH == 414)) {
if(bGaveArmor == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveArmor = true;
}
}
}
//check if gave robe
else if((iSoxH == 415) | (iSoxH == 416) | (iSoxH == 417) | (iSoxH == 418)) {
if(bGaveRobe == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveRobe = true;
}
}
}
//check if gave hauberk
else if((iSoxH == 419) | (iSoxH == 420) | (iSoxH == 421) | (iSoxH == 422)) {
if(bGaveHauberk == FALSE) {
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveHauberk = true;
}
}
}
//check if gave leggings
else if((iSoxH == 423) | (iSoxH == 424) | (iSoxH == 425) | (iSoxH == 426)) {
if(bGaveLeggings == FALSE){
ItemDepleteHandler(iClientH, iSoxI, FALSE, FALSE);
if(_bInitItemAttr(pItem, iItemID) == 1) {
SendItemNotifyMsg(iClientH, DEF_NOTIFY_ITEMOBTAINED, pItem, NULL);
_bAddClientItemList(iClientH, pItem, &iEraseReq);
bGaveLeggings = true;
}
}
}
wsprintf(notice,"Your hero items has been changed.");
ShowClientMsg(iClientH, notice);
}
} //if player has any required item
}//end bucle for()
}
PD: It's only the change hero part, else noobs would copy
