📄 playerfunctions.cpp.svn-base
字号:
}
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 + -