📄 kein_item.cpp
字号:
}
int IsEqualPosByPos( POS first, POS second )
{
if( first.type != second.type ||
first.p1 != second.p1 ||
first.p2 != second.p2 ||
first.p3 != second.p3 ) return 0;
return 1;
}
void CheckItem( short int cn ) // 肋给等 酒捞袍阑 啊瘤绊 乐绰瘤
{ //021126 lsw
CHARLIST *ch = CheckServerId(cn);
if( !ch ) {return;}
POS pos = {0,};
int a=0, b=0, c=0;
for( a=0; a<3; a++ )
for( b=0; b<3; b++ )
for( c=0; c<8; c++ )
{
ItemAttr *pItem = &ch->inv[a][b][c];
if(pItem->item_no)
{
if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框
{
::SetItemPos( INV, a, b, c, &pos );
::SendServerEachItem( &pos, pItem, cn );
::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
}
}
}
for( a=0; a<ITEM_EQUIP_MAX; a++ )
{
ItemAttr *pItem = &ch->equip[a];
if(pItem->item_no)
{
if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框
{
::SetItemPos( EQUIP, a, &pos );
::SendServerEachItem( &pos, pItem, cn );
::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
}
}
}
for( a=0; a<ITEM_QUICK_MAX ; a++ )
{
ItemAttr *pItem = &ch->quick[a];
if(pItem->item_no)
{
//soto-030513 狞 5锅篮 缴杭 酒捞袍捞促.
if( a >= 5)
{
::SetItemPos( QUICK, a, &pos );
::SendServerEachItem( &pos, pItem, cn );
::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
}
else
if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框
{
::SetItemPos( QUICK, a, &pos );
::SendServerEachItem( &pos, pItem, cn );
::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
}
}
}
for( a=0; a<5; a++ )
for( b=0; b<3; b++ )
for( c=0; c<6; c++ )
{
ItemAttr *pItem = &ch->bank[a][b][c];
if(pItem->item_no)
{
if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框
{
::SetItemPos( BANK, a, b, c, &pos );
::SendServerEachItem( &pos, pItem, cn );
::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
}
}
}
return;
}
// 020428 YGI acer
int BreakItemByDuration( ItemAttr *pItem, CHARLIST *ch, POS pos ) // 郴备档啊 力肺 老锭 酒捞袍阑 何脚促.
{
SendItemEventLog( pItem, ch->GetServerID(), SN_NOT_USER, SILT_DELETE_BY_DURATION, 2 ); //YGI acer
SendDeleteItem( pItem, &pos, ch, true );
CheckAndSendChangeEquip( ch );
return 1;
}
int CheckAutoDivideMoney( ItemAttr *item, const short int cn ) // 100000阑 逞篮 酒捞袍 贸府
{//021126 lsw
CItem *t = ItemUnit( *item );
if( !t ) {return 0 ;}
if( t->GetItemKind() != IK_MONEY
&& t->GetItemKind() != IK_NEW_MONEY ) {return 0;} // 捣老 版快父
CHARLIST *ch = ::CheckServerId( cn );
if( !ch ) {return 0;}
if( item->attr[IATTR_DURATION] > MAX_MONEY ) //100父盔 逞绢啊匙
{//啊甫 酒捞袍捞 100父盔阑 逞绰促
int a=0, b=0, c=0;
if( !::SearchMoneyItem( ch->inv, a, b, c ) )//后傍埃捞唱 捣捞 绝匙
{//后傍埃捞唱 捣捞 绝匙
ItemAttr temp_item = *item;//捣酒捞袍阑 temp俊 措涝
item->attr[IATTR_MUCH] = MAX_MONEY;//100父盔栏肺 父甸绢 林绊
temp_item.attr[IATTR_MUCH] -= MAX_MONEY;//100父盔 焊促 农聪鳖 100父盔阑 哗歹扼档 -蔼篮 救等促
::SendItemEventLog( &temp_item , cn, cn, SILT_PUT_GROUND_MAX_INVEN, 1 );
::DropItem( ch->X, ch->Y, &temp_item );//规陛傈 巴俊辑 100父盔 猾 捣阑 官蹿俊 汝赴促
}//if( !::SearchMoneyItem( ch->inv, a, b, c ) )//后傍埃捞唱 捣捞 绝匙
else
{//后傍埃捞唱 捣捞 乐匙
ItemAttr *new_item = &ch->inv[a][b][c];
if( new_item->item_no )
{//弊霸 捣捞扼搁 SearchMoneyItem俊 狼秦 捣锅龋父 府畔 等促
new_item->attr[IATTR_MUCH] += (item->attr[IATTR_MUCH] - MAX_MONEY);//100父盔 逞扁 锭巩俊 100父盔阑 逞篮 咯盒狼 捣阑 歹茄促
}
else
{//后沫 捞扼搁
*new_item = *item;
new_item->attr[IATTR_MUCH] = (item->attr[IATTR_MUCH] - MAX_MONEY);//100父盔 咯盒阑 牢亥俊 持绰促
}
item->attr[IATTR_MUCH] = MAX_MONEY;
::SendServerEachItem( item, ch );//搬苞拱狼 函拳甫 努扼捞攫飘肺 朝妨霖促
if( new_item->attr[IATTR_MUCH] > MAX_MONEY )
{//林绊抄 酒捞袍捞 100父 逞栏搁 唱床龙锭 鳖瘤 拌加 唱传促
::CheckAutoDivideMoney( new_item, cn );
}
POS pos = {0,};
::SetItemPos( INV, a, b, c, &pos );
::SendServerEachItem( &pos, new_item, cn );
return 1;
}
}//if( item->attr[IATTR_DURATION] > MAX_MONEY ) //100父盔 逞绢啊匙
else//100父盔 救逞匙.. 唱喘 鞘夸啊 绝促
{
return 2;
}
return 0;
}
////////////////////// 弊 酒捞袍 弊 困摹俊 沥富肺 粮犁窍绰 啊? ////////////////////
bool ExistItem( short int cn, ItemAttr item, POS pos ) // 沥富 粮犁窍绰 啊?
{
CHARLIST *ch = &connections[cn].chrlst;
if( !ch ) return false;
ItemAttr *target = GetItemByPOS( cn, pos );
if( !target ) return false;
int ret = memcmp( &item, target, sizeof( ItemAttr ) );
if( ret == 0 ) return true;
return false;
}
////////////////////////// 酒捞袍 公霸俊 狼茄 movp //////////////////////
int CalcMovpByItem( CHARLIST *ch, int movp )
{
return movp;
int result = 0;
int max = ch->Str * 100;
if( ch->itemweight <= max ) return movp;
if( max )
{
float rate = ( ch->itemweight - max ) / ((float)max) * 100.0f;
int move_down = (int) ((rate*2)/100.0f*movp );
result = movp - move_down;
}
if( result < 0 ) result = 0;
return result;
}
void CheckEquipItem( CHARLIST *ch ) // 酒捞袍阑 捞悼沁阑锭
{
for( int c=0; c<8; c++ )
{
ItemAttr *item = &ch->equip[c];
if( item->item_no )
{
CItem *t = ItemUnit(item->item_no);
if( !t )
{
SendItemEventLog( item, ch->GetServerID(), 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
memset( item, 0, sizeof( ItemAttr ) );
continue;
}
if( !t->GetItemImage() || !t->GetObjectNumber() )
{
SendItemEventLog( item, ch->GetServerID(), 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
memset( item, 0, sizeof( ItemAttr ) );
continue;
}
t_chr_status_info cstatus;
POS source = {0, };
POS dest;
SetItemPos( EQUIP, c, &dest );
if( t->is_equipable( ch->GetServerID(), &cstatus, source, dest ) == NOT )
{
MoveEmptyInv( item, ch );
SendServerEachItem( &dest, item, ch->GetServerID()); // 绝绢柳 荤角阑 努扼捞攫飘俊 舅赴促.
t->ReleaseItem( ch );
continue;
}
}
}
}
//////////////////////////////////////////////////////////////////////
// 酒捞袍 厘馒俊 狼茄 hp, mana 焊沥
void ChangePlusHp( CHARLIST *ch, int hp_max_plus, int mp_max_plus )
{
ch->HpMax += hp_max_plus;
ch->ManaMax += mp_max_plus;
}
int CItem_Weapon::PlusHp(CHARLIST *ch )
{
if( ch->Spell ) ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
else ChangePlusHp( ch, Change_Life_max, Change_mana_max);
return 1;
}
int CItem_Armor::PlusHp(CHARLIST *ch)
{
if( ch->Spell ) ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
else ChangePlusHp( ch, Change_Life_max, Change_mana_max);
return 1;
}
int CItem_Accessory::PlusHp(CHARLIST *ch)
{
if( ch->Spell ) ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
else ChangePlusHp( ch, Change_Life_max, Change_mana_max);
return 1;
}
int CItem_Etc::PlusHp(CHARLIST *ch)
{
if( ch->Spell ) ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
else ChangePlusHp( ch, Change_Life_max, Change_mana_max);
return 1;
}
////////////////////////////////////////////////////////////////////////
// 漂沥 酒捞袍苞 郴啊 啊柳 酒捞袍狼 肮荐狼 瞒甫 府畔
int CheckInventory( CHARLIST *ch, int item, int count )
{
int ct = 0;
for( int a=0; a<3; a++ )
{ for( int b=0; b<3; b++ )
{ for( int c=0; c<8; c++ )
{
if(ch->inv[a][b][c].item_no == item )
{
ct++;
}
}
}
}
return ct - count;
}
// 漂沥 酒捞袍阑 盔窍绰 肮荐父怒 瘤款促.
int SendDeleteMuchItemQuantity( CHARLIST *ch, int item, int count )
{
if( !count ) return 1;
int ct = 0;
for( int a=0; a<3; a++ )
for( int b=0; b<3; b++ )
for( int c=0; c<8; c++ )
{
ItemAttr *lpItem = &ch->inv[a][b][c];
if( lpItem->item_no == item )
{
if( lpItem->attr[IATTR_MUCH] > count )
{
lpItem->attr[IATTR_MUCH] -= count;
POS pos;
SetItemPos( INV, a, b, c, &pos );
// 蔼捞 皑家 灯澜阑 焊郴霖促.
SendChangeDurationByKein( &pos, lpItem->attr[IATTR_MUCH], ch->GetServerID());
return 1;
}
else if( lpItem->attr[IATTR_MUCH] == count )
{
POS pos;
SetItemPos( INV, a, b, c, &pos );
// 020428 YGI acer
SendDeleteItem( lpItem, &pos, ch );
return 1;
}
else
{
count -= lpItem->attr[IATTR_MUCH];
POS pos;
SetItemPos( INV, a, b, c, &pos );
// 020428 YGI acer
SendDeleteItem( lpItem, &pos, ch );
continue;
}
}
}
return 0;
}
// 漂沥 酒捞袍阑 盔窍绰 肮荐父怒 瘤款促.
int SendDeleteItemQuantity( CHARLIST *ch, int item, int count )
{
if( !count ) return 1;
int ct = 0;
for( int a=0; a<3; a++ )
for( int b=0; b<3; b++ )
for( int c=0; c<8; c++ )
{
if(ch->inv[a][b][c].item_no == item )
{
POS pos;
SetItemPos( INV, a, b, c, &pos );
// 020428 YGI acer
SendItemEventLog( &ch->inv[a][b][c], ch->GetServerID(), -2, SILT_NEED_ITEM, 6 ); //YGI acer
SendDeleteItem( &ch->inv[a][b][c], &pos, ch );
ct++;
if( ct >= count ) return 1;
}
}
return 0;
}
int EquipItem( CHARLIST *ch )//020303 lsw
{
for( int i=0; i<8; i++ )
{
if( ch->equip[i].item_no )
{
CItem *t = ItemUnit( ch->equip[i] );
if( !t ) continue;
switch (t->GetWearAble())
{
case WEAR_ANYTHING :
case WEAR_RIGHT_HAND :
case WEAR_LEFT_HAND :
case WEAR_HEAD :
case WEAR_BODY :
case WEAR_NECK :
case WEAR_SHOES :
case WEAR_UNIQUE :
case WEAR_TWO_HAND :
{
t->EquipItem( ch );
}
break;
case WEAR_BELT :
case WEAR_ONLY_INVEN :
default:
{
}
break;
}
}
}
ResetAbility(ch);
return 1;
}
int ReleaseItem( CHARLIST *ch )
{
for( int i=0; i<8; i++ )
{
if( ch->equip[i].item_no )
{
CItem *t = ItemUnit( ch->equip[i] );
if( !t ) continue;
t->ReleaseItem( ch );
}
}
// ch->ResetAbility();
ResetAbility(ch);//020215 lsw
return 1;
}
int DeleteINVItem(CHARLIST* pChar,int nItemNumber,int nDelCount)
{
int nDeletedCount = 0;
for(int i = 0;i < 3;++i)
for(int j = 0;j < 3;++j)
for(int k = 0;k < 8;++k)
{
if(pChar->inv[i][j][k].item_no == nItemNumber)
{
POS pos;
if(nDelCount == 0)
{
SetItemPos( INV, i, j, k, &pos );
SendItemEventLog( &pChar->inv[i][j][k], pChar->GetServerID(), -2, SILT_NEED_ITEM, 6 );
SendDeleteItem( &pChar->inv[i][j][k], &pos, pChar );
++nDeletedCount;
}
else
{
if(nDelCount > nDeletedCount)
{
SetItemPos( INV, i, j, k, &pos );
SendItemEventLog( &pChar->inv[i][j][k], pChar->GetServerID(), -2, SILT_NEED_ITEM, 6 );
SendDeleteItem( &pChar->inv[i][j][k], &pos, pChar );
++nDeletedCount;
}
else
{
continue;
}
}
}
}
return nDeletedCount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -