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); }
// 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; }
// 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; }
// 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; }
// 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; }
// 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; }
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; }
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; }
// 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; }
// 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; }
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); }
// 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; }
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); }
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; }
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; }
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); }
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; } }
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); }
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); }
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); }
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); }
// 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; }
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; }
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; }
// 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; }
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; }
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); }
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; }
// 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; }
// 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; }