⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerfunctions.cpp.svn-base

📁 ROSE的源代码。了解的自己研究,编译通过
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
    }	
	return 0xffff;
}

// Returns a free slot in the storage (0xffff if is full)
UINT CPlayer::GetNewStorageItemSlot( CItem thisitem )
{
    for(UINT i=0;i<160;i++)
    {
        if(storageitems[i].itemtype == 0)
            return i;
    }
	return 0xffff;
}

// Erase a object from the user
bool CPlayer::ClearObject( unsigned int otherclientid )
{
	BEGINPACKET( pak, 0x794 );
	ADDWORD( pak, otherclientid );
	client->SendPacket( &pak );           	
	return true;
}

// Clean the player values
void CPlayer::RestartPlayerVal( )
{
    ClearBattle( Battle );
    Shop->open = false;
    Trade->trade_target = 0;
    Trade->trade_status = 0;
}

//LMA
//Force refresh of actual HP / MP Hp/Mp jumping bug.
bool CPlayer::RefreshHPMP()
{
     	clock_t etime = clock() - lastShowTime;
     	if ( etime < 3 * CLOCKS_PER_SEC )
     	{
             return true;
         }

        BEGINPACKET( pak, 0x7ec );
        ADDWORD    ( pak, Stats->HP );
        ADDWORD    ( pak, Stats->MP );
        client->SendPacket ( &pak );            
        lastShowTime = clock();
                 
         
         return true;
}


// HP/MP Regeneration Function
bool CPlayer::Regeneration()
{
    if (Stats->MaxHP==Stats->HP && Stats->MaxMP== Stats->MP)
    {
       lastRegenTime=0;
       return true;
    }
    
    //LMA REGEN
    bool is_first_regen=false;
    if (lastRegenTime==0)
    {
       is_first_regen=true;
    }
    
	clock_t etime = clock() - lastRegenTime;		
    if ( etime >= 3 * CLOCKS_PER_SEC )
    {
        //LMA, it seems it's faster than 10 seconds...
        //if( etime >= 10 * CLOCKS_PER_SEC && Stats->HP > 0 )
        if( etime >= 5 * CLOCKS_PER_SEC && Stats->HP > 0 )
        {
            unsigned int hpamount = GetHPRegenAmount( );
            unsigned int mpamount = GetMPRegenAmount( );                         
            Stats->HP += hpamount;
            Stats->MP += mpamount;
            if( Stats->HP > Stats->MaxHP)        
                Stats->HP = Stats->MaxHP;
            if( Stats->MP > Stats->MaxMP )        
                Stats->MP = Stats->MaxMP;
                
            if (Stats->MaxHP==Stats->HP && Stats->MaxMP== Stats->MP)
            {
               lastRegenTime=0;
            }
            else
            {
                lastRegenTime = clock();
            }                    
        }        

        BEGINPACKET( pak, 0x7ec );
        ADDWORD    ( pak, Stats->HP );
        ADDWORD    ( pak, Stats->MP );
        client->SendPacket ( &pak );         
        
        if (Party->party != NULL)
        {
           BEGINPACKET( pak, 0x7d5 );
           ADDDWORD   ( pak, CharInfo->charid );
           ADDWORD    ( pak, clientid );
           ADDWORD    ( pak, GetMaxHP( ) );
           ADDWORD    ( pak, Stats->HP );
           ADDDWORD   ( pak, 0x01000000 );
           ADDDWORD   ( pak, 0x0000000f );
           ADDWORD    ( pak, 0x1388 );
           Party->party->SendToMembers( &pak);
        }
    }   
    return true;
}


// Heal Player when use Food/Pots
bool CPlayer::PlayerHeal()
{
    clock_t transtime = clock() - UsedItem->lastRegTime;
	if( UsedItem->usevalue!=0 && transtime >= 0.3*CLOCKS_PER_SEC )	
    {           
        if( UsedItem->used < UsedItem->usevalue && Stats->HP > 0 )
        {
            int value = UsedItem->userate;                
            if((UsedItem->usevalue - UsedItem->used) < value)
            {
                value = UsedItem->usevalue - UsedItem->used;
            }
            switch( UsedItem->usetype )
            {
                case 16: // HP
                    Stats->HP += value;
                    if(Stats->HP > GetMaxHP())
                        Stats->HP = GetMaxHP();                            
                break;
                case 17: // MP
                    Stats->MP += value;                    
                    if(Stats->MP > GetMaxMP())
                        Stats->MP = GetMaxMP();                        
                break;
            }
            UsedItem->used += value;
            UsedItem->lastRegTime = clock();             
        }
        else
        {
            BEGINPACKET( pak,0x7b7 );
            ADDWORD    ( pak, clientid );
            ADDDWORD   ( pak, GServer->BuildBuffs( this ) );
            switch( UsedItem->usetype )
            {
                case 16: // HP
                    ADDWORD( pak, Stats->HP );                         
                break;
                case 17: // MP
                    ADDWORD( pak, Stats->MP );                     
                break;
            }
            GServer->SendToVisible( &pak, this ); 
            UsedItem->used = 0;
            UsedItem->usevalue = 0;
            UsedItem->userate = 0;
            UsedItem->usetype = 0;
        }
    }
    return true;
}

void CPlayer::ReduceABC( )
{
    unsigned int weapontype = 0;
    weapontype = GServer->EquipList[WEAPON].Index[items[7].itemnum]->type;
    //printf("Reducing ABC item count /n");
    switch(weapontype)
    {
        case 231:
            items[132].count--;
            if(items[132].count<=0)
            {
                ClearBattle( Battle );
                ClearItem( items[132] );
            }
        break;
        case 232:
            items[133].count--;
            if(items[133].count<=0)
            {
                ClearBattle( Battle );
                ClearItem( items[133] );            
            }                   
        break;
        case 233:
            items[134].count--;
            if(items[134].count<=0)
            {
                ClearBattle( Battle );
                ClearItem( items[134] );                                        
            }                   
        break;
        case 271:
            items[132].count--;
            if(items[132].count<=0)
            {
                ClearBattle( Battle );
                ClearItem( items[135] );                    
            }   
        break;
    }     
}

// return party pointer
CParty* CPlayer::GetParty( )
{
    return Party->party;
}

// return intelligence
unsigned int CPlayer::GetInt( )
{
    return Attr->Int;
}

// add item [return item slot [0xffff if couldn't add it]]
unsigned int CPlayer::AddItem( CItem item )
{
    unsigned int newslot=0;
    newslot = GetNewItemSlot( item );
    if(newslot!=0xffff)
    {
        if(items[newslot].count>0)
        {
            unsigned int ntcount = item.count;
            unsigned int utcount = items[newslot].count;            
            if(ntcount+utcount>999)
            {
                item.count = ntcount+utcount - 999;
                items[newslot].count = 999;
                unsigned int otherslot = GetNewItemSlot( item );                                
                if(otherslot!=0xffff)
                {
                    if(items[otherslot].count!=0) items[otherslot].count += item.count;       
                    else items[otherslot] = item;
                    return newslot*1000+otherslot;            
                }
                else
                {
                    items[newslot].count = utcount;
                    return 0xffff; //not inventory space
                }
            }
            else items[newslot].count = ntcount+utcount;
        }
        else items[newslot] = item;
    }
    return newslot;
}

void CPlayer::UpdateInventory( unsigned int slot1, unsigned int slot2 )
{
    if(slot1==0xffff && slot2==0xffff) return;
    BEGINPACKET( pak, 0x718 );
    if(slot2!=0xffff && slot2!=0xffff) {ADDBYTE( pak, 2 );}
    else {ADDBYTE( pak, 1 );}
    if(slot1!=0xffff)
    {
        ADDBYTE    ( pak, slot1);
        ADDDWORD   ( pak, GServer->BuildItemHead( items[slot1] ) );
        ADDDWORD   ( pak, GServer->BuildItemData( items[slot1] ) );
    }    
    if(slot2!=0xffff)
    {
        ADDBYTE    ( pak, slot2 );
        ADDDWORD   ( pak, GServer->BuildItemHead( items[slot2] ) );
        ADDDWORD   ( pak, GServer->BuildItemData( items[slot2] ) );
    }
    client->SendPacket( &pak );    
}

void CPlayer::reduceItemsLifeSpan( bool attacked)
{
        hits=0;
        for (int i=1; i< 9; i++) //Find check all equip slots for equiped items
        {
            if ( (i!=7 && attacked) || ( i==7 && (!attacked) ) )
            {
             items[i].durabLeft = (items[i].durabLeft<=0 ? items[i].durability*5:items[i].durabLeft-1);
             //Log(MSG_INFO, "DurabLeft: %i", items[i].durabLeft);
             if (items[i].durabLeft < 1)
             if (items[i].itemnum != 0 && items[i].appraised )
             {
                //Log( MSG_INFO, "Reducing item's life span!\nItemId: %i type: %i", items[i].itemnum, items[i].itemtype);
                items[i].lifespan--;
                if (items[i].lifespan < 1)
                {
                   ClearItem( items[i] );
                   BEGINPACKET( pak, 0x7a5);     
                   ADDWORD( pak, clientid );
	               ADDWORD( pak, i);							
	               ADDWORD( pak, 0);
	               ADDWORD( pak, 0);
	               ADDWORD( pak, Stats->Move_Speed );
                   GServer->SendToVisible( &pak,this );    
                }
                   UpdateInventory(i);
             }
            }
        }
}

unsigned CPlayer::getWeaponType()
{
         return GServer->EquipList[WEAPON].Index[items[7].itemnum]->type;
}

//removes bugged or restricted items - By PurpleYouko
bool CPlayer::CheckItems()
{
     CPlayer* thisclient = GServer->GetClientByCharName( CharInfo->charname );
     if(thisclient->items[7].itemtype == 8 && thisclient->items[7].itemnum == 40)
     {
         thisclient->items[7].count = 0;
         ClearItem( thisclient->items[7] );
         GServer->SendPM(thisclient, "Sorry. The Morningstar is a banned item. It has been confiscated");                
         thisclient->SetStats( );
     }
    return true;
 }

//Check for negative zuly by PurpleYouko
bool CPlayer::CheckZulies()
{
    //save character info so that we can look at it later in the database
    CPlayer* thisclient = GServer->GetClientByCharName( CharInfo->charname );
    if((CharInfo->Zulies < 0) || (CharInfo->Storage_Zulies < 0))
    {
        thisclient->savedata();
        //now kick the player out
        BEGINPACKET( pak, 0x702 );
        ADDSTRING( pak, "You have been disconnected from the server for Zuly hacking!" );
        ADDBYTE( pak, 0 );
        thisclient->client->SendPacket( &pak );
 
        RESETPACKET( pak, 0x707 );
        ADDWORD( pak, 0 );
        thisclient->client->SendPacket( &pak );
 
        thisclient->client->isActive = false;
    }
  return true;
}

bool CPlayer::AddClanPoints(unsigned int count)
{
     if ( Clan== NULL ) return true;
     //load clan info in char server
	BEGINPACKET( pak, 0x7e0 );
	ADDBYTE    ( pak, 0xfb ); //action to update clan informacion (charserver)
	ADDWORD    ( pak, Clan->clanid );
	ADDWORD    ( pak, CharInfo->charid );
	ADDWORD    ( pak, clientid );
	ADDWORD    ( pak, count );
	cryptPacket( (char*)&pak, GServer->cct );
	send( GServer->csock, (char*)&pak, pak.Size, 0 );
	
	printf("added %i clan points\n", count);
}

CClientSocket* CPlayer::getClient()
{
   return client;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -