// @Create trigger, NPC version void CChar::NPC_CreateTrigger() { ADDTOCALLSTACK("CChar::NPC_CreateTrigger"); if (!m_pNPC) return; CCharBase *pCharDef = Char_GetDef(); TRIGRET_TYPE iRet = TRIGRET_RET_DEFAULT; lpctstr pszTrigName = "@Create"; CTRIG_TYPE iAction = (CTRIG_TYPE)FindTableSorted(pszTrigName, sm_szTrigName, CountOf(sm_szTrigName) - 1); // 2) TEVENTS for (size_t i = 0; i < pCharDef->m_TEvents.GetCount(); ++i) { CResourceLink * pLink = pCharDef->m_TEvents[i]; if (!pLink || !pLink->HasTrigger(iAction)) continue; CResourceLock s; if (!pLink->ResourceLock(s)) continue; iRet = CScriptObj::OnTriggerScript(s, pszTrigName, this, 0); if (iRet != TRIGRET_RET_FALSE && iRet != TRIGRET_RET_DEFAULT) return; } // 4) EVENTSPET triggers for (size_t i = 0; i < g_Cfg.m_pEventsPetLink.GetCount(); ++i) { CResourceLink * pLink = g_Cfg.m_pEventsPetLink[i]; if (!pLink || !pLink->HasTrigger(iAction)) continue; CResourceLock s; if (!pLink->ResourceLock(s)) continue; iRet = CScriptObj::OnTriggerScript(s, pszTrigName, this, 0); if (iRet != TRIGRET_RET_FALSE && iRet != TRIGRET_RET_DEFAULT) return; } }
TRIGRET_TYPE CRegionBase::OnRegionTrigger( CTextConsole * pSrc, RTRIG_TYPE iAction ) { ADDTOCALLSTACK("CRegionBase::OnRegionTrigger"); // RETURN: true = halt prodcessing (don't allow in this region TRIGRET_TYPE iRet; for ( size_t i = 0; i < m_Events.GetCount(); ++i ) { CResourceLink * pLink = m_Events[i]; if ( !pLink || ( pLink->GetResType() != RES_REGIONTYPE ) || !pLink->HasTrigger(iAction) ) continue; CResourceLock s; if ( pLink->ResourceLock(s) ) { iRet = CScriptObj::OnTriggerScript(s, sm_szTrigName[iAction], pSrc); if ( iRet == TRIGRET_RET_TRUE ) return iRet; } } // EVENTSREGION triggers (constant events of regions set from sphere.ini) for ( size_t i = 0; i < g_Cfg.m_pEventsRegionLink.GetCount(); ++i ) { CResourceLink * pLink = g_Cfg.m_pEventsRegionLink[i]; if ( !pLink || ( pLink->GetResType() != RES_REGIONTYPE ) || !pLink->HasTrigger(iAction) ) continue; CResourceLock s; if ( !pLink->ResourceLock(s) ) continue; iRet = CScriptObj::OnTriggerScript(s, sm_szTrigName[iAction], pSrc); if ( iRet != TRIGRET_RET_FALSE && iRet != TRIGRET_RET_DEFAULT ) return iRet; } return TRIGRET_RET_DEFAULT; }
void CItemCommCrystal::OnHear( LPCTSTR pszCmd, CChar * pSrc ) { // IT_COMM_CRYSTAL // STATF_COMM_CRYSTAL = if i am on a person. TALKMODE_TYPE mode = TALKMODE_SAY; for ( int i=0; i<m_Speech.GetCount(); i++ ) { CResourceLink * pLink = m_Speech[i]; ASSERT(pLink); CResourceLock s; if ( ! pLink->ResourceLock( s )) continue; DEBUG_CHECK( pLink->HasTrigger(XTRIG_UNKNOWN)); TRIGRET_TYPE iRet = OnHearTrigger( s, pszCmd, pSrc, mode ); if ( iRet == TRIGRET_ENDIF || iRet == TRIGRET_RET_FALSE ) continue; break; } // That's prevent @ -1 crash speech :P if ( *pszCmd == '@' ) return; if ( m_uidLink.IsValidUID()) { // I am linked to something ? // Transfer the sound. CItem * pItem = m_uidLink.ItemFind(); if ( pItem != NULL && pItem->IsType(IT_COMM_CRYSTAL)) { pItem->Speak( pszCmd ); } } else if ( ! m_Speech.GetCount()) { Speak( pszCmd ); } }
void CItemMulti::OnHearRegion( LPCTSTR pszCmd, CChar * pSrc ) { // IT_SHIP or IT_MULTI const CItemBaseMulti * pMultiDef = Multi_GetDef(); if ( pMultiDef == NULL ) return; TALKMODE_TYPE mode = TALKMODE_SAY; for ( int i=0; i<pMultiDef->m_Speech.GetCount(); i++ ) { CResourceLink * pLink = pMultiDef->m_Speech[i]; ASSERT(pLink); CResourceLock s; if ( ! pLink->ResourceLock( s )) continue; DEBUG_CHECK( pLink->HasTrigger(XTRIG_UNKNOWN)); TRIGRET_TYPE iRet = OnHearTrigger( s, pszCmd, pSrc, mode ); if ( iRet == TRIGRET_ENDIF || iRet == TRIGRET_RET_FALSE ) continue; break; } }