void CUser::ClientEvent(uint16 sNpcID) { // Ensure AI's loaded if (!g_pMain->m_bPointCheckFlag || isDead()) return; int32 iEventID = 0; CNpc *pNpc = g_pMain->GetNpcPtr(sNpcID); if (pNpc == nullptr || !isInRange(pNpc, MAX_NPC_RANGE)) return; m_sEventNid = sNpcID; m_sEventSid = pNpc->GetProtoID(); // For convenience purposes with Lua scripts. // Aww. if (pNpc->GetType() == NPC_KISS) { KissUser(); return; } FastGuard lock(g_pMain->m_questNpcLock); QuestNpcList::iterator itr = g_pMain->m_QuestNpcList.find(pNpc->GetProtoID()); if (itr == g_pMain->m_QuestNpcList.end()) return; // Copy it. We should really lock the list, but nevermind. QuestHelperList & pList = itr->second; _QUEST_HELPER * pHelper = nullptr; foreach(itr, pList) { if ((*itr) == nullptr || (*itr)->sEventDataIndex || (*itr)->bEventStatus || ((*itr)->bNation != 3 && (*itr)->bNation != GetNation()) || ((*itr)->bClass != 5 && !JobGroupCheck((*itr)->bClass))) continue; pHelper = (*itr); break; } if (pHelper == nullptr) return; QuestV2RunEvent(pHelper, pHelper->nEventTriggerIndex); }
CNpc* CRoomEvent::GetNpcPtr( int sid ) { if (m_mapRoomNpcArray.IsEmpty()) { TRACE("### RoomEvent-GetNpcPtr() : monster empty ###\n"); return nullptr; } foreach_stlmap (itr, m_mapRoomNpcArray) { CNpc *pNpc = g_pMain->GetNpcPtr(itr->first); if (pNpc == nullptr || pNpc->GetProtoID() != sid) continue; return pNpc; }
void CUser::ClientEvent(uint16 sNpcID) { // Ensure AI's loaded if (!g_pMain->m_bPointCheckFlag || isDead()) return; int32 iEventID = 0; CNpc *pNpc = g_pMain->GetNpcPtr(sNpcID); if (pNpc == nullptr || !isInRange(pNpc, MAX_NPC_RANGE)) return; m_sEventNid = sNpcID; m_sEventSid = pNpc->GetProtoID(); // For convenience purposes with Lua scripts. if (pNpc->GetProtoID() == SAW_BLADE_SSID) { HpChange(-5000 / 10); return; } else if (pNpc->GetProtoID() == CHAOS_CUBE_SSID && !pNpc->isDead()) { uint8 nEventRoomUserCount = g_pMain->TempleEventGetRoomUsers(GetEventRoom()); uint8 nItemRewardRankFirst = nEventRoomUserCount / 3; uint8 nItemRewardRankSecond = (nEventRoomUserCount - 1) * 2; int32 nUserRank = GetPlayerRank(RANK_TYPE_CHAOS_DUNGEON); uint32 nItemID = 0; if (nUserRank == 0) nItemID = ITEM_KILLING_BLADE; else if (nUserRank < nItemRewardRankFirst) nItemID = ITEM_LIGHT_PIT; else if (nUserRank >= nItemRewardRankFirst && nUserRank <= nItemRewardRankSecond) nItemID = ITEM_DRAIN_RESTORE; else if (nUserRank > nItemRewardRankSecond) nItemID = ITEM_KILLING_BLADE; GiveItem(nItemID); g_pMain->ShowNpcEffect(GetSocketID(),251,GetZoneID()); g_pMain->KillNpc(sNpcID); return; } else if (pNpc->GetType() == NPC_KISS) { KissUser(); return; } Guard lock(g_pMain->m_questNpcLock); QuestNpcList::iterator itr = g_pMain->m_QuestNpcList.find(pNpc->GetProtoID()); if (itr == g_pMain->m_QuestNpcList.end()) return; QuestHelperList & pList = itr->second; _QUEST_HELPER * pHelper = nullptr; foreach (itr, pList) { if ((*itr) == nullptr || (*itr)->sEventDataIndex || (*itr)->bEventStatus || ((*itr)->bNation != 3 && (*itr)->bNation != GetNation()) || ((*itr)->bClass != 5 && !JobGroupCheck((*itr)->bClass))) continue; pHelper = (*itr); break; } if (pHelper == nullptr) return; QuestV2RunEvent(pHelper, pHelper->nEventTriggerIndex); }