BOOL NpcShadowPhantom(LPOBJ lpNpc, LPOBJ lpObj) { if ( gObjIsConnected(lpObj->m_Index) == FALSE ) { return TRUE; } if ( lpObj->Level > MAX_NPC_PHANTOM_BUFFER ) { GCServerCmd(lpObj->m_Index, 0x0D, 0, 0); return TRUE; } lpObj->m_iSkillNPCHelpTime = GetTickCount(); lpObj->m_iSkillNPCDefense = lpObj->Level / 5 + 50; // FORMULA lpObj->m_iSkillNPCAttack = lpObj->Level / 3 + 45; // FORMULA lpObj->m_ViewSkillState[eVS_NPC_HELP] = 1; GCStateInfoSend(lpObj, 1, eVS_NPC_HELP); return TRUE; }
int CIllusionTempleEvent::TeleportLock(int iIndex) { if( gObjIsConnected(iIndex) == FALSE ) { return FALSE; } if( OBJMAX_RANGE(iIndex) == FALSE ) { return FALSE; } if( IT_MAP_RANGE( gObj[iIndex].MapNumber ) == FALSE || m_TempleData[ gObj[iIndex].MapNumber - MAP_INDEX_ILLUSIONTEMPLE1 ].GetState() != 2) { return FALSE; } if( iIndex == m_TempleData[ gObj[iIndex].MapNumber - MAP_INDEX_ILLUSIONTEMPLE1 ].GetRelicPlayer() ) { return TRUE; } return FALSE; }
int gObjAddBuffEffectWideArea(LPOBJ lpTargetObj,int nDistance,int & nAffectedCount,int iBuffIndex,BYTE EffectType1,int EffectValue1,BYTE EffectType2,int EffectValue2,int Duration) { if(lpTargetObj == NULL) return FALSE; for(int iIndex = OBJ_STARTUSERINDEX; iIndex < OBJMAX; iIndex++) { LPOBJ lpObj = &gObj[iIndex]; if(lpObj->Type == OBJ_USER && gObjIsConnected(iIndex) != FALSE) { if(lpObj->MapNumber == lpTargetObj->MapNumber) { if(gObjCalDistance(lpTargetObj,lpObj) < nDistance) { gObjAddBuffEffect(lpObj, iBuffIndex, EffectType1, EffectValue1, EffectType2, EffectValue2, Duration); nAffectedCount+= 1; } } } } return TRUE; }
void CGReqQuestExp(PMSG_REQ_NPC_QUESTEXP *pMsg, int aIndex) { if( !OBJMAX_RANGE(aIndex) ) return; OBJECTSTRUCT* lpObj = &gObj[aIndex]; if( !gObjIsConnected(aIndex) ) return; if( lpObj->m_bUserQuestInfoSent == 1 ) { lua_State* L = g_MuLuaQuestExp.GetLua(); if( !L ) { LogAddTD("[QuestExp] - Error - [%s] [%d]", __FILE__, __LINE__); return; } g_Generic_Call(L, "NpcTalkClick", "ii>", lpObj->TargetShopNumber, lpObj->m_Index); } }
void CCrywolf::SetCrywolfCommonNPC(int iOccupationState) { for ( int i=0;i<this->m_ObjCommonNPC.m_iObjCount ; i++) { if ( !gObjIsConnected(this->m_ObjCommonNPC.m_iObjIndex[i]) ) break; LPOBJ lpObj = &gObj[this->m_ObjCommonNPC.m_iObjIndex[i]]; if ( iOccupationState == 2 ) { BuffEffectC.EnableBuff(this->m_ObjCommonNPC.m_iObjIndex[i], 27, -1, 0, 0, 0); } else if ( iOccupationState == 0 ) { BuffEffectC.DelEffect(&gObj[this->m_ObjCommonNPC.m_iObjIndex[i]], 27); } else if ( iOccupationState == 1 ) { BuffEffectC.EnableBuff(this->m_ObjCommonNPC.m_iObjIndex[i], 27, -1, 0, 0, 0); } } }
BOOL CCastleSiegeSync::CheckCastleOwnerMember(int iIndex) { if ( gObjIsConnected(iIndex) == FALSE ) { //DebugLog("%s Not Connected",__FUNCTION__); return FALSE; } if ( strcmp(this->m_szCastleOwnerGuild, "") == 0 ) { //DebugLog("%s Empty Guild Name",__FUNCTION__); return FALSE; } if ( strcmp(gObj[iIndex].GuildName, this->m_szCastleOwnerGuild) != 0 ) { //DebugLog("%s Guild Name [%s] vs [%s]",__FUNCTION__,gObj[iIndex].GuildName,this->m_szCastleOwnerGuild); return FALSE; } //DebugLog("%s OK",__FUNCTION__); return TRUE; }
BOOL NpcDuprianSteward(LPOBJ lpNpc,LPOBJ lpObj) { #if (__GENS_SYSTEM__ == 1) if ( gObjIsConnected(lpObj->m_Index) == FALSE ) { return TRUE; } PMSG_TALKRESULT_EX pMsg = {0}; pMsg.h.c = 0xC3; pMsg.h.headcode = 0xF9; pMsg.h.size = sizeof(pMsg); pMsg.btResult = TRUE; pMsg.wNpcId = lpNpc->Class; pMsg.Info = lpObj->m_GensInfo.iContribution; lpObj->TargetShopNumber = 543; DataSend(lpObj->m_Index,(LPBYTE)&pMsg,pMsg.h.size); #endif return TRUE; }
BOOL CImperialBattleUserMng::AddUserData(int iIndex) { if ( !gObjIsConnected(iIndex)) { LogAddTD("[Imperial][User Mng] Add User Fail - Disconnect User [%s][%s]", gObj[iIndex].AccountID, gObj[iIndex].Name); return FALSE; } for ( int iCount=0;iCount<MAX_IMPERIAL_BATTLE_USER;iCount++) { if ( this->m_BattleUser[iCount].IsUseData() == FALSE ) { this->m_BattleUser[iCount].SetIndex(iIndex); this->m_iBattleUserCount++; return TRUE; } } return FALSE; }
void CKanturuMaya::KanturuMayaAct_IceStorm(int iSkillUsingRate) { if ( (rand()%10000) > iSkillUsingRate ) return; if ( this->m_iMayaObjIndex < 0 || this->m_iMayaObjIndex >= OBJMAX ) // #errot change to OBJMAX-1 return; for ( int iCount=OBJ_STARTUSERINDEX;iCount < OBJMAX;iCount++) { if ( gObj[iCount].Type == OBJ_USER && gObjIsConnected(iCount) && gObj[iCount].MapNumber == MAP_INDEX_KANTURU_BOSS ) { KANTURU_UTIL.NotifyKanturuWideAreaAttack(this->m_iMayaObjIndex, iCount, 0); TMonsterSkillManager::UseMonsterSkill(this->m_iMayaObjIndex, iCount, 31,-1,0); this->m_iIceStormCount++; } } LogAddTD("[ KANTURU ][ IceStorm ] Skill Using(%d) : Index(%d) %s", this->m_iIceStormCount, this->m_iMayaObjIndex, gObj[this->m_iMayaObjIndex].Name); }
void CCrywolf::OperateGmCommand(int iUserIndex, int iCommand) { if ( !gObjIsConnected(iUserIndex)) return; if ( (gObj[iUserIndex].Authority & 0x02) != 0x02 ) return; LogAddTD("[ Crywolf ][Use GM Command] [%s][%s] Command : %d", gObj[iUserIndex].AccountID, gObj[iUserIndex].Name, iCommand); switch ( iCommand ) { case 0: this->SetState(CRYWOLF_STATE_NOTIFY_2); break; case 1: this->SetState(CRYWOLF_STATE_READY); break; case 2: if ( this->GetCrywolfState() == CRYWOLF_STATE_READY ) { this->SetState(CRYWOLF_STATE_START); } else { MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 246))); } break; case 3: this->SetState(CRYWOLF_STATE_END); break; } }
void CCrywolf::OperateGmCommand(int iUserIndex, int iCommand) { if ( !gObjIsConnected(iUserIndex)) return; if ( (gObj[iUserIndex].Authority & 0x02) != 0x02 ) return; LogAdd("[ Crywolf ][Use GM Command] [%s][%s] Command : %d", gObj[iUserIndex].AccountID, gObj[iUserIndex].Name, iCommand); switch ( iCommand ) { case 0: this->SetState(CRYWOLF_STATE_NOTIFY_2); break; case 1: this->SetState(CRYWOLF_STATE_READY); break; case 2: if ( this->GetCrywolfState() == CRYWOLF_STATE_READY ) { this->SetState(CRYWOLF_STATE_START); } else { MsgOutput(iUserIndex, "Prepare for the attack of Balgass's army on Crywolf Fortress"); } break; case 3: this->SetState(CRYWOLF_STATE_END); break; } }
BOOL CCustomOlymp::NpcTalk(LPOBJ lpNpc,LPOBJ lpObj) { if( !this->m_bOlympEnable ) return true; if( !gObjIsConnected(lpObj->m_Index) ) return true; lpObj->m_IfState.use = 1; lpObj->m_IfState.type = 21; PSMG_OLP_NPCTALK pMsg; PHeadSubSetB((LPBYTE)&pMsg,0xFE,0x00,sizeof(PSMG_OLP_NPCTALK)); pMsg.btOpen = m_bOPEN; if( m_bFIGHT_START || m_dwFIGHT_START > 0 ) pMsg.btOpen = FALSE; pMsg.btRegistered = IsRegistered(lpObj->m_Index); DataSend(lpObj->m_Index,(LPBYTE)&pMsg,pMsg.h.size); return true; }
BOOL CIllusionTempleEvent::CheckRelics(int nIndex) { if ( gObjIsConnected(nIndex) == FALSE ) { return FALSE; } if( OBJMAX_RANGE(nIndex) == FALSE ) { return FALSE; } if(IT_MAP_RANGE(gObj[nIndex].MapNumber) == FALSE || this->m_cIllusionTempleProc[gObj[nIndex].MapNumber - 45].GetIllusionTempleState() != 2) { return FALSE; } if(nIndex == this->m_cIllusionTempleProc[gObj[nIndex].MapNumber - 45].GetRelicsUserIndex()) { return TRUE; } return FALSE; }
// ----------------------------------------------------------------------------------------------------------------------------------------------------- void CPersonalShop::ClosePersonalShop(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; // ------ if( !gObjIsConnected(aIndex) ) { CLog.LogAddC(TColor.Red(), PShopModule, "(Error): [%s][%s] is Offline Player.", lpObj->AccountID, lpObj->Name); return; } // ------ if( lpObj->Type != OBJ_USER ) { CLog.LogAddC(TColor.Red(), PShopModule, "(Error): [%s] isn't an Object User.", lpObj->m_Index); return; } // ------ CLog.LogAddC(TColor.Blue(), PShopModule, "[%s][%s] Requested to Close PShop", lpObj->AccountID, lpObj->Name); // ------ lpObj->m_bPShopOpen = false; // ------ memset(lpObj->m_szPShopText, 0, sizeof(lpObj->m_szPShopText)); // ------ SendPShopCloseResult(aIndex, 1); }
int CLifeStone::SetReSpawnUserXY(int iUserIndex) { if(gObjIsConnected(iUserIndex) == FALSE) return false; LPOBJ lpUser = &gObj[iUserIndex]; if(lpUser->MapNumber != MAP_INDEX_CASTLESIEGE) return false; if(lpUser->lpGuild == NULL) return false; BYTE btCsJoinSide = lpUser->m_btCsJoinSide; if(lpUser->lpGuild->lpLifeStone == NULL) return false; LPOBJ lpLifeStone = lpUser->lpGuild->lpLifeStone; lpUser->MapNumber = MAP_INDEX_CASTLESIEGE; lpUser->X = lpLifeStone->X; lpUser->Y = lpLifeStone->Y; return true; }
void CKanturuEntranceNPC::NotifyResultEnterKanturuBossMap(int iIndex) { if ( !gObjIsConnected(iIndex)) { return; } LPOBJ lpObj = &gObj[iIndex]; BOOL bMoveGateSuccess = FALSE; int iResult = g_Kanturu.CheckEnterKanturu(iIndex); if ( iResult == 0 ) { int iCurrentState = g_Kanturu.GetKanturuState(); if ( iCurrentState == KANTURU_STATE_BATTLE_OF_MAYA ) { bMoveGateSuccess = gObjMoveGate(iIndex, 133); if ( bMoveGateSuccess ==TRUE ) { g_KanturuBattleUserMng.AddUserData(iIndex); LogAddTD("[Kanturu][BattleUser] Add User [%s][%s] Current Battle User:%d State:[%d-%d] (CharInfoSave : Class=%d, Level=%d, LvPoint=%d, Exp=%u, Str=%d, Dex=%d, Vit=%d, Energy=%d, LeaderShip=%d, Map=%d, Pk=%d", gObj[iIndex].AccountID, gObj[iIndex].Name, g_KanturuBattleUserMng.GetUserCount(), g_Kanturu.GetKanturuState(), g_Kanturu.GetKanturuDetailState(), gObj[iIndex].Class, gObj[iIndex].Level, gObj[iIndex].LevelUpPoint, gObj[iIndex].Experience, gObj[iIndex].Strength, gObj[iIndex].Dexterity, gObj[iIndex].Vitality, gObj[iIndex].Energy, gObj[iIndex].Leadership, gObj[iIndex].MapNumber, gObj[iIndex].m_PK_Level); KANTURU_UTIL.NotifyKanturuCurrentState(iIndex, g_Kanturu.GetKanturuState(),g_Kanturu.GetKanturuDetailState()); gObj[iIndex].m_bKanturuEntranceByNPC = 1; } } else if ( iCurrentState == KANTURU_STATE_TOWER_OF_REFINEMENT ) { bMoveGateSuccess = gObjMoveGate(iIndex, 135); KANTURU_UTIL.NotifyKanturuCurrentState(iIndex, g_Kanturu.GetKanturuState(),g_Kanturu.GetKanturuDetailState()); gObj[iIndex].m_bKanturuEntranceByNPC = 1; } else { LogAddTD("[Kanturu][BossMapMove] Error - State(%d) Character[%s][%s]", iCurrentState, lpObj->AccountID, lpObj->Name); } } else { KANTURU_UTIL.NotifyKanturuEntranceReqResult(iIndex, iResult); LogAddTD("[Kanturu][BossMapMove] Fail - Result(%d) Character[%s][%s]", iResult, lpObj->AccountID, lpObj->Name); gObj[iIndex].m_bKanturuEntranceByNPC = 0; } }
// ------------------------------------------------------------------------------------------------------------------------------------------------------ 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); }
//00416F70 - identical void CKalimaGate::KalimaGateAct2(int iIndex) { LPOBJ lpObj = NULL; LPOBJ lpObjCallOwner = NULL; if ( OBJMAX_RANGE(iIndex) == FALSE ) return; if ( gObj[iIndex].Live == 0 ) return; if ( !gObjIsConnected(gObj[iIndex].m_RecallMon ) ) { LogAddTD("[Kalima] Kalima Gate Vanished (NextMap) - Summoner Vanished (SummonIndex:%d, EnterCount:%d)", iIndex, gObj[iIndex].m_cKalimaGateEnterCount); GCDiePlayerSend(&gObj[iIndex], iIndex, 0, 0); gObjDel(iIndex); gObjCharZeroSet(iIndex); return; } lpObj = &gObj[iIndex]; lpObjCallOwner = &gObj[lpObj->m_RecallMon]; if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER ) { lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0; lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0; LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Enter Count Over (SummonIndex:%d, EnterCount:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount); this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon); return; } DWORD dwTickCount = GetTickCount(); if ( dwTickCount > (lpObj->RegenTime+60000) ) { lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0; lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0; LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished (NextMap) - Time Out (SummonIndex:%d, EnterCount:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount); this->DeleteKalimaGate(lpObj->m_Index, lpObjCallOwner->m_Index); return; } if ( lpObj->VPCount < 1 ) return; if ( lpObj->MapNumber < MAP_INDEX_KALIMA1 || lpObj->MapNumber > MAP_INDEX_KALIMA6-1 ) return; int tObjNum = -1; for ( int i=0;i<MAX_VIEWPORT_MONSTER;i++) { tObjNum = lpObj->VpPlayer[i].number; if ( tObjNum >= 0 ) { if ( gObj[tObjNum].Type == OBJ_USER ) { if ( gObj[tObjNum].Live ) { if ( abs(lpObj->Y - gObj[tObjNum].Y) < 2 ) { if ( abs(lpObj->X - gObj[tObjNum].X) < 2 ) { if ( lpObj->m_RecallMon == tObjNum || (gObj[tObjNum].PartyNumber != -1 && lpObjCallOwner->PartyNumber == gObj[tObjNum].PartyNumber )) { int iMoveMapLevel = lpObj->MapNumber - MAP_INDEX_KALIMA1+1; // #error "Deatwway - remove the -1 int iGateNumber = g_iKalimaGateGateIndex[iMoveMapLevel]; if ( !gObjMoveGate(tObjNum, iGateNumber)) { LogAddTD("[Kalima] [%s][%s] - [%s][%s] move fail (MapNumber:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, gObj[tObjNum].AccountID, gObj[tObjNum].Name, lpObj->MapNumber); } else { LogAddTD("[Kalima] [%s][%s] - [%s][%s] Transported by Kalima Gate (NextMap) (SummonIndex:%d, GateNo.:%d, MapNumber:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, gObj[tObjNum].AccountID, gObj[tObjNum].Name, iIndex, iMoveMapLevel+1, lpObj->MapNumber); gObj[iIndex].m_cKalimaGateEnterCount++; if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER ) break; } } } } } } } } }
void CLifeStone::LifeStoneAct(int iIndex) //Identical { if(!gObjIsConnected(iIndex)) { return; } LPOBJ lpObj = &gObj[iIndex]; lpObj->m_iCreatedActivationTime++; BYTE btCreationState = lpObj->m_btCreationState; //HermeX Fix if(lpObj->m_iCreatedActivationTime < 60 ) { lpObj->m_btCreationState = (lpObj->m_iCreatedActivationTime / 12); } else //HermeX Fix { lpObj->m_btCreationState = 5; } if(btCreationState != lpObj->m_btCreationState) //HermeX Fix { ::GCSendObjectCreationState(iIndex); } if(lpObj->m_btCreationState < 5) { return; } if(lpObj->VPCount < 1) { return; } int tObjNum = -1; for(int i = 0; i < MAX_VIEWPORT; i++) //HermeX Fix { BOOL iRecoverLife,iRecoverMana,iRecoverBP; tObjNum = lpObj->VpPlayer[i].number; if(tObjNum >= 0) { if(gObj[tObjNum].Type == OBJ_USER) { if(gObj[tObjNum].Live != FALSE) { if(gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide) { if(abs(lpObj->Y - gObj[tObjNum].Y) <= 3) { if(abs(lpObj->X - gObj[tObjNum].X) <= 3) //fix { iRecoverLife = FALSE; iRecoverMana = FALSE; iRecoverBP = FALSE; if(gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) //SirMaster Fix { gObj[tObjNum].Life += ((gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) / 100 ); //SirMaster Fix if(gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) //SirMaster Fix { gObj[tObjNum].Life = (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife); //SirMaster Fix } iRecoverLife = TRUE; } if(gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) ) //SirMaster Fix { gObj[tObjNum].Mana += ((gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) / 100 ); //SirMaster Fix if(gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) //SirMaster Fix { gObj[tObjNum].Mana = (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana); //SirMaster Fix } iRecoverMana = TRUE; } if(gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) { gObj[tObjNum].BP += ((gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) / 100); if(gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) { gObj[tObjNum].BP = (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP); } iRecoverBP = TRUE; } if(iRecoverLife != FALSE) { ::GCReFillSend(tObjNum,gObj[tObjNum].Life,0xFF,1,gObj[tObjNum].iShield); } if( (iRecoverMana != FALSE) || (iRecoverBP != FALSE) ) { ::GCManaSend(tObjNum,gObj[tObjNum].Mana,0xFF,0,gObj[tObjNum].BP); } } } } } } } continue; } }
//00414B10 - identical BOOL CKalimaGate::CreateKalimaGate(int iIndex, BYTE btLevel, BYTE cTX, BYTE cTY) { BOOL bKalimaGateCreateSucceed=FALSE; int iMonsterIndex=-1; EnterCriticalSection(&this->m_critKalimaGate ); __try { int iKalimaGateLevel; int iMapNumber; BYTE btMapAttr; int iMonsterType; BYTE cX; BYTE cY; if ( gObjIsConnected(iIndex) == PLAYER_EMPTY ) { return false; } LogAddTD("[Kalima] [%s][%s] Try to Create Kalima Gate", gObj[iIndex].AccountID, gObj[iIndex].Name); iKalimaGateLevel = this->GetKalimaGateLevel(iIndex); if ( iKalimaGateLevel < btLevel-1 ) { return false; } iKalimaGateLevel = btLevel-1; if ( DS_MAP_RANGE(gObj[iIndex].MapNumber) ) { return false; } if ( BC_MAP_RANGE(gObj[iIndex].MapNumber) ) { return false; } if ( CC_MAP_RANGE(gObj[iIndex].MapNumber) ) { return false; } if ( CHECK_ILLUSIONTEMPLE(gObj[iIndex].MapNumber) )//NEW { return false; } #ifdef IMPERIAL if( CImperialGuardian::IsEventMap(gObj[iIndex].MapNumber) ) { return false; } #endif if ( KALIMA_FLOOR_RANGE(iKalimaGateLevel)== FALSE ) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Gate Level Check Error : %d", gObj[iIndex].AccountID, gObj[iIndex].Name, iKalimaGateLevel+1); return false; } iMapNumber = gObj[iIndex].MapNumber; btMapAttr = MapC[iMapNumber].GetAttr(gObj[iIndex].X, gObj[iIndex].Y); if ( btMapAttr &1 != 0 ) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Called in Saftey Area (Map:%d, X:%d, Y:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber, gObj[iIndex].X, gObj[iIndex].Y); return false; } if ( gObj[iIndex].m_cKalimaGateExist == TRUE ) { GCServerMsgStringSend(lMsg.Get( MSGGET( 4, 224)), iIndex, 1); LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Already Have Gate (SummonIndex:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex); return false; } iMonsterType = iKalimaGateLevel+152; cX = cTX; cY = cTY; btMapAttr = MapC[iMapNumber].GetAttr(cX, cY); if ( btMapAttr != 0 ) { if (this->GetRandomLocation(iMapNumber, cX, cY) == 0) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Failed to get Location (MapNumber:%d, X:%d, Y:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber, cX, cY); return false; } } if ( gObj[iIndex].MapNumber == 10 ) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate - Uable to Summon in this Map (MapNumber:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].MapNumber); return false; } iMonsterIndex = gObjAddMonster(iMapNumber); if ( iMonsterIndex >= 0 ) { LPMONSTER_ATTRIBUTE lpMATTR = gMAttr.GetAttr(iMonsterType); if ( lpMATTR == NULL ) { gObjDel(iMonsterIndex); LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - lpMATTR == NULL (SummonIndex:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex); return false; } gObjSetMonster(iMonsterIndex, iMonsterType); gObj[iMonsterIndex].Live = TRUE; gObj[iMonsterIndex].Life = 1000.0; gObj[iMonsterIndex].MaxLife = 1000.0; gObj[iMonsterIndex].m_PosNum = -1; gObj[iMonsterIndex].X = cX; gObj[iMonsterIndex].Y = cY; gObj[iMonsterIndex].MTX = cX; gObj[iMonsterIndex].MTY = cY; gObj[iMonsterIndex].TX = cX; gObj[iMonsterIndex].TY = cY; gObj[iMonsterIndex].m_OldX = cX; gObj[iMonsterIndex].m_OldY = cY; gObj[iMonsterIndex].StartX = cX; gObj[iMonsterIndex].StartY = cY; gObj[iMonsterIndex].MapNumber = iMapNumber; gObj[iMonsterIndex].m_MoveRange = 0; gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0; gObj[iIndex].m_cKalimaGateExist = TRUE; gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex; gObj[iMonsterIndex].Level = lpMATTR->m_Level; gObj[iMonsterIndex].Type = OBJ_MONSTER; gObj[iMonsterIndex].MaxRegenTime = 1000; gObj[iMonsterIndex].Dir = 1; gObj[iMonsterIndex].m_RecallMon = iIndex; gObj[iMonsterIndex].RegenTime = GetTickCount(); gObj[iMonsterIndex].m_Attribute = iKalimaGateLevel + 51; gObj[iMonsterIndex].DieRegen = FALSE; LogAddTD("[Kalima] [%s][%s] Create Kalima Gate Successfuly (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d, GateNo.:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime, gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X, gObj[iMonsterIndex].Y, iMonsterIndex, iIndex, iKalimaGateLevel+1); bKalimaGateCreateSucceed = TRUE; } } __finally { LeaveCriticalSection(&this->m_critKalimaGate); } return true; }
//004166C0 - identical BOOL CKalimaGate::CreateKalimaGate2(int iIndex, int iMonMapNumber, BYTE cTX, BYTE cTY) { BOOL bKalimaGateCreateSucceed = FALSE; int iMonsterIndex = -1; EnterCriticalSection(&this->m_critKalimaGate); __try { if ( !gObjIsConnected(iIndex)) return FALSE; LogAddTD("[Kalima] [%s][%s] Try to Create Kalima Gate (NextMap)", gObj[iIndex].AccountID, gObj[iIndex].Name); if ( iMonMapNumber < MAP_INDEX_KALIMA1 || iMonMapNumber > MAP_INDEX_KALIMA6-1 ) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - MapNumber Error : %d", gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber); return FALSE; } if ( gObj[iIndex].m_cKalimaGateExist == TRUE ) { GCServerMsgStringSend(lMsg.Get(MSGGET(4, 224)), iIndex, 1); LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Already Have Gate (SummonIndex:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iIndex].m_iKalimaGateIndex); return FALSE; } int iMonsterType = iMonMapNumber + 129; BYTE cX = cTX; BYTE cY = cTY; BYTE btMapAttr = MapC[iMonMapNumber].GetAttr(cX, cY); if ( btMapAttr != 0 ) { if ( this->GetRandomLocation(iMonMapNumber, cX, cY) == FALSE ) { LogAddTD("[Kalima] [%s][%s] Failed to Summon Kalima Gate (NextMap) - Failed to get Location (MapNumber:%d, X:%d, Y:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, iMonMapNumber, cX, cY); return FALSE; } } iMonsterIndex = gObjAddMonster(iMonMapNumber); if ( iMonsterIndex >= 0 ) { MONSTER_ATTRIBUTE * lpMATTR = gMAttr.GetAttr(iMonsterType); if ( !lpMATTR ) { gObjDel(iMonsterIndex); LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished (NextMap) - lpMATTR == NULL (SummonIndex:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, iMonsterIndex); return FALSE; } gObjSetMonster(iMonsterIndex, iMonsterType); gObj[iMonsterIndex].Live = TRUE; gObj[iMonsterIndex].Life = 1000.0; gObj[iMonsterIndex].MaxLife = 1000.0; gObj[iMonsterIndex].m_PosNum = -1; gObj[iMonsterIndex].X = cX; gObj[iMonsterIndex].Y = cY; gObj[iMonsterIndex].MTX = cX; gObj[iMonsterIndex].MTY = cY; gObj[iMonsterIndex].TX = cX; gObj[iMonsterIndex].TY = cY; gObj[iMonsterIndex].m_OldX = cX; gObj[iMonsterIndex].m_OldY = cY; gObj[iMonsterIndex].StartX = cX; gObj[iMonsterIndex].StartY = cY; gObj[iMonsterIndex].MapNumber = iMonMapNumber; gObj[iMonsterIndex].m_MoveRange = 0; gObj[iMonsterIndex].m_cKalimaGateEnterCount = 0; gObj[iIndex].m_cKalimaGateExist = TRUE; gObj[iIndex].m_iKalimaGateIndex = iMonsterIndex; gObj[iMonsterIndex].Level = lpMATTR->m_Level; gObj[iMonsterIndex].Type = OBJ_MONSTER; gObj[iMonsterIndex].MaxRegenTime = 1000; gObj[iMonsterIndex].Dir = 1; gObj[iMonsterIndex].m_RecallMon = iIndex; gObj[iMonsterIndex].RegenTime = GetTickCount(); gObj[iMonsterIndex].m_Attribute = 58; gObj[iMonsterIndex].DieRegen = FALSE; LogAddTD("[Kalima] [%s][%s] Create Kalima Gate Successfuly (NextMap) (Live:%d, GateTick:%u, DieRegen:%d, Map:%d, X:%d, Y:%d, SummonIndex:%d, OwnerIndex:%d)", gObj[iIndex].AccountID, gObj[iIndex].Name, gObj[iMonsterIndex].Live, gObj[iMonsterIndex].RegenTime, gObj[iMonsterIndex].DieRegen, gObj[iMonsterIndex].MapNumber, gObj[iMonsterIndex].X, gObj[iMonsterIndex].Y, iMonsterIndex, iIndex); bKalimaGateCreateSucceed = TRUE; } } __finally { LeaveCriticalSection(&this->m_critKalimaGate); } return TRUE; }
//00415910 - identical void CKalimaGate::KalimaGateAct(int iIndex) { LPOBJ lpObj=NULL; LPOBJ lpObjCallOwner=NULL; if ( OBJMAX_RANGE(iIndex ) == FALSE) { return; } if ( gObj[iIndex].Live == FALSE ) { return; } if ( gObjIsConnected( gObj[iIndex].m_RecallMon ) == PLAYER_EMPTY ) { LogAddTD("[Kalima] Kalima Gate Vanished - Summoner Vanished (SummonIndex:%d, EnterCount:%d)", iIndex, gObj[iIndex].m_cKalimaGateEnterCount ); GCDiePlayerSend( &gObj[iIndex], iIndex, 0, 0); gObjDel(iIndex); gObjCharZeroSet(iIndex); return; } lpObj = &gObj[iIndex]; lpObjCallOwner = &gObj[lpObj->m_RecallMon]; if ( gObj[gObj[iIndex].m_RecallMon].DieRegen > 0 ) { lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0; lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0; LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Summoner Died (SummonIndex:%d, EnterCount:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount ); this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon); return; } if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER ) { lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0; lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0; LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Enter Count Over (SummonIndex:%d, EnterCount:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount ); this->DeleteKalimaGate(iIndex, gObj[iIndex].m_RecallMon); return; } DWORD dwTickCount = GetTickCount(); if ( dwTickCount > lpObj->RegenTime + KALIMA_GATE_TIMEOUT ) { lpObjCallOwner->AccountID[MAX_ACCOUNT_LEN]=0; lpObjCallOwner->Name[MAX_ACCOUNT_LEN]=0; LogAddTD("[Kalima] [%s][%s] Kalima Gate Vanished - Time Out (SummonIndex:%d, EnterCount:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, iIndex, gObj[iIndex].m_cKalimaGateEnterCount ); this->DeleteKalimaGate(lpObj->m_Index, lpObjCallOwner->m_Index); return; } if ( lpObj->VPCount < 1 ) { return; } int tObjNum=-1; for ( int i=0;i<MAX_VIEWPORT_MONSTER;i++) { tObjNum = lpObj->VpPlayer[i].number; if ( tObjNum >= 0 ) { if ( gObj[tObjNum].Type == OBJ_USER ) { if ( gObj[tObjNum].Live != FALSE ) { if ( abs(lpObj->Y - gObj[tObjNum].Y) < 2 ) { if ( abs(lpObj->X - gObj[tObjNum].X) < 2 ) { if ( lpObj->m_RecallMon == tObjNum || (gObj[tObjNum].PartyNumber != -1 && lpObjCallOwner->PartyNumber == gObj[tObjNum].PartyNumber )) { int iMoveMapLevel = lpObj->m_Attribute -51; int iMapNumber = iMoveMapLevel + 24; int iGateNumber = g_iKalimaGateGateIndex[iMoveMapLevel]; int iOverLevel = this->GetKalimaGateLevel(tObjNum); if ( iOverLevel >= iMoveMapLevel ) { if ( gObjMoveGate(tObjNum, iGateNumber) == FALSE ) { LogAddTD("[Kalima] [%s][%s] - [%s][%s] move fail (MapNumber:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, gObj[tObjNum].AccountID, gObj[tObjNum].Name, iMapNumber); } else { LogAddTD("[Kalima] [%s][%s] - [%s][%s] Transported by Kalima Gate (SummonIndex:%d, GateNo.:%d, MapNumber:%d)", lpObjCallOwner->AccountID, lpObjCallOwner->Name, gObj[tObjNum].AccountID, gObj[tObjNum].Name, iIndex, iMoveMapLevel + 1, iMapNumber); gObj[iIndex].m_cKalimaGateEnterCount ++; if ( gObj[iIndex].m_cKalimaGateEnterCount >= MAX_KALIMA_ENTER ) { return; } } } } } } } } } } }
BOOL CWeapon::Attack(LPOBJ lpObj, LPOBJ lpTargetObj, CMagicInf * lpMagic, int iCriticalDamage, int iActionType) { int iSkill = 0; int iSkillSuccess = TRUE; BYTE MsgDamage = 0; int ManaChange = 0; if ( lpMagic != NULL ) { iSkill = lpMagic->m_Skill; } if ( (lpTargetObj->Authority & 2) == 2 ) { return FALSE; } if ( lpObj->MapNumber != lpTargetObj->MapNumber ) { return FALSE; } #if (__GENS_SYSTEM__ == 1) if (gGensSystem.GetFriendlyFire() && gGensSystem.GensMap(lpObj->MapNumber)) { if (lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER && lpObj->m_GensInfo.btFamily == lpTargetObj->m_GensInfo.btFamily) { return false; } } #endif if ( lpObj->MapNumber == MAP_INDEX_PKFIELD && lpObj->m_iDuelUser == -1) { return FALSE; } if ( lpTargetObj->Type == OBJ_USER ) { if ( gObjIsConnected(lpTargetObj) == FALSE ) { return FALSE; } } if ( gObjAttackQ(lpTargetObj) == 0 ) { return FALSE; } int MSBFlag = 0; if ( iCriticalDamage != 0 ) { MsgDamage = 3; } else { MsgDamage = 0; } int iAttackDamage = this->GetAttackDamage(lpObj->Class); int iTargetDefense = lpTargetObj->m_Defense; int iDefenseDown = gObjGetTotalValueOfEffect(lpObj,ADD_OPTION_DEFENSEDOWN); iTargetDefense -= (iTargetDefense * iDefenseDown)/100; BOOL bAllMiss = FALSE; if ( this->MissCheck(lpObj, lpTargetObj, iSkill, iSkillSuccess, bAllMiss) == FALSE ) { return FALSE; } if ( bAllMiss != FALSE ) { iAttackDamage = (iAttackDamage * 30)/100; } if ( lpTargetObj->DamageMinus != 0 ) { int lc11 = iAttackDamage; iAttackDamage -= (iAttackDamage * lpTargetObj->DamageMinus)/100; } int iTargetLevel = lpObj->Level / 10; if ( iAttackDamage < iTargetLevel ) { if ( iTargetLevel < 1 ) { iTargetLevel = 1; } iAttackDamage = iTargetLevel; } if ( lpTargetObj->m_SkillNumber == 18 ) { if ( iAttackDamage > 1 ) { iAttackDamage = iAttackDamage >> 1; } }
void CCastleCrownSwitch::CastleCrownSwitchAct(int iIndex) { if ( !gObjIsConnected(iIndex)) return; if ( gObj[iIndex].Type != OBJ_NPC || ((gObj[iIndex].Class < 217 )?FALSE:(gObj[iIndex].Class > 219-1 )?FALSE:TRUE)==FALSE ) return; if ( !gObjIsConnected(g_CastleSiege.GetCrownSwitchUserIndex(gObj[iIndex].Class)) ) { g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class); if ( g_CastleSiege.GetRegCrownAvailable() == 1 ) { g_CastleSiege.SetRegCrownAvailable(FALSE); g_CastleSiege.NotifyCrownState(1); } return; } LPOBJ lpObj= &gObj[iIndex]; LPOBJ lpUserObj = &gObj[g_CastleSiege.GetCrownSwitchUserIndex(gObj[iIndex].Class)]; g_CastleSiege.NotifyCrownSwitchInfo(iIndex); if ( lpUserObj->MapNumber == MAP_INDEX_CASTLESIEGE && lpUserObj->m_btCsJoinSide >= 2 ) { if ( abs(lpObj->Y - lpUserObj->Y) <= 3 && abs(lpObj->X - lpUserObj->X) <= 3 ) { int iCrownIndex1 = g_CastleSiege.GetCrownSwitchUserIndex(217); int iCrownIndex2 = g_CastleSiege.GetCrownSwitchUserIndex(218); if (gObjIsConnected(iCrownIndex1) && gObjIsConnected(iCrownIndex2) ) { if ( gObj[iCrownIndex1].m_btCsJoinSide == gObj[iCrownIndex2].m_btCsJoinSide ) { if ( g_CastleSiege.GetRegCrownAvailable() == 0 ) { g_CastleSiege.SetRegCrownAvailable(TRUE); g_CastleSiege.NotifyCrownState(0); } } } } else { GCAnsCsAccessSwitchState(lpUserObj->m_Index, lpObj->m_Index, -1, 0); g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class); if ( g_CastleSiege.GetRegCrownAvailable() == 1 ) { g_CastleSiege.SetRegCrownAvailable(FALSE); g_CastleSiege.NotifyCrownState(1); } LogAddTD("[CastleSiege] [%s][%s] Push Castle Crown Switch Canceled (GUILD:%s) - CS X:%d/Y:%d", lpUserObj->AccountID, lpUserObj->Name, lpUserObj->GuildName, lpObj->X, lpObj->Y); } } else { GCAnsCsAccessSwitchState(lpUserObj->m_Index, lpObj->m_Index, -1, 0); g_CastleSiege.ResetCrownSwitchUserIndex(gObj[iIndex].Class); if ( g_CastleSiege.GetRegCrownAvailable() == 1 ) { g_CastleSiege.SetRegCrownAvailable(FALSE); g_CastleSiege.NotifyCrownState(1); } } }
// ------------------------------------------------------------------------------------------------------------------------------------------------------ void CGPartyRequestResultRecv(PMSG_PARTYREQUESTRESULT * lpMsg, int aIndex) { int number; BYTE result = false; char szTemp[256]; int pnumber = -1; if( !PacketCheckTime(&gObj[aIndex])) return; number = MAKE_NUMBERW(lpMsg->NumberH, lpMsg->NumberL); if( number < 0 || number > OBJMAX-1) return; if( !gObjIsConnected(&gObj[aIndex])) return; if( !gObjIsConnected(&gObj[number])) { GCResultSend(aIndex, 0x41, 0x04); } else { result = true; } if( gObj[number].MapNumber != gObj[aIndex].MapNumber ) { result = false; GCResultSend(number, 0x41, 0x00); } if( gUser.ChaosCastleMapRange(gObj[aIndex].MapNumber) == true ) { GCServerMsgStringSend(lMsg.Get(MSGGET(4, 198)), aIndex, 1); result = false; ::GCResultSend(number, 0x41, 0x00); } if( lpMsg->Result == 0 ) { result = false; ::GCResultSend(number, 0x41, 0x01); } if( gObj[number].m_IfState.use == 0 || gObj[number].m_IfState.type != 2) { result = false; ::GCResultSend(number, 0x41, 0x00); } if( gObj[aIndex].m_IfState.use == 0 || gObj[aIndex].m_IfState.type != 2) { result = false; ::GCResultSend(number, 0x41, 0x00); } if( result == 1 ) { if( gObj[number].PartyNumber < 0 ) { gObj[number].PartyNumber = gParty.Create(number, gObj[number].DBNumber, gObj[number].Level); } if( gObj[number].PartyNumber >= 0 ) { pnumber = gObj[number].PartyNumber; int iPartyPos = gParty.AddMember(gObj[number].PartyNumber, aIndex, gObj[aIndex].DBNumber, gObj[aIndex].Level); if( iPartyPos >= 0 ) { gObj[aIndex].PartyNumber = gObj[number].PartyNumber; result = true; wsprintf(szTemp, lMsg.Get(MSGGET(4, 83)), gObj[aIndex].Name); ::GCServerMsgStringSend(szTemp, number, 1); wsprintf(szTemp, lMsg.Get(MSGGET(4, 83)), gObj[number].Name); ::GCServerMsgStringSend(szTemp, aIndex, 1); gParty.Paint(pnumber); } else if( iPartyPos == -1 ) { GCResultSend(number, 0x41, 2); GCResultSend(aIndex, 0x41, 2); } else if( iPartyPos == -2 ) { result = 2; wsprintf(szTemp, lMsg.Get(MSGGET(4, 84)), gObj[aIndex].Name); GCServerMsgStringSend(szTemp, aIndex, 1); } } } if( gObj[aIndex].m_IfState.use != 0 && gObj[aIndex].m_IfState.type == 2) { gObj[aIndex].m_IfState.use = 0; gObj[aIndex].PartyTargetUser = -1; } if( gObj[number].m_IfState.use != 0 && gObj[number].m_IfState.type == 2) { gObj[number].m_IfState.use = 0; gObj[number].PartyTargetUser = -1; } if( pnumber >= 0 ) { CGPartyListAll(pnumber); } }
bool GameShop::RequestPackageBuy(int aIndex, GAMESHOP_REQ_BUY * lpRequest) { #if( GAMESHOP_DEBUG == 1 ) LogAddC(3, "[DEBUG] [%s] %d %d %d [%d %d]", __FUNCTION__, lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, lpRequest->IBSPackageID, lpRequest->Unknown18); #endif // ---- LPOBJ lpUser = &gObj[aIndex]; // ---- if( !gObjIsConnected(aIndex) || lpUser->Connected != PLAYER_PLAYING ) { return false; } // ---- GAMESHOP_PACKAGE_DATA * lpPackage = this->GetPackage(lpRequest->IBSPackageID); // ---- if( !lpPackage ) { #if( GAMESHOP_DEBUG == 1 ) LogAddC(2, "[DEBUG] [%s] Invalid package", __FUNCTION__); #endif return false; } // ---- GAMESHOP_ANS_BUY pBuy; PHeadSubSetB((LPBYTE)&pBuy, 0xD2, cBuy, sizeof(pBuy)); // ---- pBuy.Result = true; // ---- switch(lpPackage->PointType) { case 0: //-> WCoinC { if( lpUser->GameShop.WCoinC >= lpPackage->Price ) { lpUser->GameShop.WCoinC -= lpPackage->Price; pBuy.Result = false; } } break; // -- case 1: //-> WCoinP { if( lpUser->GameShop.WCoinP >= lpPackage->Price ) { lpUser->GameShop.WCoinP -= lpPackage->Price; pBuy.Result = false; } } break; // -- case 2: //-> GoblinPoint { if( lpUser->GameShop.GoblinPoint >= lpPackage->Price ) { lpUser->GameShop.GoblinPoint -= lpPackage->Price; pBuy.Result = false; } } break; } // ---- if( !pBuy.Result ) { for( int i = 0; i < lpPackage->ItemCount; i++ ) { this->AddPackageInStorage(aIndex, &lpPackage->Item[i], 0); } // ---- if( lpPackage->GPBonus ) { lpUser->GameShop.GoblinPoint += lpPackage->GPBonus; } else if( this->OptionData.AddGPBonus ) { lpUser->GameShop.GoblinPoint += this->OptionData.AddGPBonus; } // ---- GAMESHOP_REQ_STORAGE pUpdate; pUpdate.StorageType = 0x53; // ---- this->GDSaveUserInfo(aIndex); this->RequestStorage(aIndex, &pUpdate); this->RequestPoint(aIndex); } // ---- DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size); return true; }
void GameShop::RequestItemBuy(int aIndex, GAMESHOP_REQ_BUY * lpRequest) { #if( GAMESHOP_DEBUG == 1 ) LogAddC(3, "[DEBUG] [%s] %d %d %d [%d %d]", __FUNCTION__, lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, lpRequest->IBSPackageID, lpRequest->Unknown18); #endif // ---- LPOBJ lpUser = &gObj[aIndex]; // ---- GAMESHOP_ANS_BUY pBuy; PHeadSubSetB((LPBYTE)&pBuy, 0xD2, cBuy, sizeof(pBuy)); // ---- if( !gObjIsConnected(aIndex) || lpUser->Connected != PLAYER_PLAYING ) { return; } // ---- LogAddTD("[GameShop] [RequestItemBuy] [%s] %d %d %d [%d %d]", &gObj[aIndex].AccountID, lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, lpRequest->IBSPackageID, lpRequest->Unknown18); // ---- if( !CanBeBuy(aIndex, lpRequest->ItemID) ) { LogAddTD("[GameShop] [RequestItemBuy] [%s] !CanBeBuy", &gObj[aIndex].AccountID); pBuy.Result = true; DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size); return; } // ---- if( this->RequestPackageBuy(aIndex, lpRequest) ) { return; } // ---- GAMESHOP_ITEM_DATA * lpItem = this->GetItem(lpRequest->ItemID, lpRequest->IBSCategory, lpRequest->IBSIndex, 0); // ---- if( !lpItem ) { return; } // ---- pBuy.Result = true; // ---- switch(lpItem->PointType) { case 0: //-> WCoinC { if( lpUser->GameShop.WCoinC >= lpItem->Price ) { lpUser->GameShop.WCoinC -= lpItem->Price; pBuy.Result = false; } } break; // -- case 1: //-> WCoinP { if( lpUser->GameShop.WCoinP >= lpItem->Price ) { lpUser->GameShop.WCoinP -= lpItem->Price; pBuy.Result = false; } } break; // -- case 2: //-> GoblinPoint { if( lpUser->GameShop.GoblinPoint >= lpItem->Price ) { lpUser->GameShop.GoblinPoint -= lpItem->Price; pBuy.Result = false; } } break; } // ---- if( !pBuy.Result ) { if( this->AddItemInStorage(aIndex, lpItem, 0) ) { LogAddTD("[GameShop] [RequestItemBuy] [ADD] [%s] (%d) %d %d %d", &gObj[aIndex].AccountID, lpItem->ItemID, lpItem->IBSCategory, lpItem->IBSIndex, lpItem->IBSID); } // ---- if( lpItem->GPBonus ) { lpUser->GameShop.GoblinPoint += lpItem->GPBonus; } else if( this->OptionData.AddGPBonus ) { lpUser->GameShop.GoblinPoint += this->OptionData.AddGPBonus; } // ---- GAMESHOP_REQ_STORAGE pUpdate; pUpdate.StorageType = 0x53; // ---- this->GDSaveUserInfo(aIndex); this->RequestStorage(aIndex, &pUpdate); this->RequestPoint(aIndex); } // ---- DataSend(aIndex, (LPBYTE)&pBuy, pBuy.h.size); }
// ---------------------------------------------------------------------------------------------------------------------- BOOL CDarkSpirit::Attack(LPOBJ lpObj, LPOBJ lpTargetObj, CMagicInf * lpMagic, int criticaldamage, int iActionType) { int skillSuccess = 0; LPOBJ lpCallObj; LPOBJ lpCallTargetObj; unsigned char MsgDamage = 0; int ManaChange = 0; int iTempShieldDamage = 0; int iTotalShieldDamage = 0; if ( (lpTargetObj->Authority&2) == 2 ) return FALSE; if ( lpObj->MapNumber != lpTargetObj->MapNumber ) return FALSE; #if(GS_CASTLE) if( g_Crywolf.GetCrywolfState() == 3 || g_Crywolf.GetCrywolfState() == 5 ) { if(CRYWOLF_MAP_RANGE(lpTargetObj->MapNumber)) { if(lpTargetObj->Type == OBJ_MONSTER) return FALSE; } } #endif int skill = 0; if ( lpMagic ) skill = lpMagic->m_Skill; skillSuccess = TRUE; if ( lpObj->GuildNumber > 0 ) { if ( lpObj->lpGuild ) { if ( lpObj->lpGuild->WarState ) { if ( lpObj->lpGuild->WarType == 1 ) { if ( !GetBattleSoccerGoalMove(0) ) { return TRUE; } } } } } if ( lpTargetObj->Type == OBJ_MONSTER ) { if ( lpTargetObj->Class == 200 ) { if ( skill ) { gObjMonsterStateProc(lpTargetObj, 7, lpObj->m_Index, 0); } else { gObjMonsterStateProc(lpTargetObj, 6, lpObj->m_Index, 0); } return TRUE; } } if ( lpObj->Type == OBJ_USER ) { if ( !gObjIsConnected(lpObj)) { return FALSE; } } if ( lpTargetObj->Type == OBJ_USER ) { if ( !gObjIsConnected(lpTargetObj)) { return FALSE; } } if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_MONSTER ) // PLAYER VS MONSTER { if ( lpObj->m_RecallMon >= 0 ) { if ( lpObj->m_RecallMon == lpTargetObj->m_Index ) { return FALSE; } } } if ( !gObjAttackQ(lpTargetObj)) return FALSE; lpObj->m_TotalAttackCount++; if ( this->CheckAttackArea(lpObj, lpTargetObj) == FALSE ) return FALSE; lpCallObj = lpObj; lpCallTargetObj = lpTargetObj; if ( lpTargetObj->Type == OBJ_MONSTER ) { if ( lpTargetObj->m_RecallMon >= 0 ) { lpCallTargetObj = &gObj[lpTargetObj->m_RecallMon]; } } if ( this->PkCheck(lpCallObj, lpTargetObj) == FALSE ) return FALSE; int Strength = lpObj->Strength + lpObj->AddStrength; int Dexterity = lpObj->Dexterity + lpObj->AddDexterity; int Vitality = lpObj->Vitality + lpObj->AddVitality; int Energy = lpObj->Energy + lpObj->AddEnergy; int MSBFlag = 0; if ( criticaldamage ) { MsgDamage = 3; } else { MsgDamage = 0; } BOOL bAllMiss = FALSE; int AttackDamage = 0; if ( g_ShieldSystemOn == TRUE ) { if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER ) { if ( !this->MissCheckPvP(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } } else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } } else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } int targetdefense = this->GetTargetDefense(lpObj, lpTargetObj, MsgDamage); //AttackDamage = this->GetAttackDamage(lpObj, targetdefense, bIsOnDuel, criticaldamage); AttackDamage = this->GetAttackDamage(lpObj, targetdefense, 0, criticaldamage); if ( criticaldamage == 0 && iActionType == 0 ) { AttackDamage /= 1.5; } if ( bAllMiss ) { AttackDamage = ( AttackDamage * 30 ) / 100; } if ( lpTargetObj->DamageMinus ) { int beforeDamage = AttackDamage; AttackDamage -= ( ( AttackDamage * (int)lpTargetObj->DamageMinus) / 100 ); } int tlevel = lpObj->Level / 10; if ( AttackDamage < tlevel ) { if ( tlevel < 1 ) { tlevel = 1; } AttackDamage = tlevel; } if ( lpTargetObj->m_SkillNumber == 18 ) { if ( AttackDamage > 1 ) { AttackDamage >>= 1; } }
void GameShop::RequestStorage(int aIndex, GAMESHOP_REQ_STORAGE * lpRequest) { #if( GAMESHOP_DEBUG == 1 ) LogAddC(2, "[DEBUG] [%s] [%s] [%s]", __FUNCTION__, &gObj[aIndex].AccountID, &gObj[aIndex].Name); #endif // ---- LPOBJ lpUser = &gObj[aIndex]; // ---- if( !gObjIsConnected(aIndex) ) { return; } // ---- GAMESHOP_ANS_STORAGE_COUNT pStorageCount = { 0 }; GAMESHOP_ANS_STORAGE_ITEM pStorageItem; // ---- PHeadSubSetB((LPBYTE)&pStorageCount, 0xD2, cStorageCount, sizeof(pStorageCount)); PHeadSubSetB((LPBYTE)&pStorageItem, 0xD2, cStorageItem, sizeof(pStorageItem)); // ---- int ItemCount = this->GetItemCountInStorage(aIndex, lpRequest->StorageType); // ---- if( ItemCount ) { pStorageCount.MainStorage[0] = ItemCount+1; pStorageCount.MainStorage[1] = ItemCount+1; pStorageCount.GiftStorage[0] = 1; pStorageCount.GiftStorage[1] = 1; } // ---- DataSend(aIndex, (LPBYTE)&pStorageCount, pStorageCount.h.size); // ---- pStorageItem.Unk3 = 0x50; pStorageItem.IBSUnknown = 673; // ---- int Counter = 0; // ---- for( int i = 0; i < MAX_STORAGE_ITEM; i++ ) { if( lpRequest->StorageType == 0x53 && lpUser->GameShop.MainStorage[i].AuthIndex != 0 && lpUser->GameShop.MainStorage[i].AuthID != 0 ) { pStorageItem.AuthIndex = lpUser->GameShop.MainStorage[i].AuthIndex; pStorageItem.AuthID = lpUser->GameShop.MainStorage[i].AuthID; pStorageItem.IBSID = lpUser->GameShop.MainStorage[i].IBSID; pStorageItem.IBSIndex = lpUser->GameShop.MainStorage[i].IBSIndex; Counter++; } /*else if( lpRequest->StorageType == 0x47 && lpUser->GameShop.GiftStorage[i].AuthIndex != 0 && lpUser->GameShop.GiftStorage[i].AuthID != 0 ) { pStorageItem.AuthIndex = lpUser->GameShop.GiftStorage[i].AuthIndex; pStorageItem.AuthID = lpUser->GameShop.GiftStorage[i].AuthID; pStorageItem.IBSID = lpUser->GameShop.GiftStorage[i].IBSID; pStorageItem.IBSIndex = lpUser->GameShop.GiftStorage[i].IBSIndex; Counter++; }*/ else { continue; } // ---- DataSend(aIndex, (LPBYTE)&pStorageItem, pStorageItem.h.size); // ---- if( Counter >= ItemCount ) { break; } } }
BOOL NpcCastleCrown(LPOBJ lpNpc, LPOBJ lpObj) //GS-CS Decompiled 100% { #if(GS_CASTLE==1) if ( gObjIsConnected(lpObj->m_Index) == FALSE ) //Good { return TRUE; } if(g_CastleSiege.GetCastleState() != 7) //Good { return TRUE; } if(lpObj->m_btCsJoinSide < 2 || lpObj->m_bCsGuildInvolved == FALSE ) { return TRUE; } if(g_CastleSiege.CheckUnionGuildMaster(lpObj->m_Index) == FALSE ) { return TRUE; } if((lpObj->Y - lpNpc->Y) > 3 || (lpObj->X - lpNpc->X) > 3) { return TRUE; } if(g_CastleSiege.GetRegCrownAvailable() == FALSE ) { return TRUE; } int iUserIndex = g_CastleSiege.GetCrownUserIndex(); if(gObjIsConnected(iUserIndex) == FALSE ) { int iSwitchIndex1 = g_CastleSiege.GetCrownSwitchUserIndex(217); int iSwitchIndex2 = g_CastleSiege.GetCrownSwitchUserIndex(218); if(gObjIsConnected(iSwitchIndex1) == FALSE || gObjIsConnected(iSwitchIndex2) == FALSE ) { LogAddTD("[CastleSiege] [%s][%s] Failed to Register Castle Crown (GUILD:%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName); return TRUE; } if(lpObj->m_btCsJoinSide != gObj[iSwitchIndex1].m_btCsJoinSide || lpObj->m_btCsJoinSide != gObj[iSwitchIndex2].m_btCsJoinSide) { GCAnsCsAccessCrownState(lpObj->m_Index,4); LogAddTD("[CastleSiege] [%s][%s] Failed to Register Castle Crown (GUILD:%s) (S1:%s/%s)(S2:%s/%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName,gObj[iSwitchIndex1].Name,gObj[iSwitchIndex1].GuildName,gObj[iSwitchIndex2].Name,gObj[iSwitchIndex2].GuildName); return TRUE; } else { GCAnsCsAccessCrownState(lpObj->m_Index,0); g_CastleSiege.SetCrownUserIndex(lpObj->m_Index); g_CastleSiege.SetCrownAccessUserX(lpObj->X); g_CastleSiege.SetCrownAccessUserY(lpObj->Y); g_CastleSiege.SetCrownAccessTickCount(); g_CastleSiege.NotifyAllUserCsProgState(0,lpObj->GuildName); LogAddTD("[CastleSiege] [%s][%s] Start to Register Castle Crown (GUILD:%s)",lpObj->AccountID,lpObj->Name,lpObj->GuildName); } } else if(lpObj->m_Index != iUserIndex) { GCAnsCsAccessCrownState(lpObj->m_Index,3); } return TRUE; #else return TRUE; #endif }