Example #1
0
// ---------------------------------------------------------
bool CPartyDef::MessageEvent( CGrayUID uidDst, CGrayUID uidSrc, const NCHAR * pText, int ilenmsg )
{
	ADDTOCALLSTACK("CPartyDef::MessageEvent");
	UNREFERENCED_PARAMETER(ilenmsg);
	if ( pText == NULL )
		return( false );

	if ( uidDst && !IsInParty( uidDst.CharFind() ) )
		return( false );

	CChar * pFrom = uidSrc.CharFind();
	CChar * pTo = NULL;
	if ( uidDst != (DWORD) 0 )
		pTo = uidDst.CharFind();

	TCHAR * szText = Str_GetTemp();
	CvtNUNICODEToSystem( szText, MAX_TALK_BUFFER, pText, MAX_TALK_BUFFER );

	if ( ! m_pSpeechFunction.IsEmpty() )
	{
		TRIGRET_TYPE tr = TRIGRET_RET_FALSE;
		CScriptTriggerArgs Args;
		Args.m_iN1 = uidSrc;
		Args.m_iN2 = uidDst;
		Args.m_s1 = szText;
		Args.m_s1_raw = szText;

		if ( r_Call(m_pSpeechFunction, &g_Serv, &Args, NULL, &tr) )
		{
			if ( tr == TRIGRET_RET_TRUE )
				return( false );
		}
	}

	if ( g_Log.IsLoggedMask( LOGM_PLAYER_SPEAK ))
		g_Log.Event( LOGM_PLAYER_SPEAK, "%lx:'%s' Says '%s' in party to '%s'\n", pFrom->GetClient()->GetSocketID(), pFrom->GetName(), szText, pTo ? pTo->GetName() : "all" );

	sprintf(szText, g_Cfg.GetDefaultMsg( DEFMSG_PARTY_MSG ), pText);
	PacketPartyChat cmd(pFrom, pText);

	if ( pTo != NULL )
		SendMemberMsg(pTo, &cmd);
	else
		SendAll(&cmd);

	return( true );
}
Example #2
0
bool CServerDef::r_WriteVal( lpctstr pszKey, CSString &sVal, CTextConsole * pSrc )
{
	ADDTOCALLSTACK("CServerDef::r_WriteVal");
	EXC_TRY("WriteVal");
	switch ( FindTableSorted( pszKey, sm_szLoadKeys, CountOf( sm_szLoadKeys )-1 ) )
	{
	case SC_ACCAPP:
		sVal.FormatVal( m_eAccApp );
		break;
	case SC_ACCAPPS:
		// enum string
		ASSERT( m_eAccApp >= 0 && m_eAccApp < ACCAPP_QTY );
		sVal = sm_AccAppTable[ m_eAccApp ];
		break;
	case SC_ADMINEMAIL:
		sVal = m_sEMail;
		break;
	case SC_AGE:
		// display the age in days.
		sVal.FormatLLVal( GetAgeHours()/24 );
		break;
	case SC_CLIENTVERSION:
		{
			char szVersion[ 128 ];
			sVal = m_ClientVersion.WriteClientVer( szVersion );
		}
		break;
	case SC_CREATE:
		sVal.FormatLLVal( -( g_World.GetTimeDiff(m_timeCreate) / TICK_PER_SEC ) );
		break;
	case SC_LANG:
		sVal = m_sLang;
		break;

	case SC_LASTVALIDDATE:
		if ( m_timeLastValid.IsTimeValid() )
			sVal.FormatLLVal( GetTimeSinceLastValid() / ( TICK_PER_SEC * 60 ) );
		else
			sVal = "NA";
		break;
	case SC_LASTVALIDTIME:
		// How many seconds ago.
		sVal.FormatLLVal( m_timeLastValid.IsTimeValid() ? ( GetTimeSinceLastValid() / TICK_PER_SEC ) : -1 );
		break;
	case SC_SERVIP:
		sVal = m_ip.GetAddrStr();
		break;
	case SC_NAME:
	case SC_SERVNAME:
		sVal = GetName();	// What the name should be. Fill in from ping.
		break;
	case SC_SERVPORT:
		sVal.FormatVal( m_ip.GetPort() );
		break;
	case SC_ACCOUNTS:
		sVal.FormatSTVal( StatGet( SERV_STAT_ACCOUNTS ) );
		break;
	case SC_CLIENTS:
		sVal.FormatSTVal( StatGet( SERV_STAT_CLIENTS ) );
		break;
	case SC_ITEMS:
		sVal.FormatSTVal( StatGet( SERV_STAT_ITEMS ) );
		break;
	case SC_MEM:
		sVal.FormatSTVal( StatGet( SERV_STAT_MEM ) );
		break;
	case SC_CHARS:
		sVal.FormatSTVal( StatGet( SERV_STAT_CHARS ) );
		break;
	case SC_TIMEZONE:
		sVal.FormatVal( m_TimeZone );
		break;
	case SC_URL:
		sVal = m_sURL;
		break;
	case SC_URLLINK:
		// try to make a link of it.
		if ( m_sURL.IsEmpty() )
		{
			sVal = GetName();
			break;
		}
		sVal.Format("<a href=\"http://%s\">%s</a>", static_cast<lpctstr>(m_sURL), GetName());
		break;
	case SC_VERSION:
		sVal = SPHERE_VERSION;
		break;
	default:
		{
			lpctstr pszArgs = strchr(pszKey, ' ');
			if (pszArgs != NULL)
				GETNONWHITESPACE(pszArgs);

			CScriptTriggerArgs Args( pszArgs ? pszArgs : "" );
			if ( r_Call( pszKey, pSrc, &Args, &sVal ) )
				return true;

			return CScriptObj::r_WriteVal( pszKey, sVal, pSrc );
		}
	}
	return true;
	EXC_CATCH;

	EXC_DEBUG_START;
	EXC_ADD_KEYRET(pSrc);
	EXC_DEBUG_END;
	return false;
}
Example #3
0
bool CDialogDef::r_Verb( CScript & s, CTextConsole * pSrc )	// some command on this object as a target
{
    ADDTOCALLSTACK("CDialogDef::r_Verb");
    EXC_TRY("Verb");
    // The first part of the key is GUMPCTL_TYPE
    lpctstr pszKey = s.GetKey();

    int index = FindTableSorted( pszKey, sm_szLoadKeys, CountOf(sm_szLoadKeys)-1 );
    if ( index < 0 )
    {
        CSString sVal;
        CScriptTriggerArgs Args(s.GetArgRaw());
        if ( r_Call(s.GetKey(), pSrc, &Args, &sVal) )
            return true;
        if (!m_pObj)
            return CResourceLink::r_Verb(s, pSrc);
        return m_pObj->r_Verb(s, pSrc);
    }

    lpctstr pszArgs	= s.GetArgStr();

    switch( index )
    {
        case GUMPCTL_PAGE:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;

            GET_ABSOLUTE( page );

            if ( page <= 0 )		return true;

            int	iNewPage;
            if ( m_wPage == 0 || page > m_wPage || page == 0 )
                iNewPage	= page;
            else if ( page == m_wPage  )
                iNewPage	= 1;
            else
                iNewPage	= page + 1;

            m_sControls[m_uiControls].Format( "page %d", iNewPage );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_BUTTON:			// 7 = X,Y,Down gump,Up gump,pressable(1/0),page,id
        case GUMPCTL_BUTTONTILEART:		// 11 = X,Y,Down gump,Up gump,pressable(1/0),page,id,tileart,hue,X,Y
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( down );
            GET_ABSOLUTE( up );
            GET_ABSOLUTE( press );
            GET_ABSOLUTE( page );
            GET_ABSOLUTE( id );

            int	iNewPage;
            if ( m_wPage == 0 || page > m_wPage || page == 0 )
                iNewPage	= page;
            else if ( page == m_wPage  )
                iNewPage	= 1;
            else
                iNewPage	= page + 1;

            if (index == GUMPCTL_BUTTON)
                m_sControls[m_uiControls].Format( "button %d %d %d %d %d %d %d", x, y, down, up, press, iNewPage, id );
            else
            {
                GET_ABSOLUTE( tileId );
                GET_ABSOLUTE( tileHue );
                GET_ABSOLUTE( tileX );
                GET_ABSOLUTE( tileY );

                m_sControls[m_uiControls].Format( "buttontileart %d %d %d %d %d %d %d %d %d %d %d", x, y, down, up, press, iNewPage, id, tileId, tileHue, tileX, tileY );
            }

            ++m_uiControls;
            return true;
        }
        case GUMPCTL_GUMPPIC:
        {
            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( id );
            SKIP_ALL( pszArgs );

            m_sControls[m_uiControls].Format( "gumppic %d %d %d%s%s", x, y, id, *pszArgs ? " hue=" : "", *pszArgs ? pszArgs : "" );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_GUMPPICTILED:
        {
            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( sX );
            GET_ABSOLUTE( sY );
            GET_ABSOLUTE( id );

            m_sControls[m_uiControls].Format( "gumppictiled %d %d %d %d %d", x, y, sX, sY, id );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_RESIZEPIC:
        {
            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( id );
            GET_ABSOLUTE( sX );
            GET_ABSOLUTE( sY );

            m_sControls[m_uiControls].Format( "resizepic %d %d %d %d %d", x, y, id, sX, sY );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_TILEPIC:
        case GUMPCTL_TILEPICHUE:
        {
            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( id );
            SKIP_ALL( pszArgs );

            // TilePic don't use args, TilePicHue yes :)
            if ( index == GUMPCTL_TILEPIC )
                m_sControls[m_uiControls].Format( "tilepic %d %d %d", x, y, id );
            else
                m_sControls[m_uiControls].Format( "tilepichue %d %d %d%s%s", x, y, id, *pszArgs ? " " : "", *pszArgs ? pszArgs : "" );

            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DTEXT:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;
            if ( m_uiTexts >= (CountOf(m_sText) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( hue );
            SKIP_ALL( pszArgs )
                if ( *pszArgs == '.' )			pszArgs++;

            uint iText = GumpAddText( *pszArgs ? pszArgs : "" );
            m_sControls[m_uiControls].Format( "text %d %d %d %u", x, y, hue, iText );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DCROPPEDTEXT:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;
            if ( m_uiTexts >= (CountOf(m_sText) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( w );
            GET_ABSOLUTE( h );
            GET_ABSOLUTE( hue );
            SKIP_ALL( pszArgs )
                if ( *pszArgs == '.' )			pszArgs++;

			uint iText = GumpAddText( *pszArgs ? pszArgs : "" );
            m_sControls[m_uiControls].Format( "croppedtext %d %d %d %d %d %u", x, y, w, h, hue, iText );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DHTMLGUMP:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;
            if ( m_uiTexts >= (CountOf(m_sText) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( w );
            GET_ABSOLUTE( h );
            GET_ABSOLUTE( bck );
            GET_ABSOLUTE( options );
            SKIP_ALL( pszArgs )

            uint iText = GumpAddText( *pszArgs ? pszArgs : "" );
            m_sControls[m_uiControls].Format( "htmlgump %d %d %d %d %u %d %d", x, y, w, h, iText, bck, options );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DTEXTENTRY:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;
            if ( m_uiTexts >= (CountOf(m_sText) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( w );
            GET_ABSOLUTE( h );
            GET_ABSOLUTE( hue );
            GET_ABSOLUTE( id );
            SKIP_ALL( pszArgs )

            uint iText = GumpAddText( *pszArgs ? pszArgs : "" );
            m_sControls[m_uiControls].Format( "textentry %d %d %d %d %d %d %u", x, y, w, h, hue, id, iText );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DTEXTENTRYLIMITED:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;
            if ( m_uiTexts >= (CountOf(m_sText) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( w );
            GET_ABSOLUTE( h );
            GET_ABSOLUTE( hue );
            GET_ABSOLUTE( id );
            GET_ABSOLUTE( charLimit );
            SKIP_ALL( pszArgs )

            uint iText = GumpAddText( *pszArgs ? pszArgs : "" );
            m_sControls[m_uiControls].Format( "textentrylimited %d %d %d %d %d %d %u %d", x, y, w, h, hue, id, iText, charLimit );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_CHECKBOX:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( down );
            GET_ABSOLUTE( up );
            GET_ABSOLUTE( state );
            GET_ABSOLUTE( id );

            m_sControls[m_uiControls].Format( "checkbox %d %d %d %d %d %d", x, y, down, up, state, id );

            ++m_uiControls;
            return true;
        }
        case GUMPCTL_RADIO:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( down );
            GET_ABSOLUTE( up );
            GET_ABSOLUTE( state );
            GET_ABSOLUTE( id );

            m_sControls[m_uiControls].Format( "radio %d %d %d %d %d %d", x, y, down, up, state, id );

            ++m_uiControls;
            return true;
        }
        case GUMPCTL_CHECKERTRANS:
        {
            if ( m_uiControls >= (CountOf(m_sControls) - 1) )
                return false;

            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( width );
            GET_ABSOLUTE( height );

            m_sControls[m_uiControls].Format( "checkertrans %d %d %d %d", x, y, width, height );
            ++m_uiControls;
            return true;
        }
        case GUMPCTL_DORIGIN:
        {
            // GET_RELATIVE( x, m_iOriginX );
            // GET_RELATIVE( y, m_iOriginY );
            // m_iOriginX	= x;
            // m_iOriginY	= y;

            SKIP_ALL( pszArgs );
            if ( *pszArgs == '-' && (IsSpace( pszArgs[1] ) || !pszArgs[1]) )		pszArgs++;
            else  if ( *pszArgs == '*' )	m_iOriginX	+= Exp_GetSingle( ++pszArgs );
            else							m_iOriginX	 = Exp_GetSingle( pszArgs );

            SKIP_ALL( pszArgs );
            if ( *pszArgs == '-' && (IsSpace( pszArgs[1] ) || !pszArgs[1]) )		pszArgs++;
            else  if ( *pszArgs == '*' )	m_iOriginY	+= Exp_GetSingle( ++pszArgs );
            else							m_iOriginY	= Exp_GetSingle( pszArgs );

            return true;
        }
        case GUMPCTL_NODISPOSE:
            m_fNoDispose = true;
            break;
        case GUMPCTL_CROPPEDTEXT:
        case GUMPCTL_TEXT:
        case GUMPCTL_TEXTENTRY:
        case GUMPCTL_TEXTENTRYLIMITED:
            break;

        case GUMPCTL_XMFHTMLGUMP:		// 7 = x,y,sx,sy, cliloc(1003000) hasBack canScroll
        case GUMPCTL_XMFHTMLGUMPCOLOR: // 7 + color.
        {
            GET_RELATIVE( x, m_iOriginX );
            GET_RELATIVE( y, m_iOriginY );
            GET_ABSOLUTE( sX );
            GET_ABSOLUTE( sY );
            GET_ABSOLUTE( cliloc );
            GET_ABSOLUTE( hasBack );
            GET_ABSOLUTE( canScroll );
            //SKIP_ALL( pszArgs )

            if ( index == GUMPCTL_XMFHTMLGUMP ) // xmfhtmlgump doesn't use color
                m_sControls[m_uiControls].Format( "xmfhtmlgump %d %d %d %d %d %d %d" , x, y, sX, sY, cliloc, hasBack, canScroll );
            else
                m_sControls[m_uiControls].Format( "xmfhtmlgumpcolor %d %d %d %d %d %d %d%s%s", x, y, sX, sY, cliloc, hasBack, canScroll, *pszArgs ? " " : "", *pszArgs ? pszArgs : "" );

            ++m_uiControls;
            return true;
        }
        case GUMPCTL_XMFHTMLTOK: // 9 = x y width height has_background has_scrollbar color cliloc_id @args
        {
            GET_RELATIVE(x, m_iOriginX);
            GET_RELATIVE(y, m_iOriginY);
            GET_ABSOLUTE(sX);
            GET_ABSOLUTE(sY);
            GET_ABSOLUTE(hasBack);
            GET_ABSOLUTE(canScroll);
            GET_ABSOLUTE(color);
            GET_ABSOLUTE(cliloc);
            SKIP_ALL(pszArgs);

            m_sControls[m_uiControls].Format("xmfhtmltok %d %d %d %d %d %d %d %d %s", x, y, sX, sY, hasBack, canScroll, color, cliloc, *pszArgs ? pszArgs : "");

            ++m_uiControls;
            return true;
        }
        default:
            break;
    }

    if ( m_uiControls >= (CountOf(m_sControls) - 1) )
        return false;

    m_sControls[m_uiControls].Format("%s %s", pszKey, pszArgs);
    ++m_uiControls;
    return true;
    EXC_CATCH;

    EXC_DEBUG_START;
    EXC_ADD_SCRIPTSRC;
    EXC_DEBUG_END;
    return false;
}
Example #4
0
bool CClient::OnRxAxis( const byte * pData, size_t iLen )
{
	ADDTOCALLSTACK("CClient::OnRxAxis");
	if ( !iLen || ( GetConnectType() != CONNECT_AXIS ))
		return false;

	while ( iLen -- )
	{
		int iRet = OnConsoleKey( m_Targ_Text, *pData++, GetAccount() != NULL );
		if ( ! iRet )
			return false;
		if ( iRet == 2 )
		{
			if ( GetAccount() == NULL )
			{
				if ( !m_zLogin[0] )
				{
					if ( (uint)(m_Targ_Text.GetLength()) <= (CountOf(m_zLogin) - 1) )
						strcpy(m_zLogin, m_Targ_Text);
					m_Targ_Text.Empty();
				}
				else
				{
					CSString sMsg;

					CAccountRef pAccount = g_Accounts.Account_Find(m_zLogin);
					if (( pAccount == NULL ) || ( pAccount->GetPrivLevel() < PLEVEL_Counsel ))
					{
						SysMessagef("\"MSG:%s\"", g_Cfg.GetDefaultMsg(DEFMSG_AXIS_NOT_PRIV));
						m_Targ_Text.Empty();
						return false;
					}
					if ( LogIn(m_zLogin, m_Targ_Text, sMsg ) == PacketLoginError::Success )
					{
						m_Targ_Text.Empty();
						if ( GetPrivLevel() < PLEVEL_Counsel )
						{
							SysMessagef("\"MSG:%s\"", g_Cfg.GetDefaultMsg(DEFMSG_AXIS_NOT_PRIV));
							return false;
						}
						if (GetPeer().IsValidAddr())
						{
							CScriptTriggerArgs Args;
							Args.m_VarsLocal.SetStrNew("Account",GetName());
							Args.m_VarsLocal.SetStrNew("IP",GetPeer().GetAddrStr());
							TRIGRET_TYPE tRet = TRIGRET_RET_DEFAULT;
							r_Call("f_axis_preload", this, &Args, NULL, &tRet);
							if ( tRet == TRIGRET_RET_FALSE )
								return false;
							if ( tRet == TRIGRET_RET_TRUE )
							{
								SysMessagef("\"MSG:%s\"", g_Cfg.GetDefaultMsg(DEFMSG_AXIS_DENIED));
								return false;
							}

							time_t dateChange;
							dword dwSize;
							if ( ! CSFileList::ReadFileInfo( "Axis.db", dateChange, dwSize ))
							{
								SysMessagef("\"MSG:%s\"", g_Cfg.GetDefaultMsg(DEFMSG_AXIS_INFO_ERROR));
								return false;
							}

							CSFile FileRead;
							if ( ! FileRead.Open( "Axis.db", OF_READ|OF_BINARY ))
							{
								SysMessagef("\"MSG:%s\"", g_Cfg.GetDefaultMsg(DEFMSG_AXIS_FILE_ERROR));
								return false;
							}

							tchar szTmp[8*1024];
							PacketWeb packet;
							for (;;)
							{
								size_t iLength = FileRead.Read( szTmp, sizeof( szTmp ) );
								if ( iLength <= 0 )
									break;
								packet.setData((byte*)szTmp, iLength);
								packet.send(this);
								dwSize -= (dword)iLength;
								if ( dwSize <= 0 )
									break;
							}
							return true;
						}
						return false;
					}
					else if ( ! sMsg.IsEmpty())
					{
						SysMessagef("\"MSG:%s\"", (lpctstr)sMsg);
						return false;
					}
					m_Targ_Text.Empty();
				}
				return true;
			}
		}
	}
	return true;
}