BOOL CGate::IsInGate(int aIndex, int GateNumber) { LPOBJ lpObj = &gObj[aIndex]; if ( this->IsGate(GateNumber) == FALSE ) { return false; } int level = this->m_Level[GateNumber]; if(GateNumber != 273) //Season 3.0 add-on { if ( lpObj->Class == CLASS_DARKLORD #ifdef MONK || lpObj->Class == CLASS_MONK #endif || lpObj->Class == CLASS_MAGUMSA ) { if ( level > 0 ) { level = level / 3 * 2; } } } if (szAuthKey[15] != AUTHKEY15 ) { DestroyGIocp(); } if ( lpObj->Level < level ) { return FALSE; } if ( lpObj->MapNumber != this->m_MapNumber[GateNumber] ) { return FALSE; } if ( lpObj->X < this->m_Sx[GateNumber]-5 || lpObj->X > this->m_Ex[GateNumber]+5 || lpObj->Y < this->m_Sy[GateNumber]-5 || lpObj->Y > this->m_Ey[GateNumber]+5 ) { return FALSE; } return true; }
// ------------------------------------------------------------------------------------------------------------------------------------------------------ void CGPartyRequestRecv(PMSG_PARTYREQUEST * lpMsg, int aIndex) { int number = MAKE_NUMBERW(lpMsg->NumberH, lpMsg->NumberL); PMSG_PARTYREQUESTSEND pMsg; if ( number < 0 || number > OBJMAX-1) return; if (!PacketCheckTime(&gObj[aIndex])) return; if ( !gObjIsConnected(&gObj[number])) { ::GCResultSend(aIndex, 0x41, 0x03); return; } if ( gObj[aIndex].CloseCount >= 0 || gObj[number].CloseCount >= 0 ) { ::GCResultSend(aIndex, 0x41, 0x00); return; } if ( gObj[number].GenFamily != gObj[aIndex].GenFamily ) { ::GCServerMsgStringSend("Can't make party with different gen member", aIndex, 1); return; } if ( gUser.ChaosCastleMapRange(gObj[aIndex].MapNumber) == true ) { ::GCServerMsgStringSend(lMsg.Get(MSGGET(4, 198)), aIndex, 1); return; } if ( IT_MAP_RANGE(gObj[aIndex].MapNumber) ) { ::GCServerMsgStringSend("Can't make party in Illusion Temple", aIndex, 1); return; } #if (FOREIGN_GAMESERVER==1) if ( szAuthKey[4] != AUTHKEY4 ) DestroyGIocp(); #endif //LogAddL("Party result : %d %d %d %d", gObj[aIndex].CloseCount, gObj[number].CloseCount, gObj[aIndex].Connected, gObj[number].Connected); //LogAddL("%s %s", gObj[aIndex].Name, gObj[number].Name); if ( gObj[aIndex].m_IfState.use > 0 ) { ::GCResultSend(aIndex, 0x41, 0x00); return; } if ( gObj[number].m_IfState.use > 0 ) { ::GCResultSend(aIndex, 0x41, 0x00); return; } if ( (gObj[number].m_Option &1) != TRUE ) { ::GCResultSend(aIndex, 0x41, 0x01); return; } if ( gObj[aIndex].PartyNumber >= 0 ) { int iUserIndex; int iDbNumber; gParty.GetIndexUser(gObj[aIndex].PartyNumber, 0, iUserIndex, iDbNumber); if ( iUserIndex < 0 || ( iUserIndex != aIndex && gObj[aIndex].DBNumber != iDbNumber ) ) { ::GCResultSend(aIndex, 0x41, 0x00); return; } } if ( gObj[aIndex].PartyTargetUser >= 0 ) return; if ( gObj[number].PartyNumber >= 0 ) { ::GCResultSend(aIndex, 0x41, 0x04); return; } if ( gObj[number].PartyTargetUser >= 0 ) { ::GCResultSend(aIndex, 0x41, 0x00); return; } int maxlevel = 0; int minlevel = 0; /*if ( gObj[number].PartyNumber >= 0 ) { if ( gParty.GetLevel( gObj[number].PartyNumber, maxlevel, minlevel) == TRUE ) { int limmaxlevel; int limmaxlevel2; if ( maxlevel > gObj[number].Level ) limmaxlevel = maxlevel; else limmaxlevel = gObj[number].Level; if ( maxlevel < gObj[number].Level ) limmaxlevel2 = maxlevel; else limmaxlevel2 = gObj[number].Level; if ( (limmaxlevel - limmaxlevel2) > MAX_PARTY_LEVEL_DIFFERENCE ) { ::GCResultSend(aIndex, 0x41, 0x05); // Restricted level for the party is %d // DEATHWAY FIX HERE LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level); return; } int limminlevel; int limminlevel2; if ( maxlevel > gObj[number].Level ) limminlevel = minlevel; else limminlevel = gObj[number].Level; if ( maxlevel < gObj[number].Level ) limminlevel2 = minlevel; else limminlevel2 = gObj[number].Level; if ( (limminlevel - limminlevel2) > MAX_PARTY_LEVEL_DIFFERENCE ) { ::GCResultSend(aIndex, 0x41, 0x05); // Restricted level for the party is %d // DEATHWAY FIX HERE LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level); return; } } } else { short sMaxMinLevel[2]; if ( gObj[aIndex].Level > gObj[number].Level ) sMaxMinLevel[1] = gObj[aIndex].Level; else sMaxMinLevel[1] = gObj[number].Level; if ( gObj[aIndex].Level < gObj[number].Level ) sMaxMinLevel[0] = gObj[aIndex].Level; else sMaxMinLevel[0] = gObj[number].Level; if ( (sMaxMinLevel[1]- sMaxMinLevel[0]) >MAX_PARTY_LEVEL_DIFFERENCE) { ::GCResultSend(aIndex, 0x41, 0x05); // Restricted level for the party is %d // DEATHWAY FIX HERE LogAdd(lMsg.Get(MSGGET(2, 189)), gObj[aIndex].Name, gObj[aIndex].Level, gObj[number].Name, gObj[number].Level); return; } }*/ gObj[aIndex].m_IfState.use = TRUE; gObj[aIndex].m_IfState.type = 2; gObj[aIndex].m_IfState.state = 0; gObj[number].m_IfState.use = TRUE; gObj[number].m_IfState.type = 2; gObj[number].m_IfState.state = 0; gObj[aIndex].TargetNumber = number; gObj[number].TargetNumber = aIndex; gObj[aIndex].m_InterfaceTime = GetTickCount(); gObj[number].m_InterfaceTime = GetTickCount(); gObj[aIndex].PartyTargetUser = number; C1HeadSet((LPBYTE)&pMsg, 0x40, sizeof(pMsg)); pMsg.NumberH = SET_NUMBERH(aIndex); pMsg.NumberL = SET_NUMBERL(aIndex); gSendProto.DataSend(number, (LPBYTE)&pMsg, pMsg.h.size); }
BOOL CQuestInfo::QuestClear(LPOBJ lpObj, int QuestIndex) { LPQUEST_INFO lpQuestInfo = this->GetQuestInfo(QuestIndex); #if (FOREIGN_GAMESERVER==1) if ( szAuthKey[18] != AUTHKEY18 ) { DestroyGIocp(); } #endif if ( lpQuestInfo == NULL ) { return 0xFF; } int subquestcount = lpQuestInfo->QuestSubInfoCount; int concount = lpQuestInfo->QuestConditionCount; LPQUEST_SUB_INFO lpSubInfo; for ( int subquest=0;subquest<subquestcount;subquest++) { lpSubInfo = this->GetSubquestInfo(lpObj, lpQuestInfo, subquest); if ( lpSubInfo != NULL ) { if ( lpSubInfo->RewardType == QUEST_COMPENSATION_CHANGEUP ) { lpObj->LevelUpPoint += lpSubInfo->RewardCount; GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_STATUP, lpSubInfo->RewardCount ); lpObj->ChangeUP = true; lpObj->DbClass |= 1; gObjMakePreviewCharSet(lpObj->m_Index); BYTE btClass = (lpObj->Class * 32) & 224 ; btClass |= (lpObj->ChangeUP * 16) & 16; GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_CHANGEUP, btClass); LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d), ChangeUp", lpQuestInfo->Name, lpObj->AccountID, lpObj->Name, lpObj->LevelUpPoint, lpSubInfo->RewardCount ); } else if ( lpSubInfo->RewardType == QUEST_COMPENSATION_STATUP ) { lpObj->LevelUpPoint += lpSubInfo->RewardCount; GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_STATUP, lpSubInfo->RewardCount ); LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d)", lpQuestInfo->Name, lpObj->AccountID, lpObj->Name, lpObj->LevelUpPoint, lpSubInfo->RewardCount ); } else if ( lpSubInfo->RewardType == QUEST_COMPENSATION_PLUSSSTAT ) { int level = lpObj->Level - QUEST_MINLEVEL_PLUSSTAT; if ( level <= 0 ) { level = 0; } lpObj->LevelUpPoint += level; lpObj->PlusStatQuestClear = true; GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_PLUSSSTAT, level ); LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d), PlusStat", lpQuestInfo->Name, lpObj->AccountID, lpObj->Name, lpObj->LevelUpPoint, level ); } else if ( lpSubInfo->RewardType == QUEST_COMPENSATION_COMBOSKILL ) { GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_COMBOSKILL, 0 ); lpObj->ComboSkillquestClear = true; LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] ComboSkill", lpQuestInfo->Name, lpObj->AccountID, lpObj->Name); } else if ( lpSubInfo->RewardType == QUEST_COMPENSATION_CHANGEUP2 ) { lpObj->LevelUpPoint += lpSubInfo->RewardCount; GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_STATUP, lpSubInfo->RewardCount); lpObj->ChangeUP = 2; BYTE btClass; btClass = (lpObj->Class * 32) + 24; if (lpObj->DbClass != 2 || lpObj->DbClass != 18 || lpObj->DbClass != 34 || lpObj->DbClass != 50 || lpObj->DbClass != 66 ) //HermeX Great Anti-Hack :P { if (lpObj->DbClass == 48 || lpObj->DbClass == 64) { lpObj->DbClass += 2; } else { lpObj->DbClass += 1; } } gObjMakePreviewCharSet(lpObj->m_Index); GCSendQuestPrize(lpObj->m_Index, QUEST_COMPENSATION_CHANGEUP2, btClass); LogAddTD("[Quest] Quest Clear (%s) : [%s][%s] Stat(%d,%d), ChangeUp2", lpQuestInfo->Name, lpObj->AccountID, lpObj->Name, lpObj->LevelUpPoint, lpSubInfo->RewardCount ); } if ( lpSubInfo->QuestType == 1 ) { gObjDelteItemCountInInventory(lpObj->m_Index, lpSubInfo->NeedType, lpSubInfo->NeedSubType, lpSubInfo->NeedNumber); } } } return true; }