// ----------------------------------------------------------------------------------------------------------------------- void CIllusionTemple::NpcRegister(OBJECTSTRUCT* lpObj, PMSG_IT_REGISTER* pMsg) { if(lpObj->m_IfState.use > 0) { CLog.LogAdd("[IllusionTemple] Interface State Error (%d)(%d)(%s)", lpObj->m_IfState.use, lpObj->m_IfState.type, lpObj->Name); return; } if(lpObj->pInventory[pMsg->TicketPosition].m_Type != ITEMGET(13, 51) || lpObj->pInventory[pMsg->TicketPosition].m_Level != pMsg->TargetTemple ) { GCServerMsgStringSend("You missed Illusion Temple Ticket.", lpObj->m_Index, 1); return; } pMsg->TargetTemple--; if(IT_FLOOR_RANGE(pMsg->TargetTemple) == FALSE) { CLog.LogAdd("[IllusionTemple] Index out of range (%d)(%s)", pMsg->TargetTemple, &lpObj->Name[0]); return; } if(this->m_IllusionTemple[pMsg->TargetTemple].m_iUserCount >= 10) { GCServerMsgStringSend("[IllusionTemple] Event is already Full!", lpObj->m_Index, 1); return; } ILLUSION_OBJ obj; obj.m_Index = lpObj->m_Index; obj.m_TeamIndex = -1; obj.m_BonusCount = 0; obj.m_TempleIndex = pMsg->TargetTemple; gObjInventoryDeleteItem(lpObj->m_Index, pMsg->TicketPosition); GCInventoryItemDeleteSend(lpObj->m_Index, pMsg->TicketPosition, 1); if ( lpObj->PartyNumber >= 0 ) { PMSG_PARTYDELUSER pMsg; int iPartyIndex = gParty.GetIndex(lpObj->PartyNumber, lpObj->m_Index, lpObj->DBNumber); if ( iPartyIndex >= 0 ) { pMsg.Number = iPartyIndex; CGPartyDelUser(&pMsg, lpObj->m_Index); } } lpObj->m_IllusionIndex = pMsg->TargetTemple; gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_RESET, 0); gObjMoveGate(lpObj->m_Index, 142 + pMsg->TargetTemple); }
int CIllusionTempleEvent::Enter(int aIndex,BYTE Temple,BYTE Pos) { if( g_bIllusionTemple == FALSE ) { return FALSE; } if( IT_TEMPLE_RANGE(Temple) == FALSE ) { return FALSE; } LPOBJ lpObj = &gObj[aIndex]; PMSG_ILLUSIONTEMPLE_ENTER_RESULT pMsg; PHeadSubSetB((LPBYTE)&pMsg,0xBF,0,sizeof( pMsg )); pMsg.result = 0; if( lpObj->Type != OBJ_USER || lpObj->Connected <= PLAYER_LOGGED ) { return FALSE; } if ( lpObj->m_IfState.use != 0 && lpObj->m_IfState.type != 12 ) { return FALSE; } if ( lpObj->m_bPShopOpen == TRUE ) { CGPShopReqClose(lpObj->m_Index); } int bFail = FALSE; int iLevel; int iSerial; #if (ENABLE_FIX_PARTYPK == 0) if ( lpObj->PartyNumber >= 0 ) { if( gParty.GetPartyPkLevel(lpObj->PartyNumber) >= 5 ) { bFail = TRUE; } } else if( lpObj->m_PK_Level >= 4 ) { bFail = TRUE; } if( bFail == TRUE ) { pMsg.result = 7; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } #endif if( IsTransformEquipment(aIndex) ) { pMsg.result = 8; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } if( m_TempleData[Temple].GetState() != IT_STATE_CLOSED || m_TempleData[Temple].OpenState() == FALSE ) { pMsg.result = 2; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } if( gObj[aIndex].pInventory[Pos].IsItem() == TRUE ) { if( gObj[aIndex].pInventory[Pos].m_Type == ITEMGET(13,51) ) { iLevel = gObj[aIndex].pInventory[Pos].m_Level; iSerial = gObj[aIndex].pInventory[Pos].m_Number; if( IT_TEMPLE_RANGE(iLevel-1) == FALSE && gObj[aIndex].pInventory[Pos].m_Durability != 1.0f ) { pMsg.result = 1; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } } else if( gObj[aIndex].pInventory[Pos].m_Type == ITEMGET(13,61) ) { iSerial = gObj[aIndex].pInventory[Pos].m_Number; iLevel = GetEnterLevel(aIndex); if( iLevel <= 0 ) { pMsg.result = 1; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } } else { pMsg.result = 1; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } } else { pMsg.result = 1; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } if( RankingCheck(aIndex,Temple,Pos,iLevel) != FALSE ) { return TRUE; } if( CheckCanEnter(aIndex,iLevel) == FALSE ) { pMsg.result = 3; DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); return FALSE; } m_TempleData[iLevel-1].CheckUsers(); int bResult = m_TempleData[iLevel-1].EnterUser(aIndex,Temple,Pos); if( bResult == TRUE ) { if( lpObj->PartyNumber >= 0 ) { PMSG_PARTYDELUSER pMsg; int PartyIndex; PartyIndex = gParty.GetIndex(lpObj->PartyNumber,lpObj->m_Index,lpObj->DBNumber); if( PartyIndex >= 0 ) { pMsg.Number = PartyIndex; CGPartyDelUser(&pMsg,lpObj->m_Index); } } if( lpObj->pInventory[Pos].m_Type == ITEMGET(13,51) ) { lpObj->pInventory[Pos].m_Durability = 0; GCItemDurSend(lpObj->m_Index,Pos,(BYTE)lpObj->pInventory[Pos].m_Durability,0); } else if( lpObj->pInventory[Pos].m_Type == ITEMGET(13,61) ) { if( lpObj->pInventory[Pos].m_Durability > 0.0f ) { lpObj->pInventory[Pos].m_Durability -= 1.0f; GCItemDurSend(lpObj->m_Index,Pos,(BYTE)lpObj->pInventory[Pos].m_Durability,0); } } LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u).", iLevel,lpObj->AccountID,lpObj->Name,lpObj->DbClass,lpObj->pInventory[Pos].m_Number); DataSend(aIndex,(LPBYTE)&pMsg,pMsg.h.size); gObjMoveGate(lpObj->m_Index,141 + iLevel); } m_TempleData[Temple].SendState(0,lpObj->m_Index); SendInfo(); return TRUE; }
BOOL CIllusionTempleEvent::EnterIllusionTemple(int aIndex, BYTE btTempleIndex, BYTE btItemPos) { if( !g_bIllusionTempleEvent ) { return FALSE; } // ---- if(!CHECK_LIMIT(btTempleIndex, MAX_ILLUSIONTEMPLE_TEMPLE_COUNT)) { return FALSE; } LPOBJECTSTRUCT lpObj = (LPOBJECTSTRUCT)&gObj[aIndex]; PMSG_RESULT_ENTER_ILLUSION_TEMPLE pResult; PHeadSubSetB((LPBYTE)&pResult, 0xBF, 0x00, sizeof(pResult)); pResult.Result = 0; if( lpObj->Type != OBJ_USER || lpObj->Connected <= 2 ) { return FALSE; } if( lpObj->m_IfState.use && lpObj->m_IfState.type != 12 ) { return FALSE; } if( lpObj->m_bPShopOpen == true ) { CGPShopReqClose(lpObj->m_Index); } BOOL PKFlag = FALSE; if(lpObj->PartyNumber >= 0) { if( (gParty.GetPKPartyPenalty(lpObj->PartyNumber)) >= 5) { PKFlag = TRUE; } } else if( lpObj->m_PK_Level >= 4 ) { PKFlag = TRUE; } if( PKFlag == TRUE ) { pResult.Result = 7; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } if( CheckWearingMOPH(aIndex) ) { pResult.Result = 8; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } if( m_cIllusionTempleProc[btTempleIndex].GetIllusionTempleState() != 0 || !m_cIllusionTempleProc[btTempleIndex].GetEntrance() ) { pResult.Result = 2; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } int iITEM_LEVEL; DWORD dwITEM_SERIAL; if(gObj[aIndex].pInventory[btItemPos].IsItem() == TRUE) { if(gObj[aIndex].pInventory[btItemPos].m_Type == (ITEM_HELPER+51)) { iITEM_LEVEL = gObj[aIndex].pInventory[btItemPos].m_Level; dwITEM_SERIAL = gObj[aIndex].pInventory[btItemPos].m_Number; if( !CHECK_LIMIT( iITEM_LEVEL-1, MAX_ILLUSIONTEMPLE_TEMPLE_COUNT ) && gObj[aIndex].pInventory[btItemPos].m_Durability != 1.0f) { pResult.Result = 1; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } } else if(gObj[aIndex].pInventory[btItemPos].m_Type == (ITEM_HELPER+61)) { dwITEM_SERIAL = gObj[aIndex].pInventory[btItemPos].m_Number; iITEM_LEVEL = CheckCanEnterLevel(aIndex); if(iITEM_LEVEL <= 0) { pResult.Result = 1; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } } else { pResult.Result = 1; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } } else { pResult.Result = 1; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } #pragma message("#### Enable me after time ####") //if( GEReqIllusionTempleEnterCountCheck(aIndex, btTempleIndex, btItemPos, iITEM_LEVEL) ) //{ // LogAddC(2, "[DEBUG] [IT] Enter R12"); // return TRUE; //} if( !CheckEnterLevel(aIndex, iITEM_LEVEL) ) { pResult.Result = 3; DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); return FALSE; } m_cIllusionTempleProc[iITEM_LEVEL-1].CheckUsersOnConnect(); BOOL bRet = m_cIllusionTempleProc[iITEM_LEVEL-1].EnterUserIllusionTemple(aIndex, btTempleIndex, btItemPos); if(bRet == TRUE) { if(lpObj->PartyNumber >= 0) { PMSG_PARTYDELUSER pMsg; int pindex = gParty.GetIndex(lpObj->PartyNumber, lpObj->m_Index, lpObj->DBNumber); if(pindex >= 0) { pMsg.Number = pindex; CGPartyDelUser(&pMsg, lpObj->m_Index); } } if( lpObj->pInventory[btItemPos].m_Type == (ITEM_HELPER+51) ) { lpObj->pInventory[btItemPos].m_Durability = 0; GCItemDurSend(lpObj->m_Index, btItemPos, lpObj->pInventory[btItemPos].m_Durability, 0); } else if(lpObj->pInventory[btItemPos].m_Type == (ITEM_HELPER+61) && lpObj->pInventory[btItemPos].m_Durability > 0.0f) { lpObj->pInventory[btItemPos].m_Durability -= 1.0f; GCItemDurSend(lpObj->m_Index, btItemPos, lpObj->pInventory[btItemPos].m_Durability, 0); } #ifdef OPT LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u). PCRoom:%d", iITEM_LEVEL, lpObj->AccountID, lpObj->Name, lpObj->DbClass, lpObj->pInventory[btItemPos].m_Number, lpObj->m_iPcBangRoom); #else LogAddTD("[Illusion Temple] (%d) EnterUser: (%s)(%s) class:%d (Serial:%u)", iITEM_LEVEL, lpObj->AccountID, lpObj->Name, lpObj->DbClass, lpObj->pInventory[btItemPos].m_Number); #endif DataSend(aIndex,(LPBYTE)&pResult,pResult.h.size); gObjMoveGate(lpObj->m_Index, iITEM_LEVEL+141); } m_cIllusionTempleProc[btTempleIndex].SendIllusionTempleState(0, lpObj->m_Index); SendIllusionTempleUserCount(); #if(TESTSERVER==1) GCServerMsgStringSend("CIllusionTempleEvent::EnterIllusionTemple", lpObj->m_Index, 0); #endif return FALSE; }