void CRaklionSelupan::DeleteSummonMonster() { LPOBJ lpObj = NULL; for(int i=0;i< OBJ_MAXMONSTER;i++) { lpObj = &gObj[i]; if(lpObj->MapNumber != MAP_INDEX_RAKLIONBOSS) { continue; } if(lpObj->Class == 457 || lpObj->Class == 458) { gObjViewportListProtocolDestroy(lpObj); gObjViewportClose(lpObj); gObjDel(lpObj->m_Index); lpObj->Live = FALSE; lpObj->DieRegen = TRUE; } } LogAddC(5,"[ RAKLION ] [ DeleteSummonMonster ] Delete All SummonMonster"); }
void CRaklionSelupan::DeleteSelupan() { int aIndex = this->GetSelupanObjIndex(); gObjViewportListProtocolDestroy(&gObj[aIndex]); gObjViewportClose(&gObj[aIndex]); gObjDel(aIndex); }
BOOL TMonsterSkillElement::ApplyElementSummon(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; 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; lpTargetObj->m_PoisonBeattackCount = 0; lpTargetObj->m_ColdBeattackCount = 0; lpTargetObj->m_ViewState = 0; lpTargetObj->Teleport = 0; memset(lpTargetObj->m_ViewSkillState,0,sizeof(lpTargetObj->m_ViewSkillState)); 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 = (BYTE)lpTargetObj->X; lpTargetObj->StartY = (BYTE)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 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; }
void cDuelSystem::Run() { for(short i = 0; i < MAX_DUEL_ROOMS; ++i) { if(this->g_DuelRooms[i].RoomFree == FALSE) { if(GetTickCount() - this->g_DuelRooms[i].dwStartTime < 5000) { continue; } for(short u = 0; u < MAX_DUEL_SEPARATORS; u++) { if(this->g_DuelRooms[i].szSeparators[u] == NULL) { continue; } if(Utilits.gObjIsConnected(this->g_DuelRooms[i].szSeparators[u]->m_Index)) { if(this->g_DuelRooms[i].szSeparators[u]->MapNumber != 0x40) { this->SendEndDuel(this->g_DuelRooms[i].szSeparators[u]); AddBuff(this->g_DuelRooms[i].szSeparators[u], 18, 0, 0, 0, 0, 1); gObjViewportListProtocolCreate(this->g_DuelRooms[i].szSeparators[u]); GCStateInfoSendg(this->g_DuelRooms[i].szSeparators[u], 0, 98); if(Config.Logging) { Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System] Spectator [%s] Leave [%d] Room",this->g_DuelRooms[i].szSeparators[u]->Name, i + 1); } this->SendSpectatorRemove(u, i); this->g_DuelRooms[i].szSeparators[u] = NULL; } } else { if(Config.Logging) { Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System] Spectator Leave Room [%d]", i + 1); } this->g_DuelRooms[i].szSeparators[u] = NULL; this->SendSpectatorList(i); } SendSpectatorList(i); } if(this->g_DuelRooms[i].szlpObjOne != NULL || this->g_DuelRooms[i].szlpObjTy != NULL) { if ( Utilits.gObjIsConnected(this->g_DuelRooms[i].szlpObjOne->m_Index) == FALSE || Utilits.gObjIsConnected(this->g_DuelRooms[i].szlpObjTy->m_Index) == FALSE ) { this->RoomReset(i); continue; } else if ( (this->g_DuelRooms[i].szlpObjOne->MapNumber != 0x40 || this->g_DuelRooms[i].szlpObjTy->MapNumber != 0x40) && this->g_DuelRooms[i].szWinner == FALSE ) { this->RoomReset(i); continue; } else if(this->g_DuelRooms[i].szlpObjOne->Connected < PLAYER_PLAYING || this->g_DuelRooms[i].szlpObjTy->Connected < PLAYER_PLAYING) { this->RoomReset(i); continue; } } else { this->RoomReset(i); continue; } if(this->UpdateLifebarTime < GetTickCount()) { this->SendLifebarStatus(i); this->UpdateLifebarTime = GetTickCount() + 2000; } if(this->g_DuelRooms[i].dwTicketCount != 0) { if(this->g_DuelRooms[i].dwTicketCount < GetTickCount()) { this->RoomReset(i); if(Config.Logging) { Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System] Room [%d] Cleaned", i + 1); } } } if(this->g_DuelRooms[i].RoomFree == FALSE && this->g_DuelRooms[i].DuelWaiting == FALSE && this->g_DuelRooms[i].szWinner == FALSE) { for(short s = 0; s < MAX_DUEL_SEPARATORS; s++) { if(this->g_DuelRooms[i].szSeparators[s] != NULL) { if(AddTab[this->g_DuelRooms[i].szSeparators[s]->m_Index].DUEL_SpecVisible == 1) { AddBuff(this->g_DuelRooms[i].szSeparators[s], 18, 0, 0, 0, 0, -10); gObjViewportListProtocolDestroy(this->g_DuelRooms[i].szSeparators[s]); if(Config.Logging) { Log.ConsoleOutPut(1, c_Blue, t_Duel,"[Duel System] Character [%s] Added Invisible", this->g_DuelRooms[i].szSeparators[s]->Name); } AddTab[this->g_DuelRooms[i].szSeparators[s]->m_Index].DUEL_SpecVisible = 0; } } } } } } for(short n = 0; n < MAX_DUEL_ROOMS; n++) { if(this->g_DuelRooms[n].DuelWaiting == TRUE) { if(Utilits.gObjIsConnected(this->g_DuelRooms[n].szlpObjOne->m_Index) == FALSE || Utilits.gObjIsConnected(this->g_DuelRooms[n].szlpObjTy->m_Index) == FALSE ) { this->RoomReset(n); continue; } else if(this->g_DuelRooms[n].szlpObjOne->Connected < PLAYER_PLAYING || this->g_DuelRooms[n].szlpObjTy->Connected < PLAYER_PLAYING) { this->RoomReset(n); continue; } } } if(this->UpdateTickCount < GetTickCount()) { for(short i = 8000; i < OBJECT_MAX; ++i) { LPOBJ lpObj = (LPOBJ)OBJECT_POINTER(i); if((lpObj->m_IfState.use) && lpObj->m_IfState.type == 20) { this->SendDuelStatus(lpObj); } } this->UpdateTickCount = GetTickCount() + 6000; } return; }
BOOL MonsterHerd::MonsterRegenAction(LPOBJ lpObj) { if ( lpObj == NULL ) { return FALSE; } if ( lpObj->Connected < PLAYER_PLAYING || lpObj->Type != OBJ_MONSTER ) { return FALSE; } MonsterHerd * lpMH = (MonsterHerd *)lpObj->m_lpMonsterHerd; if ( lpMH == NULL ) { return FALSE; } _MONSTER_HERD_DATA * lpMHD = lpMH->GetMonsterData(lpObj->m_Index); if ( lpMHD == NULL || lpMHD->m_bRegen == FALSE ) { return FALSE; } lpObj->Life = lpObj->AddLife + lpObj->MaxLife; lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; lpObj->Live = TRUE; lpObj->m_PoisonBeattackCount = 0; lpObj->m_ColdBeattackCount = 0; lpObj->m_ViewState = 0; lpObj->Teleport = 0; for ( int i=0;i<MAX_SELF_DEFENSE;i++) { lpObj->SelfDefenseTime[i] = 0; } gObjTimeCheckSelfDefense(lpObj); lpObj->m_ViewSkillState[eVS_POISON] = 0; lpObj->m_ViewSkillState[eVS_ICE] = 0; gObjClearViewport(lpObj); gObjViewportListProtocolDestroy(lpObj); gObjViewportClose(lpObj); lpObj->m_ActState.Attack = 0; lpObj->m_ActState.EmotionCount = 0; lpObj->m_ActState.Escape = 0; lpObj->m_ActState.Move = 0; lpObj->m_ActState.Rest = 0; lpObj->m_ActState.Emotion = 0; lpObj->TargetNumber = -1; lpObj->NextActionTime = 5000; BYTE cX; BYTE cY; int iCount = 100; BOOL bGetPosition = FALSE; while ( iCount-- != 0 ) { if ( lpMH->GetRandomLocation(cX, cY) != FALSE ) { bGetPosition = TRUE; break; } } if ( bGetPosition == FALSE ) { lpObj->Live = FALSE; lpObj->m_State = 4; lpObj->RegenTime = GetTickCount(); lpObj->DieRegen = TRUE; return FALSE; } lpObj->X = cX; lpObj->Y = cY; lpObj->MTX = lpObj->X; lpObj->MTY = lpObj->Y; lpObj->TX = lpObj->X; lpObj->TY = lpObj->Y; lpObj->StartX = lpObj->X; lpObj->StartY = lpObj->Y; gObjMonsterHitDamageInit(lpObj); CreateFrustrum(lpObj->X, lpObj->Y, lpObj->m_Index); lpObj->DieRegen = FALSE; lpObj->m_State = 1; return TRUE; }
void TMonsterAIGroup::Init(int iGroupNumber) { if ( TMonsterAIGroup::s_iMonsterAIGroupMemberCount[iGroupNumber] == 0 ) return; TMonsterAIGroup::DelGroupInstance(iGroupNumber); for ( int j=0;j<MAX_MONSTER_AI_GROUP_MEMBER;j++) { TMonsterAIGroupMember & Memb = TMonsterAIGroup::s_MonsterAIGroupMemberArray[iGroupNumber][j]; if ( Memb.m_iGuid == -1 ) continue; int iResult = gObjAddMonster(Memb.m_iMapNumber); if ( iResult >= 0 ) { gObj[iResult].m_PosNum = -1; gObj[iResult].MapNumber = Memb.m_iMapNumber; gObj[iResult].Live = TRUE; gObjViewportListProtocolDestroy(&gObj[iResult]); gObjViewportClose(&gObj[iResult]); BYTE cX; BYTE cY; if ( Memb.m_iCreateType == 1 ) { int iRadius = 10; BOOL bGetPosition = FALSE; int iCount = 100; while ( iCount-- != 0 ) { cX = Random(0,iRadius) * ((Random(0,1)==0)?-1:1) + Memb.m_iStartX; cY = Random(0,iRadius) * ((Random(0,1)==0)?-1:1) + Memb.m_iStartY; BYTE btMapAttr = MapC[Memb.m_iMapNumber].GetAttr(cX, cY); if ( btMapAttr == 0 ) { bGetPosition = TRUE; break; } } if ( bGetPosition == FALSE ) { gObj[iResult].Live = FALSE; gObj[iResult].m_State = 4; gObj[iResult].RegenTime = GetTickCount(); gObj[iResult].DieRegen = 1; return; } } else if ( Memb.m_iCreateType == 0 ) { cX = Memb.m_iStartX; cY = Memb.m_iStartY; } gObj[iResult].X = cX; gObj[iResult].Y = cY; gObj[iResult].MTX = gObj[iResult].X; gObj[iResult].MTY = gObj[iResult].Y; gObj[iResult].TX = gObj[iResult].X; gObj[iResult].TY = gObj[iResult].Y; gObj[iResult].StartX = (BYTE)gObj[iResult].X; gObj[iResult].StartY = (BYTE)gObj[iResult].Y; gObjSetMonster(iResult, Memb.m_iClass); gObj[iResult].m_iGroupNumber = Memb.m_iGroupNumber; gObj[iResult].m_iGroupMemberGuid = Memb.m_iGuid; gObj[iResult].m_iCurrentAI = Memb.m_iStartAI; gObj[iResult].m_iBasicAI = Memb.m_iStartAI; gObj[iResult].m_iRegenType = Memb.m_iRegenType; gObj[iResult].Dir = Memb.m_iStartDir; gObj[iResult].m_State = 1; gObj[iResult].DieRegen = 0; Memb.m_iObjIndex = iResult; if ( Memb.m_iCreateType == -1 ) { gObj[iResult].Live = FALSE; gObj[iResult].m_State = 4; gObj[iResult].RegenTime = GetTickCount(); gObj[iResult].DieRegen = 1; continue; } LogAdd("[ KANTURU ][ SetAIMonster ] %s(Index:%d ObjIndex:%d) Map:%d-[%d][%d]", gObj[iResult].Name, gObj[iResult].Class, iResult, gObj[iResult].MapNumber, gObj[iResult].X, gObj[iResult].Y); } } }