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; }
//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; } } } } }