bool gObjChangeBuffValidTime(LPOBJ lpObj,int iBuffIndex,int iTime)
{
	if(lpObj == NULL)
		return false;

	if(lpObj->Connected < PLAYER_PLAYING)
		return false;

	DWORD iTimeValue = GetTickCount();

	for(int i = 0; i < MAX_STATE_COUNT; i++)
	{
		if(i > lpObj->btEffectCount)
			return false;

		if(lpObj->pEffectInfo[i].btEffectNum == iBuffIndex)
		{
			lpObj->pEffectInfo[i].iTimeValue += iTime;

			if(lpObj->pEffectInfo[i].iTimeValue < 0)
			{
				gObjRemoveBuffEffect(lpObj, iBuffIndex);
			}
			return true;
		}
	}
	return false;
}
Beispiel #2
0
//006bbab0
bool CPeriodItemEx::RemovePeriodItemData(LPOBJ lpObj, BYTE btItemType, WORD wItemCode, unsigned long dwSerial)	//OK
{
	if( !lpObj )
		return false;

	if( lpObj->Type != OBJ_USER || lpObj->Connected < 2 )
		return false;

	if( btItemType == 1 )
	{
		BUFF_EFFECT_DATE* lpBuffData = 0;
		lpBuffData = g_BuffEffectSlot.GetEffectDataFromItemCode(wItemCode);

		if( !lpBuffData )
			return false;

		gObjRemoveBuffEffect(lpObj,lpBuffData->btIndex);
	}
	else if( btItemType == 2 )
	{
		if( dwSerial == 0 )
			return false;

		int iInventoryPosition = 0;
		iInventoryPosition = this->GetItemFromInventory(lpObj,wItemCode,dwSerial);

		if( iInventoryPosition == -1 )
			return false;

		SetDisableItemToExpire(lpObj,iInventoryPosition);
		//auto-deleting
		gObjInventoryDeleteItem(lpObj->m_Index, iInventoryPosition);
		GCInventoryItemDeleteSend(lpObj->m_Index, iInventoryPosition, 1);
		gObjCalCharacter(lpObj->m_Index);
		// ----
		if( iInventoryPosition < 12 )
		{
			if( iInventoryPosition == 10 || iInventoryPosition == 11 )
			{
				gObjUseSkill.SkillChangeUse(lpObj->m_Index);
			}
			// ----
			gObjMakePreviewCharSet(lpObj->m_Index);
			PMSG_USEREQUIPMENTCHANGED pChange;
			PHeadSetB((LPBYTE)&pChange, 0x25, sizeof(pChange));
			pChange.NumberH = SET_NUMBERH(lpObj->m_Index);
			pChange.NumberL = SET_NUMBERL(lpObj->m_Index);
			ItemByteConvert(pChange.ItemInfo, lpObj->pInventory[iInventoryPosition]);
			pChange.ItemInfo[1] = iInventoryPosition <<  4;
			pChange.ItemInfo[1] |= LevelSmallConvert(lpObj->m_Index, iInventoryPosition) & 0x0F;
			DataSend(lpObj->m_Index, (LPBYTE)&pChange, pChange.h.size);
			MsgSendV2(lpObj, (LPBYTE)&pChange, pChange.h.size);
		}
	}
	else
	{
		return false;
	}


	ITEMDATA ItemData;
	ItemData.btType = btItemType;
	ItemData.wItemCode = wItemCode;
	ItemData.dwSerial = dwSerial;

	RequestPeriodItemDelete(lpObj,&ItemData);
	return true;
}
BOOL TMonsterSkillElement::ApplyElementSummon(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];

	if( lpObj->Class == 459 &&
		lpObj->Connected == PLAYER_PLAYING &&
		lpObj->MapNumber == MAP_INDEX_RAKLIONBOSS &&
		iIndex == iTargetIndex)
	{
		LogAddTD("[TMonsterSkillElement][ApplyElementSummon] Selupan use summon.");
		return FALSE;
	}

	if ( lpTargetObj->Connected < PLAYER_PLAYING ||
		 lpTargetObj->Type != OBJ_MONSTER )
		 return FALSE;

	lpTargetObj->Life = lpTargetObj->MaxLife + lpTargetObj->AddLife;
	lpTargetObj->Mana = lpTargetObj->MaxMana + lpTargetObj->AddMana;
	lpTargetObj->Live = TRUE;

	gObjRemoveBuffEffect(lpTargetObj,BUFF_POISON);
	gObjRemoveBuffEffect(lpTargetObj,BUFF_ICE);
	gObjRemoveBuffEffect(lpTargetObj,BUFF_ICEARROW);

	lpTargetObj->m_ViewState = 0;
	lpTargetObj->Teleport = 0;

	gObjClearBuffEffect(lpTargetObj,CLEAR_TYPE_LOGOUT);

	for ( int i=0;i<MAX_SELF_DEFENSE;i++)
		lpTargetObj->SelfDefenseTime[i] = 0;

	gObjTimeCheckSelfDefense(lpTargetObj);
	gObjViewportListProtocolDestroy(lpTargetObj);
	gObjViewportClose(lpTargetObj);
	lpTargetObj->m_ActState.Attack = 0;
	lpTargetObj->m_ActState.EmotionCount = 0;
	lpTargetObj->m_ActState.Escape = 0;
	lpTargetObj->m_ActState.Move = 0;
	lpTargetObj->m_ActState.Rest = 0;
	lpTargetObj->m_ActState.Emotion = 0;
	lpTargetObj->TargetNumber = -1;
	lpTargetObj->NextActionTime = 5000;

	if ( this->m_iIncAndDecValue < 0 )
		this->m_iIncAndDecValue = 10;

	BYTE cX;
	BYTE cY;
	BOOL bGetPosition = FALSE;
	int iCount = 100;


	while ( iCount-- != 0 )
	{
		cX = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->X;
		cY = ( rand() % (this->m_iIncAndDecValue+1) ) * (((rand()%2==0)?-1:1)) + lpObj->Y;

		BYTE btMapAttr = MapC[lpObj->MapNumber].GetAttr(cX, cY);

		if ( btMapAttr == 0 )
		{
			bGetPosition = TRUE;
			break;
		}
	}

	if ( bGetPosition == FALSE )
	{
		lpObj->Live = FALSE;
		lpObj->m_State = 4;
		lpObj->RegenTime = GetTickCount();
		lpObj->DieRegen = 1;

		return FALSE;
	}

	lpTargetObj->X = cX;
	lpTargetObj->Y = cY;
	lpTargetObj->MTX = lpTargetObj->X;
	lpTargetObj->MTY = lpTargetObj->Y;
	lpTargetObj->TX = lpTargetObj->X;
	lpTargetObj->TY = lpTargetObj->Y;
	lpTargetObj->StartX = lpTargetObj->X;
	lpTargetObj->StartY = lpTargetObj->Y;

	gObjMonsterHitDamageInit(lpTargetObj);
	CreateFrustrum(lpTargetObj->X, lpTargetObj->Y, lpTargetObj->m_Index);
	lpTargetObj->DieRegen = 0;
	lpTargetObj->m_State = 1;
	lpTargetObj->m_Agro.ResetAll();
	gObjViewportListCreate(lpTargetObj->m_Index);

	return FALSE;
}
bool gObjClearBuffEffect(LPOBJ lpObj,enum eBuffClearType ClearType)
{
	if(lpObj == NULL)
		return 0;

	if(lpObj->m_Index < 0 || lpObj->m_Index > OBJMAX)
		return 0;

	int iRemoveBuffEffectCount = 0;
	int iBuffIndex = 0;
	
	switch(ClearType)
	{
	case CLEAR_TYPE_CASTLESIEGE:
		{
			for(iBuffIndex = 0; iBuffIndex < MAX_STATE_COUNT; iBuffIndex++)
			{
				switch(lpObj->pEffectInfo[iBuffIndex].btEffectNum)
				{
				case AT_WATCHING_TOWER:
				case AT_ATTACKING_GUILD1:
				case AT_ATTACKING_GUILD2:
				case AT_ATTACKING_GUILD3:
					{
						if(gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[iBuffIndex].btEffectNum) == TRUE)
						{
							iRemoveBuffEffectCount++;
							iBuffIndex--;
						}
					}
					break;
				default:
					{
						break;
					}
					break;
				}
			}
		}
		break;
	case CLEAR_TYPE_PCBANG_SEAL_FINISH:
		{
			for(iBuffIndex = 0; iBuffIndex < MAX_STATE_COUNT; iBuffIndex++)
			{
				switch(lpObj->pEffectInfo[iBuffIndex].btEffectNum)
				{
				case AT_PCBANG_SEAL_OF_ASCENSION:
				case AT_PCBANG_SEAL_OF_WEALTH:
				case AT_PCBANG_SEAL_OF_SUSTENANCE:
					{
						if(gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[iBuffIndex].btEffectNum) == TRUE)
						{
							iRemoveBuffEffectCount++;
							iBuffIndex--;
						}
					}
					break;
				default:
					{
						break;
					}
					break;
				}
			}
		}
		break;
	case CLEAR_TYPE_NON_PCS_ITEM_EFFECT:
		{
			for(iBuffIndex = 0; iBuffIndex < MAX_STATE_COUNT; iBuffIndex++)
			{
				switch(lpObj->pEffectInfo[iBuffIndex].btEffectNum)
				{
				case AT_PCBANG_SEAL_OF_ASCENSION:
				case AT_PCBANG_SEAL_OF_WEALTH:
				case AT_PCBANG_SEAL_OF_SUSTENANCE:

				case AT_CSHOP_SEAL_OF_ASCENSION:
				case AT_CSHOP_SEAL_OF_WEALTH:
				case AT_CSHOP_SEAL_OF_SUSTENANCE:
				case AT_CSHOP_SEAL_OF_MOBILITY:

				case AT_CSHOP_SCROLL_OF_QUICKNESS:
				case AT_CSHOP_SCROLL_OF_DEFENSE:
				case AT_CSHOP_SCROLL_OF_WRATH:
				case AT_CSHOP_SCROLL_OF_WIZARDRY:
				case AT_CSHOP_SCROLL_OF_HEALTH:
				case AT_CSHOP_SCROLL_OF_MANA:

				case AT_CSHOP_LEAP_OF_STRENGTH:
				case AT_CSHOP_LEAP_OF_QUICKNESS:
				case AT_CSHOP_LEAP_OF_HEALTH:
				case AT_CSHOP_LEAP_OF_ENERGY:
				case AT_CSHOP_LEAP_OF_CONTROL:

				case AT_CSHOP_SEAL_OF_HEALING:
				case AT_CSHOP_SEAL_OF_DIVINITY:

				case AT_CSHOP_SCROLL_OF_BATTLE:
				case AT_CSHOP_SCROLL_OF_STRENGTHENER:

				case AT_CSHOP_GUARDIAN_AMULET:
				case AT_CSHOP_PROTECT_AMULET:
				case AT_CSHOP_MASTER_SEAL_OF_ASCENSION:
				case AT_CSHOP_MASTER_SEAL_OF_WEALTH:
				case 112:
				case 113:
				case 114:
				case 119:
				case 120:
				case 121:
				case 122:
				case 123:
				case 124:
				case 125:
				case 126:
				case 127:
				case 128:
					break;
				default:
					{
						if(gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[iBuffIndex].btEffectNum) == TRUE)
						{
							iRemoveBuffEffectCount++;
							iBuffIndex--;
						}
					}
					break;
				}
			}
		}
		break;
	case CLEAR_TYPE_LOGOUT:
		{
			for(iBuffIndex = 0; iBuffIndex < MAX_STATE_COUNT; iBuffIndex++)
			{
				if(gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[iBuffIndex].btEffectNum) == TRUE)
				{
					iRemoveBuffEffectCount++;
					iBuffIndex--;
				}
			}
			lpObj->btEffectCount = 0;
		}
		break;
	case CLEAR_TYPE_MONSTERREGEN:
		for( iBuffIndex = 0; iBuffIndex < MAX_EFFECT_INFO; iBuffIndex++)
		{
			switch( lpObj->pEffectInfo[iBuffIndex].btEffectNum )
			{
			case BUFF_WEAKNESS:
			case BUFF_WEAKNESS2:
			case BUFF_INNOVATION	:
			case BUFF_INNOVATION2:
			case BUFF_BLIND:
			case BUFF_BLIND2:
			case BUFF_DECREASE_DEFRATE:
			case BUFF_DECREASE_DEFRATE2:
			case BUFF_CONFUSION:
				if( gObjRemoveBuffEffect(lpObj,lpObj->pEffectInfo[iBuffIndex].btEffectNum) == TRUE )
				{
					iRemoveBuffEffectCount++;
					iBuffIndex--;
				}
				break;
			}
		}
		break;
	default:
		{
			iRemoveBuffEffectCount = g_BuffEffectSlot.ClearEffect(lpObj,ClearType);
		}
		break;
	}

	if(lpObj->btEffectCount < 0 || lpObj->btEffectCount > MAX_STATE_COUNT)
	{
		lpObj->btEffectCount = 0;
	}

	gObjSendBuffList(lpObj);
	return true;
}
void gObjCheckBuffEffectList(LPOBJ lpObj)
{
	if(lpObj == NULL)
		return;

	if(lpObj->m_Index < 0 || lpObj->m_Index > OBJMAX)
		return;

	if( (lpObj->Type == OBJ_USER && lpObj->Connected >= PLAYER_PLAYING) || lpObj->Type == OBJ_MONSTER)
	{
		for(int i = 0; i < MAX_STATE_COUNT; i++)
		{
			if(lpObj->pEffectInfo[i].iTimeValue == -10)
				continue;

			if(lpObj->pEffectInfo[i].btEffectNum == NULL)
				continue;

			switch(lpObj->pEffectInfo[i].btEffectNum)
			{
			case AT_POISON:
				{
					if((lpObj->pEffectInfo[i].iTimeValue % 3) == 0) //Rand type??
					{
						g_BuffEffect.SetActiveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectType1, lpObj->pEffectInfo[i].iEffectValue1);
						g_BuffEffect.SetActiveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectType2, lpObj->pEffectInfo[i].iEffectValue2);
					}
				}
				break;
			default:
				{
					g_BuffEffect.SetActiveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectType1, lpObj->pEffectInfo[i].iEffectValue1);
					g_BuffEffect.SetActiveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectType2, lpObj->pEffectInfo[i].iEffectValue2);
				}
				break;
			}
			
			lpObj->pEffectInfo[i].iTimeValue--;

			if(lpObj->pEffectInfo[i].iTimeValue <= 0)
			{
				/*if( lpObj->pEffectInfo[i].btEffectNum == AT_RFVITALITY ||
					lpObj->pEffectInfo[i].btEffectNum == BUFF_SWELL_LIFE3 ||
					lpObj->pEffectInfo[i].btEffectNum == BUFF_MANASHIELD2 ||)
				{
					gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectNum);
					gObjCalCharacter(lpObj->m_Index);
				}
				else
				{
					
				}*/
				gObjRemoveBuffEffect(lpObj, lpObj->pEffectInfo[i].btEffectNum);

				switch( lpObj->pEffectInfo[i].btEffectNum )
				{
				case BUFF_INCREASE_VIT:
				case BUFF_INCREASE_VIT2:
				case BUFF_SWELL_LIFE3:
				case BUFF_MANASHIELD2:
				case BUFF_BLESS:
				case BUFF_BLESS2:
				case BUFF_ADD_CRITDMG3:
					gObjCalCharacter(lpObj->m_Index);
					break;
				}
			}
		}
	}
}