示例#1
0
void
IT_REGSERVERDOC (ENV *envp, LONGPROC f)
{
    LHSERVER lhHandle;
    LPSTR lpString1;
    LPOLESERVERDOC lpdoc;
    LPBYTE lpStr;
    LHSERVERDOC lhdoc;
    DWORD retcode;

    lhHandle = (LHSERVER)GETDWORD(SP+16);
    lpString1 = (LPSTR)GetAddress(GETWORD(SP+14),GETWORD(SP+12));
#ifdef	LATER
    translate the LPOLESERVERDOC and the structures behind it
#endif
    lpdoc = (LPOLESERVERDOC)GETDWORD(SP+8);
    lpStr = (LPBYTE)GetAddress(GETWORD(SP+6),GETWORD(SP+4));
    retcode = OleRegisterServerDoc(lhHandle,
                                   lpString1,
                                   lpdoc,
                                   &lhdoc);
    PUTDWORD(lpStr,lhdoc);
    envp->reg.sp += 2*DWORD_86 + 2*LP_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#2
0
// Connect WorldServer
bool CCharServer::pakWSReady ( CCharClient* thisclient, CPacket* P )
{
	if(thisclient->isLoggedIn) return false;
	if(GETDWORD((*P),0) != Config.CharPass )
    {
        Log( MSG_HACK, "WorldServer Tried to connect CharServer with wrong password ");
        return true;
    }
    thisclient->userid = GETDWORD((*P), 4); //our channelid
    thisclient->accesslevel = 0xffff; //this will identify thisclient as channel

    // add channel
    CChanels* newchannel = new (nothrow) CChanels;
    if(newchannel==NULL)
        return false;

    newchannel->id = GETDWORD((*P), 4);
    newchannel->ip = inet_ntoa( thisclient->clientinfo.sin_addr );
    newchannel->port = GETWORD((*P),8 );
    Log( MSG_INFO, "Channel #%i connected from ip %s", newchannel->id, newchannel->ip );

    // Connect to charserver
	newchannel->sock = socket( AF_INET, SOCK_STREAM, 0 );
	if (newchannel->sock == INVALID_SOCKET)
    {
		Log( MSG_WARNING, "Could not access worldserver IP: %s , Port: %i", newchannel->ip, newchannel->port );
		delete newchannel;
		return false;
	}
	struct sockaddr_in ain;
	ain.sin_family		= AF_INET;
   	ain.sin_addr.s_addr	= thisclient->clientinfo.sin_addr.s_addr;
	ain.sin_port		= htons( newchannel->port );
	memset(&(ain.sin_zero), '\0', 8);
	if ( connect( newchannel->sock , (SOCKADDR*) &ain, sizeof(ain) ) == SOCKET_ERROR)
    {
		Log( MSG_WARNING, "Could not access worldserver IP: %s , Port: %i", newchannel->ip , newchannel->port );
		delete newchannel;
		return false;
	}
    ChannelList.push_back( newchannel );

	thisclient->isLoggedIn = true;
	BEGINPACKET( pak, 0x500 );
    ADDDWORD   ( pak, Config.WorldPass );
	//cryptPacket( (char*)&pak, NULL );
	send( newchannel->sock, (char*)&pak, pak.Size, 0 );
	return true;
}
示例#3
0
// Send server list
bool CLoginServer::pakGetServers( CLoginClient* thisclient, CPacket* P )
{
	if( !thisclient->isLoggedIn ) return false;
	MYSQL_ROW row;
	DWORD servernum = GETDWORD( (*P), 0 );
	MYSQL_RES *result = DB->QStore( "SELECT id,name,connected,maxconnections FROM channels WHERE owner=%i and type=2", servernum );
	if(result==NULL) return false;
	BEGINPACKET( pak, 0x704 );
	ADDDWORD   ( pak, servernum );
	ADDBYTE    ( pak, (BYTE)mysql_num_rows( result ) );
	while(row = mysql_fetch_row(result))
    {
    	UINT connected = atoi(row[2]);
    	UINT maxconnections = atoi(row[3]);
    	BYTE id = atoi( row[0] );
    	string name = row[1];
    	//BYTE status = (((100 * connected) / maxconnections==0?1:maxconnections) / 5) & 0xff;
    	unsigned int status = (connected * 100) / maxconnections;
		ADDWORD( pak, id );
		ADDBYTE( pak, 0 );
		ADDWORD( pak, status );
		ADDSTRING( pak, name.c_str() );
		ADDBYTE( pak, 0 );
	}
	DB->QFree( );
	thisclient->SendPacket ( &pak );
    return true;
}
示例#4
0
// Disconnect client from char/world server
bool CCharServer::pakLoginDSClient( CCharClient* thisclient, CPacket* P )
{
    unsigned int userid = GETDWORD((*P), 1 );
    CCharClient* otherclient = GetClientByUserID( userid );
    BYTE action = GETBYTE((*P),0);
    switch(action)
    {
        case 1:
        {
            if(otherclient==NULL)
            {
                Log( MSG_WARNING, "Userid '%u' is not online", userid );
                return true;
            }
            otherclient->isLoggedIn = false;
            otherclient->isActive = false;
            BEGINPACKET( pak, 0x502 );
            ADDBYTE    ( pak, 1 );
            ADDDWORD   ( pak, userid );
            //ADDBYTE    ( pak, 0x00 );
            //cryptPacket( (char*)&pak, NULL );
            CChanels* thischannel = GetChannelByID( otherclient->channel );
            if(thischannel!=NULL)
                send( thischannel->sock, (char*)&pak, pak.Size, 0 );
        }
        break;
    }
    return true;
}
示例#5
0
// Return to char select
bool CCharServer::pakWSCharSelect ( CCharClient* thisclient, CPacket* P )
{
	if(!thisclient->isLoggedIn) return false;
	Log( MSG_INFO, "World server requested char select" );

	DWORD userid = GETDWORD( (*P), 0 );
	CCharClient* otherclient = GetClientByUserID( userid );
	if(otherclient==NULL)
	{
        Log(MSG_WARNING, "Invalid userid: %i", userid );
	    return true;
    }

	BEGINPACKET( pak, 0x71c );
	ADDBYTE    ( pak, 0x00 );
	otherclient->SendPacket( &pak );
    Log( MSG_INFO, "Client returning to char select" );
    RESETPACKET( pak, 0x505 );
    ADDDWORD( pak, thisclient->userid );
    //cryptPacket( (char*)&pak, NULL );

    CChanels* thischannel = GetChannelByID( thisclient->channel );
    if(thischannel!=NULL)
    {
        send( thischannel->sock, (char*)&pak, pak.Size, 0 );
    }

    //LMA: resetting chatroom ID.
    DisconnectClientFromChat(thisclient);


	return true;
}
示例#6
0
// Messenger Chat
bool CCharServer::pakMessengerChat ( CCharClient* thisclient, CPacket* P )
{
    //WORD id = GETWORD((*P),0);
    DWORD id = GETDWORD((*P),0);
    char* message = new char[P->Size-41];
    if(message==NULL)
    {
        Log(MSG_ERROR, "Error allocing memory: pakMessengerChat" );
        return false;
    }
    memcpy( message, &P->Buffer[35], P->Size-41 );
    CCharClient* otherclient = (CCharClient*) GetClientByID(id);
    if(otherclient!=NULL)
    {
        BEGINPACKET( pak, 0x7e2 );
        /*ADDWORD    ( pak, thisclient->charid );
        ADDWORD    ( pak, 0x0000 );*/
        ADDDWORD    ( pak, thisclient->charid );
        ADDSTRING  ( pak, thisclient->charname );
        UINT namesize = strlen(thisclient->charname);
        for (int i=0;i<30-namesize;i++)
            ADDBYTE    ( pak, 0x00 );
        ADDBYTE    ( pak, 0x00 );
        ADDSTRING  ( pak, message );
        ADDBYTE    ( pak, 0x00 );
        otherclient->SendPacket(&pak);
    }
    delete []message;
    return true;
}
示例#7
0
void
IT_GLOBALALLOC (ENV *envp,LONGPROC f)	/* GlobalAlloc */
{
	UINT uSel,flags;
	DWORD dwSize;
	DWORD dwMemSize;
	HGLOBAL hGlobal;

	dwSize = GETDWORD(SP+4);
	flags = GETWORD(SP+8);
	dwMemSize=dwSize;
	dwSize = max(32,(dwSize + 31) & 0xffffffe0);

	uSel = TWIN_AllocSelector(dwSize,flags);

	if (uSel) {
	    hGlobal = GetSelectorHandle(uSel);
	    CreateDataInstance((HINSTANCE)hGlobal,(HMODULE)0,
			GetCurrentTask());

	    if (flags & GMEM_MOVEABLE) {
		GlobalUnlock(hGlobal);
		uSel &= 0xfffe;
	    }
	}
	envp->reg.sp += UINT_86 + DWORD_86 + RET_86;
	envp->reg.ax = LOWORD(uSel);
	envp->reg.dx = 0;
}
示例#8
0
bool CCharServer::pakDownloadCM ( CCharClient* thisclient, CPacket* P )
{
    unsigned int clanid = GETDWORD((*P), 0 );
    MYSQL_RES* result = DB->QStore("SELECT logo FROM list_clan WHERE id=%i",clanid );
    if(result==NULL) return true;
    if(mysql_num_rows(result)!=1) return true;
    MYSQL_ROW row = mysql_fetch_row(result);
    unsigned int cmid = atoi(row[0]);
    DB->QFree( );          
    char filename[30];
    sprintf( filename, "clanmark/%u.cm", cmid ); 
    FILE* fh = fopen( filename, "rb" );
    if(fh==NULL)
    {
        Log( MSG_WARNING, "Invalid clanmark ID %i", cmid );
        return true;
    }
    CClans* thisclan = GetClanByID(thisclient->clanid);
    BEGINPACKET( pak, 0x7e7 );
    ADDDWORD   ( pak, clanid );
    while(!feof(fh))
    {
        unsigned char charvalue = '\0';
        fread( &charvalue, 1 , 1, fh );
        ADDBYTE( pak, charvalue );
    }
    ADDWORD( pak,0);
    thisclient->SendPacket( &pak );
    fclose(fh);
    return true;
}
示例#9
0
// Send server list
bool CLoginServer::pakGetServers( CLoginClient* thisclient, CPacket* P )
{
	if( !thisclient->isLoggedIn ) return false;
	MYSQL_ROW row;
	DWORD servernum = GETDWORD( (*P), 0 );
	MYSQL_RES *result = DB->QStore( "SELECT id,name,connected,maxconnections FROM channels WHERE owner=%i and type=2", servernum );
	if(result==NULL) return false;

	BEGINPACKET( pak, 0x704 );
	ADDDWORD   ( pak, servernum );
	ADDBYTE    ( pak, (BYTE)mysql_num_rows( result ) );
	while(row = mysql_fetch_row(result))
    {
    	unsigned int status = (atoi(row[2]) * 100) / atoi(row[3]);

		ADDWORD( pak, atoi( row[0]));
		ADDBYTE( pak, 0 );
		ADDWORD( pak, status );
		ADDSTRING( pak, row[1]);
		ADDBYTE( pak, 0 );
	}
	DB->QFree( );
	thisclient->SendPacket ( &pak );
    return true;
}
示例#10
0
// Connect user to charserver
bool CLoginServer::pakConnectToChar( CLoginClient* thisclient, CPacket *P )
{
	if(thisclient->isLoggedIn) return true;
	if(GETDWORD((*P),0) != Config.LoginPass)
    {
        Log( MSG_HACK, "Charserver Tried to connect loginserver with wrong password ");
        return true;
    }
    thisclient->userid = GETDWORD((*P), 4); //our serverid
    thisclient->accesslevel = 0xffff; //this will identify thisclient as server

    // add new server
    CServers* newserver = new (nothrow) CServers( );
    if(newserver==NULL)
        return false;
    newserver->id = GETDWORD((*P), 4);
    newserver->ip = inet_ntoa( thisclient->clientinfo.sin_addr );
    newserver->port = GETWORD((*P),8 );
    Log( MSG_INFO, "Server #%i connected from ip %s", newserver->id, newserver->ip );

    // Connect to charserver
	newserver->sock = socket( AF_INET, SOCK_STREAM, 0 );
	if (newserver->sock == INVALID_SOCKET)
    {
		Log( MSG_WARNING, "Could not access char server IP: %s , Port: %i", newserver->ip, newserver->port );
		delete newserver;
		return false;
	}
	struct sockaddr_in ain;
	ain.sin_family		= AF_INET;
   	ain.sin_addr.s_addr	= thisclient->clientinfo.sin_addr.s_addr;
	ain.sin_port		= htons( newserver->port );
	if ( connect( newserver->sock , (SOCKADDR*) &ain, sizeof(ain) ) == SOCKET_ERROR)
    {
		Log( MSG_WARNING, "Could not access char server IP: %s , Port: %i", newserver->ip , newserver->port );
		delete newserver;
		return false;
	}
    ServerList.push_back( newserver );
    // Identify packet
    thisclient->isLoggedIn = true;
    BEGINPACKET( pak, 0x501 );
    ADDDWORD   ( pak, Config.CharPass );
    cryptPacket( (char*)&pak, NULL );
    send( newserver->sock, (char*)&pak, pak.Size, 0 );
    return true;
}
示例#11
0
void
IT_ENUMMETAFILE (ENV *envp,LONGPROC f)
{
	DWORD retcode;
	WORD wSel;
	DWORD dwProc;

	wSel = GETWORD(SP+12);
	if ((dwProc = GETDWORD(SP+8)))
	    dwProc = (DWORD)make_native_thunk(dwProc,(DWORD)hsw_mfenumproc);
	retcode = (f)(GETWORD(SP+14),
		GetSelectorHandle(wSel),
		dwProc,
		GETDWORD(SP+4));
	envp->reg.sp += 2*HANDLE_86 + LP_86 + LONG_86 + RET_86;
	envp->reg.ax = LOWORD(retcode);
	envp->reg.dx = HIWORD(retcode);
}
示例#12
0
// Login Connected
bool CCharServer::pakLoginConnected( CCharClient* thisclient, CPacket* P )
{
	if(thisclient->isLoggedIn) return false;
	if(GETDWORD((*P),0) != Config.CharPass )
    {
         Log( MSG_HACK, "LoginServer Tried to connect CharServer with wrong password ");
         return true;
    }
	thisclient->isLoggedIn = true;
    return true;
}
示例#13
0
void 
IT_ISBADHUGEPTR (ENV *envp,LONGPROC f)
{
        DWORD retcode;
	LPSTR lpString;

        lpString = MAKELP(GETWORD(SP+10),GETWORD(SP+8));
        retcode = (f)(lpString,GETDWORD(SP+4));
        envp->reg.sp += LONG_86 + LP_86 + RET_86;
        envp->reg.ax = LOWORD(retcode);
        envp->reg.dx = HIWORD(retcode);
}
示例#14
0
void
_86_SetSelectorBase (ENV *envp,LONGPROC f)
{
    UINT uSel;
    DWORD dwBase;

    uSel = (UINT)GETWORD(SP+8);
    dwBase = GETDWORD(SP+4);
    SetPhysicalAddress(uSel,dwBase);
    envp->reg.ax = uSel;
    envp->reg.dx = 0;
    envp->reg.sp += UINT_86 + DWORD_86 + RET_86;
}
示例#15
0
void
_86_SetSelectorLimit (ENV *envp,LONGPROC f)
{
    UINT uSel;
    DWORD dwLimit;

    uSel = (UINT)GETWORD(SP+8);
    dwLimit = GETDWORD(SP+4);
    SetSelectorLimit(uSel,dwLimit);
    envp->reg.ax = 0;
    envp->reg.dx = 0;
    envp->reg.sp += UINT_86 + DWORD_86 + RET_86;
}
示例#16
0
void
IT_OLEENUMOBJ(ENV *envp,LONGPROC f)
{
    DWORD retcode;
    LPBYTE lp1;

    lp1 = (LPBYTE)GetAddress(GETWORD(SP+6),GETWORD(SP+4));
    retcode = OleEnumObjects((LHCLIENTDOC)GETDWORD(SP+8),
                             (LPOLEOBJECT *)lp1);
    envp->reg.sp += LP_86 + LONG_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#17
0
int CJpegParse::ExifGetDword(unsigned char* ptr, UINT8 order)
{
	if (!ptr) 
		return 0;
	switch(order)
	{
        case EXIF_BYTE_ORDER_MOTOROLA:
			return GETDWORD(ptr, 0);
        case EXIF_BYTE_ORDER_INTEL:
			return GETDWORD_INV(ptr, 0);
		default:
			return 0;
	}
}
示例#18
0
void
IT_REGSERVER (ENV *envp,LONGPROC f)
{
    OLESERVER oleserver;
    OLESERVERVTBL vtbl;
    LHSERVER lhHandle;
    LPSTR lpszClass;
    LPBYTE lpStr,lpData;
    DWORD retcode,dwProc;
    BINADDR dwBinAddr;

    lpszClass = (LPSTR)GetAddress(GETWORD(SP+18),GETWORD(SP+16));
    lpStr = (LPBYTE)GetAddress(GETWORD(SP+10),GETWORD(SP+8));

    dwBinAddr = GETDWORD(SP+12);
    /* this points to LPOLESERVERVTBL */
    lpData = (LPBYTE)GetAddress(HIWORD(dwBinAddr),LOWORD(dwBinAddr));
    dwBinAddr = GETDWORD(lpData);
    /* this points to OLESERVERVTBL */
    lpData = (LPBYTE)GetAddress(HIWORD(dwBinAddr),LOWORD(dwBinAddr));

    vtbl.Open = (OLESTATUS (*)())GETDWORD(lpData);
    vtbl.Create = (OLESTATUS (*)())GETDWORD(lpData+4);
    vtbl.CreateFromTemplate = (OLESTATUS (*)())GETDWORD(lpData+8);
    vtbl.Edit = (OLESTATUS (*)())GETDWORD(lpData+12);
    vtbl.Exit = (OLESTATUS (*)())GETDWORD(lpData+16);
    dwProc = GETDWORD(lpData+20);
    vtbl.Release = (OLESTATUS (*)())((dwProc)?
                                     make_native_thunk(dwProc,(DWORD)hsw_oleserverrelease):0L);
    vtbl.Execute = (OLESTATUS (*)(LPOLESERVER, HGLOBAL))GETDWORD(lpData+24);
    oleserver.lpvtbl = &vtbl;

    retcode = OleRegisterServer(lpszClass,
                                &oleserver,
                                &lhHandle,
                                (HANDLE)GETWORD(SP+6),
                                (int)GETWORD(SP+4));
    PUTDWORD(lpStr,lhHandle);
    envp->reg.sp += HANDLE_86 + 3*LP_86 + INT_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#19
0
void
IT_UNBLOCKSERVER (ENV *envp,LONGPROC f)	/* OleUnblockServer */
{
    DWORD retcode;
    LPBYTE lpData;
    BOOL flag;

    lpData = (LPBYTE)GetAddress(GETWORD(SP+6),GETWORD(SP+4));
    flag = (BOOL)GETWORD(lpData);
    retcode = (f)((LHSERVER)GETDWORD(SP+8),&flag);
    PUTWORD(lpData,(WORD)flag);
    envp->reg.sp += LONG_86 + LP_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#20
0
void
_86_GetCodeHandle (ENV *envp,LONGPROC f)
{
	DWORD retcode;
	WORD wSel;

	wSel = HIWORD(GETDWORD(SP+4));

	if (GetSelectorFlags(wSel) & DF_CODE)
	    retcode = MAKELONG(wSel & 0xfffe,wSel | 1);
	else	/* data segment */
	    retcode = 0;
	envp->reg.sp += LP_86 + RET_86;
	envp->reg.ax = LOWORD(retcode);
	envp->reg.dx = HIWORD(retcode);
}
示例#21
0
void
IT_GLOBALENTRYHANDLE (ENV *envp,LONGPROC f)
{
    DWORD retcode,dwSize;
    UINT uSel,uIndex;
    LPBYTE lpData;
    GLOBALENTRY ge;
    LPMODULEINFO lpModInfo;
    extern MODULEINFO *lpModuleTable[];

    lpData = (LPBYTE)GetAddress(GETWORD(SP+8), GETWORD(SP+6));
    dwSize = GETDWORD(lpData);
    if (dwSize != (3*DWORD_86 + HANDLE_86 + 3*WORD_86 + INT_86 +
		HANDLE_86 + 2*WORD_86 + 2*DWORD_86))
	retcode = 0;
    else {
	ge.dwSize = sizeof(GLOBALENTRY);
	uSel = (UINT)GETWORD(SP+4);
	if ((retcode = (DWORD)GlobalEntryHandle(&ge,GetSelectorHandle(uSel)))) {
	    PUTDWORD(lpData+4,ge.dwAddress);
	    PUTDWORD(lpData+8,ge.dwBlockSize);
	    PUTWORD(lpData+12,ge.hBlock);
	    PUTWORD(lpData+14,ge.wcLock);
	    PUTWORD(lpData+16,ge.wcPageLock);
	    PUTWORD(lpData+18,ge.wFlags);
	    PUTWORD(lpData+20,ge.wHeapPresent);
#ifdef	LATER
	    PUTWORD(lpData+22,ge.hOwner);
#else
	    /* this is a kludge to run DELPHI */
	    if (!(uIndex = (UINT)GetModuleIndex(uSel)))
		/* this is an index for KERNEL (maybe!) */
		uIndex = 1;
	    lpModInfo = lpModuleTable[uIndex];
	    PUTWORD(lpData+22,lpModInfo->ObjHead.hObj);
#endif
	    PUTWORD(lpData+24,ge.wType);
	    PUTWORD(lpData+26,ge.wData);
	    PUTDWORD(lpData+28,ge.dwNext);
	    PUTDWORD(lpData+32,ge.dwNextAlt);
	}
    }

    envp->reg.sp += LP_86 + HANDLE_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#22
0
// Send server IP
bool CLoginServer::pakGetIP( CLoginClient* thisclient, CPacket* P )
{
	if (!thisclient->isLoggedIn) return false;
	;
	MYSQL_ROW row;
	DWORD servernum = GETDWORD( (*P), 0 );
	BYTE channelnum = GETBYTE( (*P), 4 );

	BEGINPACKET( pak, 0x70a );

	if(!DB->QExecute( "UPDATE accounts SET lastsvr=%i,lastip='%s',lasttime=UNIX_TIMESTAMP( NOW() ) WHERE id=%i", channelnum, inet_ntoa( thisclient->clientinfo.sin_addr ), thisclient->userid))
	   return false;
	MYSQL_RES *result = DB->QStore( "SELECT host,port,lanip,lansubmask,connected,maxconnections FROM channels WHERE id=%i and type=1", servernum );
    if(result==NULL) return false;
	if(mysql_num_rows(result)!=1)
	{
        Log(MSG_WARNING, "Player selected a invalid channel or channel offline" );
        DB->QFree( );
        return true;
    }
	row = mysql_fetch_row(result);
	UINT connected = atoi(row[4]);
	UINT maxconnections = atoi(row[5]);
	ADDBYTE( pak, 0 );
	ADDDWORD( pak, thisclient->userid );
	ADDDWORD( pak, 0x87654321 );
	if(strcmp(thisclient->ClientSubNet,row[3])==0)//from lan
	{
        ADDSTRING( pak, row[2] );
       	Log(MSG_INFO, "Lan: %s choice channel #%i", thisclient->username.c_str(), channelnum);
    }
    else if(strcmp( thisclient->ClientSubNet ,"127.0.0")==0)//same computer
    {
        ADDSTRING( pak, "127.0.0.1" );
       	Log(MSG_INFO, "Server: %s choice channel #%i", thisclient->username.c_str(), channelnum);
    }
    else
    {
        ADDSTRING( pak, row[0] );
       	Log(MSG_INFO, "Inet: %s choice channel #%i", thisclient->username.c_str(), channelnum);
    }
	ADDBYTE( pak, 0 );
	ADDWORD( pak, atoi(row[1]) );
	DB->QFree( );
	thisclient->SendPacket ( &pak );
    return true;
}
示例#23
0
void
IT_GLOBALREALLOC (ENV *envp,LONGPROC f)		/* GlobalReAlloc */
{
    UINT uiFlags, uSel;
    HGLOBAL hGlobal;
    LPBYTE  lpSeg;
    WORD wSP=0,wBP=0;
    DWORD dwNewSize;

    uSel = GETWORD(SP+10) | 1;
    uiFlags = (UINT)GETWORD(SP+4);
    dwNewSize = GETDWORD(SP+6);


    if (dwNewSize != 0) {
#ifdef LATER
	dwNewSize = max(dwNewSize,32);
	dwNewSize = (dwNewSize + 31) & 0xffffffe0;
#endif
        
	lpSeg = GetPhysicalAddress(uSel);
	if (uSel == envp->reg.ss) {
	    wSP = (WORD)(SP - lpSeg);
	    wBP = (WORD)(BP - lpSeg);
	}
	uSel = TWIN_ReallocSelector(uSel,dwNewSize,uiFlags);
	hGlobal = GetSelectorHandle(uSel);
	if (uSel == envp->reg.ss) {
	    envp->reg.sp = (REGISTER)(GetPhysicalAddress(uSel) + wSP);
	    envp->reg.bp = (REGISTER)(GetPhysicalAddress(uSel) + wBP);
	}
	if (uiFlags & GMEM_MOVEABLE) {
	    GlobalUnlock(hGlobal);
	    uSel &= 0xfffe;
	}
    } else {
	/* check if we are discarding, size 0,... */
	hGlobal = GetSelectorHandle(uSel);
	(void) GlobalReAlloc(hGlobal,0,uiFlags);
    }

    envp->reg.sp += HANDLE_86 + UINT_86 + DWORD_86 + RET_86;
    envp->reg.ax = LOWORD(uSel);
    envp->reg.dx = 0;
}
示例#24
0
void
_86_GlobalDosAlloc (ENV *envp,LONGPROC f)
{
	DWORD retcode;
	WORD wSel=0;
	LPBYTE lpData;
	DWORD dwSize;

	dwSize = GETDWORD(SP+4);
	retcode = GlobalAlloc(GMEM_FIXED, dwSize);
	if (retcode) {
		lpData = (LPBYTE)GlobalLock(retcode);
		wSel = AssignSelector(lpData,0,TRANSFER_DATA,dwSize);
		SetSelectorHandle(wSel,(HGLOBAL)retcode);
	}
	envp->reg.sp += DWORD_86 + RET_86;
	envp->reg.ax = envp->reg.dx = wSel;
}
示例#25
0
// Do player identification
bool CCharServer::pakDoIdentify( CCharClient* thisclient, CPacket* P )
{
	if (thisclient->isLoggedIn) return false;	
	MYSQL_RES *result;
	MYSQL_ROW row;
	thisclient->userid = GETDWORD((*P), 0x00);
	memcpy( thisclient->password, &P->Buffer[4], 32 );
	result = DB->QStore("SELECT username,lastsvr,accesslevel,platinum FROM accounts WHERE id=%i AND password='******'", thisclient->userid, thisclient->password);
	if(result==NULL) return false;
	if (mysql_num_rows( result ) != 1) 
    {
		Log( MSG_HACK, "Someone tried to connect to char server with an invalid account" );
		DB->QFree( );
		return false;
	}
    else
    {
		row = mysql_fetch_row(result);
		strncpy(thisclient->username, row[0],16);
		thisclient->channel = atoi(row[1]);
		thisclient->accesslevel = atoi(row[2]);
		thisclient->platinum = atoi(row[3]);
		DB->QFree( );
	}

	Log( MSG_INFO,"User '%s'(#%i) logged in", thisclient->username, thisclient->userid );

	BEGINPACKET( pak, 0x070c );
	ADDBYTE    ( pak, 0 );
	ADDDWORD   ( pak, 0x87654321);
	ADDDWORD   ( pak, 0x00000000 );
	thisclient->SendPacket( &pak );
	result = DB->QStore( "SELECT online FROM accounts WHERE username='******'", thisclient->username );
    if(result==NULL) return false;	
    row = mysql_fetch_row(result);
    bool online = atoi(row[0]);
    DB->QFree( );    
    if(online)
        return false;
    if(!DB->QExecute( "UPDATE accounts SET online=1 WHERE username='******'", thisclient->username ))
        return false;
	thisclient->isLoggedIn = true;
    return true;
}
示例#26
0
bool CCharServer::pakUpdateLevel( CCharClient* thisclient, CPacket* P )
{
    if(!thisclient->isLoggedIn) return false;
    /*WORD charid = GETWORD((*P),0);
    WORD level = GETWORD((*P),2);*/
    //LMA: W->DW for CharID (Panda).
    DWORD charid = GETDWORD((*P),0);
    WORD level = GETWORD((*P),4);
    for(UINT i=0;i<ClientList.size();i++)
    {
        CCharClient* player = (CCharClient*) ClientList.at(i);
        if(player->charid==charid)
        {
            player->level = level;
            break;
        }
    }
    return true;
}
示例#27
0
void
IT_OLELOADFROMSTREAM(ENV *envp,LONGPROC f)
{
    DWORD retcode;
    LPBYTE lp1,lp2,lp3;
    LPSTR lpString1,lpString2;

    lp1 = (LPBYTE)GetAddress(GETWORD(SP+26),GETWORD(SP+24));
    lpString1 = (LPSTR)GetAddress(GETWORD(SP+22),GETWORD(SP+20));
    lp2 = (LPBYTE)GetAddress(GETWORD(SP+18),GETWORD(SP+16));
    lpString2 = (LPSTR)GetAddress(GETWORD(SP+10),GETWORD(SP+8));
    lp3 = (LPBYTE)GetAddress(GETWORD(SP+6),GETWORD(SP+4));

    retcode = OleLoadFromStream((LPOLESTREAM)lp1,lpString1,
                                (LPOLECLIENT)lp2,GETDWORD(SP+12),
                                lpString2,(LPOLEOBJECT *)lp3);

    envp->reg.sp += 5*LP_86 + LONG_86 + RET_86;
    envp->reg.ax = LOWORD(retcode);
    envp->reg.dx = HIWORD(retcode);
}
示例#28
0
文件: httpvod.c 项目: as2120/ZAchieve
int uhVod(UrlHandlerParam* param)
{
    HTTP_XML_NODE node;
    char *req=param->pucRequest;
    char *pbuf = param->pucBuffer;
    int bufsize = param->dataBytes;
    char *action;
    PL_ENTRY *ptr;
    VOD_CTX* ctx;
    int i;

    if (*req && *req != '?') return 0;
    node.indent = 1;
    node.name = "state";
    node.fmt = "%s";
    node.flags = 0;
    mwWriteXmlHeader(&pbuf, &bufsize, 10, "gb2312", mwGetVarValue(param->pxVars, "xsl", 0));
    mwWriteXmlString(&pbuf, &bufsize, 0, "<response>");

    mwParseQueryString(param);

    ctx = GetVodContext(param->hs->ipAddr.laddr);

    action = mwGetVarValue(param->pxVars, "action", 0);

    if (!action)
    {
        int count = mwGetVarValueInt(param->pxVars, "count", -1);
        ptr = ctx->playlist;
        mwWriteXmlString(&pbuf, &bufsize, 1, "<playlist>");
        for (i=0; ptr && (unsigned int)i < (unsigned int)count; ptr = ptr->next, i++)
        {
            char buf[32];
            snprintf(buf, sizeof(buf), "<item index=\"%03d\">", i);
            mwWriteXmlString(&pbuf, &bufsize, 2, buf);

            node.indent = 3;
            node.name = "stream";
            node.fmt = "%s";
            node.value = ptr->data;
            mwWriteXmlLine(&pbuf, &bufsize, &node, 0);

            node.flags = XN_CDATA;
            node.name = "title";
            node.value = (char*)ptr->data + strlen(ptr->data) + 1;
            mwWriteXmlLine(&pbuf, &bufsize, &node, 0);

            mwWriteXmlString(&pbuf, &bufsize, 2, "</item>");
        }
        mwWriteXmlString(&pbuf, &bufsize, 1, "</playlist>");
    }
    else if (!strcmp(action, "add"))
    {
        char *filename = mwGetVarValue(param->pxVars, "stream", 0);
        char *title = mwGetVarValue(param->pxVars, "title", 0);
        if (!title) title = "";
        if (!filename)
        {
            node.value = "error";
        }
        else
        {
            int fnlen;
            int titlelen;
            char *entrydata;
            mwDecodeString(filename);
            fnlen = strlen(filename);
            titlelen = strlen(title);
            entrydata = (char*)malloc(fnlen + titlelen + 3);
            strcpy(entrydata, filename);
            strcpy(entrydata + fnlen + 1, title);
            node.value = plAddEntry(&ctx->playlist, entrydata, fnlen + titlelen + 2) ? "OK" : "error";
        }
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
    }
    else if (!strcmp(action, "pin"))
    {
        int index = mwGetVarValueInt(param->pxVars, "arg", 0);
        node.value = plPinEntryByIndex(&ctx->playlist, index) ? "OK" : "error";
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
    }
    else if (!strcmp(action, "del"))
    {
        int index = mwGetVarValueInt(param->pxVars, "arg", 0);
        void* data = plDelEntryByIndex(&ctx->playlist, index) ? "OK" : "error";
        if (data)
        {
            free(data);
            node.value = "OK";
        }
        else
        {
            node.value = "error";
        }
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
    }
    else if (!strcmp(action, "play"))
    {
        char* stream = (char*)plGetEntry(&ctx->playlist);
        if (stream)
        {
            node.name = "stream";
        }
        node.name = "stream";
        node.value = stream ? stream : vodloop;
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
        node.name = "control";
        node.fmt = "%s/vodplay?action=control";
        node.value = vodhost;
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
        if (stream) free(stream);
        ctx->nextaction = 0;
    }
    else if (!strcmp(action, "control"))
    {
        int arg = mwGetVarValueInt(param->pxVars, "arg", 0);
        if (arg)
            ctx->nextaction = arg;
        else if (ctx->nextaction)
        {
            node.name = "action";
            node.fmt = "%d";
            node.value = (void*)ctx->nextaction;
            mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
            ctx->nextaction = 0;
        }
    }

#if 0
    arg = mwGetVarValue(param->pxVars, "arg", 0);
    id = mwGetVarValue(param->pxVars, "id", 0);
    switch (GETDWORD(param->pucRequest + 1))
    {
    case DEFDWORD('n','o','p',0):
        strcpy(pbuf,"state=OK");
        break;
    case DEFDWORD('c','m','d',0):
        //action=ACT_SKIP;
        strcpy(pbuf,"Play next");
        param->dataBytes=9;
        return FLAG_DATA_RAW;
    case DEFDWORD('l','i','s','t'):
    {
        PL_ENTRY *ptr = plhdr[session];
        int i;
        mwWriteXmlString(&pbuf, &bufsize, 1, "<playlist>");
        for (i=0; ptr; ptr = ptr->next, i++)
        {
            OutputItemInfo(&pbuf, &bufsize, ptr->data);
        }
        mwWriteXmlString(&pbuf, &bufsize, 1, "</playlist>");
    }
    break;
    case DEFDWORD('a','d','d',0):
    {
        node.name = "state";
        if (plFindEntry(plhdr[session],(void*)id, strlen(id)))
        {
            OutputItemInfo(&pbuf, &bufsize, id);
            node.value = "ordered";
            mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
            break;
        }
        if (plAddEntry(&plhdr[session], strdup(id), strlen(id) + 1))
        {
            node.value =  "OK";
            OutputItemInfo(&pbuf, &bufsize, id);
        }
        else
        {
            node.value =  "error";
        }
        node.name = "state";
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
    }
    break;
    case DEFDWORD('d','e','l',0):
        OutputItemInfo(&pbuf, &bufsize, id);
        node.name = "state";
        node.value = plDelEntry(&plhdr[session],(void*)id) ? "OK" : "error";
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
        break;
    case DEFDWORD('p','i','n',0):
        OutputItemInfo(&pbuf, &bufsize, id);
        node.name = "state";
        node.value = plPinEntry(&plhdr[session],(void*)id) ? "OK" : "error";
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
        break;
    case DEFDWORD('p','l','a','y'):
    {
        void* data = plGetEntry(&plhdr[session]);
        node.name = "state";
        if (data)
        {
            OutputItemInfo(&pbuf, &bufsize, data);
            node.value = "OK";
            free(data);
        }
        else
        {
            node.value = "error";
        }
        mwWriteXmlLine(&pbuf, &bufsize, &node, 0);
    }
    break;
    default:
        strcpy(pbuf,"Invalid request");
    }
#endif
    mwWriteXmlString(&pbuf, &bufsize, 0, "</response>");
    param->dataBytes=(int)(pbuf-param->pucBuffer);
    param->fileType=HTTPFILETYPE_XML;
    return FLAG_DATA_RAW;
}
示例#29
0
// Party Actions [invite/leave/kick]
bool CWorldServer::pakPartyActions( CPlayer* thisclient, CPacket* P )
{
    unsigned int action = GETBYTE((*P),0);
    CMap* map = MapList.Index[thisclient->Position->Map];
    switch(action)
    {
        case 0x00://Invita a new party
        case 0x01://invite a existent party
        {
            UINT clientid = GETWORD((*P),1);
            if(thisclient->Party->party!=NULL)
            {
                //LMA: Refreshing Capacity if needed
                thisclient->Party->party->RefreshMax();
                if(thisclient->Party->party->Members.size()>=thisclient->Party->party->Capacity)
                {
                    SendSysMsg( thisclient, "Party is full" );
                    return true;
                }
            }
            CPlayer* otherclient = map->GetPlayerInMap( clientid );// have to be in same map
            if(otherclient==NULL)
            {
                BEGINPACKET( pak, 0x7d1 );
                ADDBYTE    ( pak, 0x00 );//No encontro el ID
                ADDWORD    ( pak, clientid );
                ADDBYTE    ( pak, 0x00 );
                thisclient->client->SendPacket( &pak );
                return true;
            }
            if(otherclient->Party->party!=NULL)
            {
                BEGINPACKET( pak, 0x7d1 );
                ADDBYTE    ( pak, 0x01 );//No puede ser solicitado (ya tiene party)
                ADDWORD    ( pak, clientid );
                ADDBYTE    ( pak, 0x00 );
                thisclient->client->SendPacket( &pak );
                return true;
            }
            if(abs(otherclient->Stats->Level-thisclient->Stats->Level)>(Config.Partygap+1))
            {
                BEGINPACKET( pak, 0x7d1 );
                ADDBYTE    ( pak, 0x07 );//Level inapropiado
                ADDWORD    ( pak, clientid );
                ADDBYTE    ( pak, 0x00 );
                thisclient->client->SendPacket( &pak );
                return true;
            }
            BEGINPACKET( pak, 0x7d0 );
            ADDBYTE    ( pak, action );
            ADDWORD    ( pak, thisclient->clientid );
            ADDBYTE    ( pak, 0x00 );
            otherclient->client->SendPacket( &pak );
        }
        break;
        case 0x02://Leave Party
        {
            if(thisclient->Party->party==NULL)
                return true;
            CParty* party = thisclient->Party->party;
            BEGINPACKET( pak, 0x7d2 );
            ADDWORD    ( pak, 0xff00 );
            ADDDWORD   ( pak, thisclient->CharInfo->charid );
            bool pflag = false;
            if(!party->RemovePlayer( thisclient )) //if this player is not in this party
                return true;
            if(party->Members.size()>1)
            {
                for(UINT i=0;i<party->Members.size();i++)
                {
                    CPlayer* thismember = party->Members.at(i);
                    if(!pflag)
                    {
                        ADDDWORD( pak, thismember->CharInfo->charid );
                        if(thisclient->Party->IsMaster)
                            thismember->Party->IsMaster = true;
                        pflag = true;
                    }
                    thismember->client->SendPacket( &pak );
                }
            }
            else
            {
                for(UINT i=0;i<party->Members.size();i++)
                {
                    CPlayer* thismember = party->Members.at(i);
                    BEGINPACKET( pak, 0x7d1 );
                    ADDBYTE    ( pak, 0x05 );
                    ADDWORD    ( pak, 0x0000 );
                    ADDWORD    ( pak, 0x0000 );
                    thismember->client->SendPacket( &pak );
                    thismember->Party->party = NULL;
                    thismember->Party->IsMaster = true;
                }
                RemoveParty( party );
                delete party;
            }
        }
        break;
        case 0x03: //Tomiz: Give leader New Way
        {
            if(thisclient->Party->party==NULL)
                return true;

            unsigned int clientid = GETWORD((*P),1);

            if ( !thisclient->Party->IsMaster || clientid == thisclient->clientid )
               return true;

            CPlayer* otherclient = GetClientByID( clientid );
            if(otherclient==NULL)
                return true;

            BEGINPACKET(pak, 0x7d1);
            ADDBYTE(pak, 8);
            ADDWORD(pak, otherclient->clientid);
            ADDWORD(pak, 0);
            otherclient->Party->IsMaster = true;
            thisclient->Party->IsMaster = false;
            thisclient->Party->party->SendToMembers( &pak );
        }
        break;
        case 0x81: //Kick from party
        {
            unsigned int charid = GETDWORD((*P),1);
            if(thisclient->Party->party==NULL)
                return true;
            if(!thisclient->Party->IsMaster || thisclient->CharInfo->charid==charid)
                return true;
            CParty* party = thisclient->Party->party;
            CPlayer* thismember = party->GetMemberByCharID( charid );
            if(thismember==NULL)
                return true;

            BEGINPACKET( pak, 0x7d1 ); // Kicked from party message
            ADDBYTE    ( pak, 0x80 );
            ADDDWORD   ( pak, thismember->CharInfo->charid );
            thismember->client->SendPacket( &pak );
            RESETPACKET( pak, 0x7d2 );
            ADDWORD    ( pak, 0xff00 );
            ADDDWORD   ( pak, thismember->CharInfo->charid );
            bool pflag = false;
            if(!party->RemovePlayer( thismember )) //if this player is not in this party
                return true;
            if(party->Members.size()>1)
            {
                for(UINT i=0;i<party->Members.size();i++)
                {
                    CPlayer* othermember = party->Members.at(i);
                    if(!pflag)
                    {
                        ADDDWORD( pak, othermember->CharInfo->charid );
                        if(thismember->Party->IsMaster)
                            othermember->Party->IsMaster = true;
                        pflag = true;
                    }
                    othermember->client->SendPacket( &pak );
                }
            }
            else
            {
                for(UINT i=0;i<party->Members.size();i++)
                {
                    CPlayer* othermember = party->Members.at(i);
                    BEGINPACKET( pak, 0x7d1 );
                    ADDBYTE    ( pak, 0x05 );
                    ADDWORD    ( pak, 0x0000 );
                    ADDWORD    ( pak, 0x0000 );
                    othermember->client->SendPacket( &pak );
                    othermember->Party->party = NULL;
                    othermember->Party->IsMaster = true;
                }
                RemoveParty( party );
                delete party;
            }
        }
        break;
        default:
            Log(MSG_WARNING,"Party unknown action: %i", action);
    }
    return true;
}
示例#30
0
文件: clan.cpp 项目: osROSE/osrose
// Clan Manager
bool CWorldServer::pakClanManager ( CPlayer* thisclient, CPacket* P )
{    
    int action = GETBYTE((*P),0);
    switch(action)
    {
        case 0xf0:
        {
            MYSQL_ROW row;                
            int charid = GETWORD((*P),1);
            int clanid = GETWORD((*P),3);        
            CPlayer* otherclient = GetClientByCID ( charid );
            if(otherclient==NULL)
                return true;
    	    MYSQL_RES *result = DB->QStore("SELECT logo,back,name,grade FROM list_clan where id=%i", clanid);
    	    if(result==NULL) return true;
        	if(mysql_num_rows(result)!=1)
        	{
                Log(MSG_WARNING, "Invalid clan %i", clanid );
                DB->QFree( );
          	    return true;
            }
            row = mysql_fetch_row(result);
        	otherclient->Clan->logo = atoi(row[0]);
    	    otherclient->Clan->back = atoi(row[1]);    	   
    	    strcpy(otherclient->Clan->clanname,row[2]);
    	    otherclient->Clan->grade = atoi(row[3]);
        	DB->QFree( );
            BEGINPACKET( pak, 0x7e0 );
            ADDBYTE    ( pak, 0x35 );//funcion
            ADDWORD    ( pak, otherclient->clientid );//cleint id
            ADDWORD    ( pak, clanid );//?
            ADDWORD    ( pak, 0x0000 );//?
            ADDWORD    ( pak, otherclient->Clan->back );//?
            ADDWORD    ( pak, otherclient->Clan->logo );//?
            ADDBYTE    ( pak, otherclient->Clan->grade );
            ADDBYTE    ( pak, otherclient->Clan->clanrank);
            ADDSTRING  ( pak, otherclient->Clan->clanname );            
            ADDBYTE    ( pak, 0x00 );  
            SendToVisible( &pak, otherclient );
            Log(MSG_INFO,"[WS] pakClanManager 0x7e0, case 0xf0 (new member too?) %s",otherclient->CharInfo->charname);
        }
        case 0xfa://new member added
        {
        	MYSQL_ROW row;                
            int charid = GETWORD((*P),1);
            int clanid = GETWORD((*P),3);        
            CPlayer* otherclient = GetClientByCID ( charid );
            if(otherclient==NULL)
                return true;
    	    MYSQL_RES *result = DB->QStore("SELECT logo,back,name,grade FROM list_clan where id=%i", clanid);
    	    if(result==NULL) return true;
        	if(mysql_num_rows(result)!=1)
        	{
                Log(MSG_WARNING, "Invalid clan %i", clanid );
                DB->QFree( );
          	    return true;
            }
            row = mysql_fetch_row(result);
        	otherclient->Clan->logo = atoi(row[0]);
    	    otherclient->Clan->back = atoi(row[1]);    	   
    	    strcpy(otherclient->Clan->clanname,row[2]);
    	    otherclient->Clan->grade = atoi(row[3]);
        	DB->QFree( );   
            otherclient->Clan->clanid=clanid;
            otherclient->Clan->clanrank=1;
            BEGINPACKET( pak, 0x7e0 );
            ADDBYTE    ( pak, 0x35 );//funcion
            ADDWORD    ( pak, otherclient->clientid );//cleint id
            ADDWORD    ( pak, clanid );//?
            ADDWORD    ( pak, 0x0000 );//?
            ADDWORD    ( pak, otherclient->Clan->back );//?
            ADDWORD    ( pak, otherclient->Clan->logo );//?
            ADDBYTE    ( pak, otherclient->Clan->grade );
            ADDBYTE    ( pak, otherclient->Clan->clanrank );
            ADDSTRING  ( pak, otherclient->Clan->clanname );
            ADDBYTE    ( pak, 0x00 );  
            SendToVisible( &pak, otherclient );
            Log(MSG_INFO,"[WS] pakClanManager 0x7e0, new member %s",otherclient->CharInfo->charname);
        }
        break;
        case 0xfb://Member Kicked
        {
           char nick[30];
           memcpy( nick, &P->Buffer[1], P->Size );    
           CPlayer* otherclient = GetClientByCharName( nick );
           if(otherclient!=NULL)
           {
                otherclient->Clan->clanid=0;
                otherclient->Clan->clanrank=1;
	            otherclient->Clan->back=0;
	            otherclient->Clan->logo=0;
	            otherclient->Clan->grade=0;
	            strcpy(otherclient->Clan->clanname,"");
                BEGINPACKET( pak, 0x7e0 );
                ADDBYTE    ( pak, 0x35 );
                ADDWORD    ( pak, otherclient->clientid );
                ADDQWORD   ( pak, 0 );
                ADDWORD    ( pak, 0x0001 );
                SendToVisible( &pak, otherclient );
                Log(MSG_INFO,"[WS] pakClanManager 0x7e0, member kicked, %s",nick);
           }                    
        }
        break;
        case 0xfc://member change rank
        {
           char nick[30];
           int newrank = GETBYTE((*P),1);
           memcpy( nick, &P->Buffer[2], P->Size );    
           CPlayer* otherclient = GetClientByCharName( nick );
           if(otherclient!=NULL)
           {
                otherclient->Clan->clanrank = newrank;
                Log(MSG_INFO,"[WS] pakClanManager 0x7e0, change rank for %s to %i",nick,newrank);
           }           
        }
        break;      
        case 0xfd://disorg
        {
            unsigned int clanid = GETWORD((*P),1);
            unsigned int charid = GETWORD((*P),3);
            CPlayer* tclient = GetClientByCID( charid );
            if(tclient==NULL)
                return true;
            tclient->Clan->clanid = 0;
            tclient->Clan->clanrank = 1;
            tclient->Clan->grade = 0;
            tclient->Clan->back = 0;
            tclient->Clan->logo = 0;
            memset( &tclient->Clan->clanname, '\0', 17 );
            BEGINPACKET( pak, 0x7e0 );
            ADDBYTE    ( pak, 0x35 );
            ADDWORD    ( pak, tclient->clientid );
            ADDQWORD   ( pak, 0 );
            ADDWORD    ( pak, 0x0001 );
            SendToVisible( &pak, tclient );
            Log(MSG_INFO,"[WS] pakClanManager 0x7e0, disorg");                           
        }
        break;  
        case 0xfe://Member Leave
        {
           char nick[17];
           memcpy( nick, &P->Buffer[1], P->Size );    
           CPlayer* otherclient = GetClientByCharName(nick);
           if(otherclient!=NULL)
           {
                otherclient->Clan->clanid=0;
                otherclient->Clan->clanrank=0;
	            otherclient->Clan->back=0;
	            otherclient->Clan->logo=0;
	            otherclient->Clan->grade=0;
	            strcpy(otherclient->Clan->clanname,"");
                BEGINPACKET( pak, 0x7e0 );
                ADDBYTE    ( pak, 0x35 );
                ADDWORD    ( pak, otherclient->clientid );
                ADDQWORD   ( pak, 0 );
                ADDWORD    ( pak, 0x0001 );
                SendToVisible( &pak, otherclient );
                Log(MSG_INFO,"[WS] pakClanManager 0x7e0, member left");	                            
           }                    
        }
        break;    
        case 0xff: // update clan mark
        {    
            unsigned int clanid = GETWORD((*P),1);
            unsigned int clanlogo = GETDWORD((*P), 3 );   
            for(unsigned int i=0;i<ClientList.size();i++)
            {
                if(ClientList.at(i)->player==NULL) continue;
                CPlayer* player = (CPlayer*)ClientList.at(i)->player;
                if(player->Clan->clanid==clanid)
                {
                    player->Clan->back = 0;
                    player->Clan->logo = clanlogo;
                    BEGINPACKET( pak, 0x7e0 );
                    ADDBYTE    ( pak, 0x35 );//funcion
                    ADDWORD    ( pak, player->clientid );//cleint id
                    ADDWORD    ( pak, clanid );//?
                    ADDWORD    ( pak, 0x0000 );//?
                    ADDWORD    ( pak, player->Clan->back );//?
                    ADDWORD    ( pak, player->Clan->logo );//?
                    ADDBYTE    ( pak, player->Clan->grade );
                    ADDBYTE    ( pak, player->Clan->clanrank );
                    ADDSTRING  ( pak, player->Clan->clanname );                    
                    ADDBYTE    ( pak, 0x00 );  
                    SendToVisible( &pak, player );   
                    Log(MSG_INFO,"[WS] pakClanManager 0x7e0, update clan mark");
                }
            }                 
        }
        break;
        default:
            Log( MSG_INFO, "Clan manager unknown action %i", action );
    }
    return true;
}