[Release] Shop System ala Offi

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [Release] Shop System ala Offi

      Ihr kennt sicherlich das Shop System von Offi, das wenn man ein Item kauft und Online ist, dieses dann direkt Ingame bekommt.

      Dies funktioniert natürlich mit der OnBuyingInfo funktion, nun werdet ihr sagen, das diese eh buggy ist und ihr diese darum gelöscht habt.

      Ich werde euch zeigen, wie ihr da ein Passwort reinhaut, das es sicher wird und ihr es mit dem Shop System von Teachery benutzen könnt.

      Als erstes öffnen wir die Source und gehen zur OnBuyingInfo funktion im WorldServer.

      Quellcode

      1. void CDPSrvr::OnBuyingInfo( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
      2. {
      3. BUYING_INFO2 bi2;
      4. ar.Read( (void*)&bi2, sizeof(BUYING_INFO2) );
      5. CWorld* pWorld;
      6. CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
      7. SERIALNUMBER iSerialNumber = 0;
      8. bi2.dwRetVal = 0;
      9. CItemElem itemElem;
      10. itemElem.m_dwItemId = bi2.dwItemId;
      11. itemElem.m_nItemNum = (short)bi2.dwItemNum;
      12. itemElem.m_bCharged = TRUE;
      13. BYTE nId;
      14. string CheckPw;
      15. CheckPw = "[COLOR=Red]8b8d0c753894b018ce454b2e[/COLOR]";
      16. if( IsValidObj( pUser ) && ( pWorld = pUser->GetWorld() ) )
      17. {
      18. if( bi2.szBxaid == CheckPw ){
      19. bi2.dwRetVal = pUser->CreateItem( &itemElem, &nId );
      20. char message[255];
      21. sprintf( message, "You received %s", itemElem.GetName() );
      22. pUser->AddText( message );
      23. }
      24. #ifdef __LAYER_1015
      25. g_dpDBClient.SavePlayer( pUser, pWorld->GetID(), pUser->GetPos(), pUser->GetLayer() );
      26. #else // __LAYER_1015
      27. g_dpDBClient.SavePlayer( pUser, pWorld->GetID(), pUser->GetPos() );
      28. #endif // __LAYER_1015
      29. if( bi2.dwRetVal )
      30. {
      31. CItemElem* pItemElem = pUser->m_Inventory.GetAtId( nId );
      32. if( pItemElem )
      33. {
      34. iSerialNumber = pItemElem->GetSerialNumber();
      35. pItemElem->m_bCharged = TRUE;
      36. if( bi2.dwSenderId > 0 )
      37. {
      38. // %sÀ» %s´ÔÀ¸·ÎºÎÅÍ ¼±¹° ¹Þ¾Ò½À´Ï´Ù.
      39. }
      40. }
      41. }
      42. else
      43. {
      44. LogItemInfo aLogItem;
      45. aLogItem.Action = "S";
      46. aLogItem.SendName = pUser->GetName();
      47. aLogItem.WorldId = pUser->GetWorld()->GetID();
      48. aLogItem.Gold = aLogItem.Gold2 = pUser->GetGold();
      49. g_dpDBClient.SendQueryPostMail( pUser->m_idPlayer, 0, itemElem, 0, "", "" );
      50. aLogItem.RecvName = "HOMEPAGE_SHOP";
      51. g_DPSrvr.OnLogItem( aLogItem, &itemElem, itemElem.m_nItemNum );
      52. }
      53. }
      54. g_dpDBClient.SendBuyingInfo( &bi2, iSerialNumber );
      55. static char lpOutputString[260] = { 0, };
      56. sprintf( lpOutputString, "dwServerIndex = %d\tdwPlayerId = %d\tdwItemId = %d\tdwItemNum = %d",
      57. bi2.dwServerIndex, bi2.dwPlayerId, bi2.dwItemId, bi2.dwItemNum );
      58. OutputDebugString( lpOutputString );
      59. }
      Alles anzeigen
      Das Rot makierte wäre euer Passwort, womit ihr das ganze absichert.
      Wenn ein User versucht sich ein Item mit der Funktion zu erstellen und das PW falsch ist, dann wird daraus nichts und er wird gelogged.

      Ich hab auch eine sicherung eingebaut, dass wenn das Inventar voll ist, man alles per Post zugeschickt bekommt, dies geht dann auch ohne relog.

      Dies war der Part im Source, zur anmerkung, das PW, was ihr da auswählt, muss exakt 24 stellen lang sein.

      Kommen wir dann zum Part im Shop von Teacher.
      Dazu öffnet ihr die functions.php, welche sich im inc ordner normalerweise befinden sollte und sucht nach:

      PHP-Quellcode

      1. function giftItem($itemid, $itemname, $itemcount, $player_to)
      Ihr ändert die ganze funktion dann in das hier:

      PHP-Quellcode

      1. function giftItem($itemid, $itemname, $itemcount, $player_to)
      2. {
      3. global $sindex, $player, $mssql_db;
      4. $user_online=mssql_query("SELECT [MultiServer] FROM [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [m_idPlayer] = {$player_to}");
      5. $ison=mssql_fetch_array($user_online);
      6. if( $ison['MultiServer'] != 0 ){
      7. $Server_IP = '127.0.0.1';
      8. $m_idPlayer = (INT)$player_to;
      9. $ItemIDa = $itemid;
      10. $ItemCnt = $itemcount;
      11. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      12. $packet = pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);
      13. if(socket_connect($socket, $Server_IP, 29000))
      14. socket_write($socket, $packet, strlen($packet));
      15. socket_close($socket);
      16. $return = 1;
      17. }else{
      18. mssql_select_db($mssql_db['character']);
      19. $stmt = mssql_init('shopSendItem');
      20. mssql_bind($stmt, '@m_idPlayer', $player_to, SQLCHAR);
      21. mssql_bind($stmt, '@serverindex', $sindex, SQLCHAR);
      22. mssql_bind($stmt, '@item_name', $itemname, SQLTEXT);
      23. mssql_bind($stmt, '@item_count', $itemcount, SQLINT1);
      24. mssql_bind($stmt, '@item_id', $itemid, SQLINT1);
      25. mssql_bind($stmt, '@m_idSender', $player, SQLCHAR);
      26. $return = mssql_execute($stmt);
      27. mssql_free_statement($stmt);
      28. }
      29. return $return;
      30. }
      Alles anzeigen
      Dort findet ihr dann auch das PW, welches auch genau 24 stellen lang sein muss und genau das selbe wie im source sein muss.
      Den Port 29000 solltet ihr am besten in iwas anderes ändern (auch im source)

      Nun suchen wir nach der funktion:

      PHP-Quellcode

      1. function sendItem($itemid, $itemname, $itemcount)
      Und ändern das ganze in:

      PHP-Quellcode

      1. function sendItem($itemid, $itemname, $itemcount)
      2. {
      3. global $player, $sindex, $mssql_db;
      4. $user_online=mssql_query("SELECT [MultiServer] FROM [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [m_idPlayer] = {$player}");
      5. $ison=mssql_fetch_array($user_online);
      6. if( $ison['MultiServer'] != 0 ){
      7. $Server_IP = '127.0.0.1';
      8. $m_idPlayer = (INT)$player;
      9. $ItemIDa = $itemid;
      10. $ItemCnt = $itemcount;
      11. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      12. $packet = pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);
      13. if(socket_connect($socket, $Server_IP, 29000))
      14. socket_write($socket, $packet, strlen($packet));
      15. socket_close($socket);
      16. $return = 1;
      17. }else{
      18. mssql_select_db($mssql_db['character']);
      19. $stmt = mssql_init('shopSendItem');
      20. mssql_bind($stmt, '@m_idPlayer', $player, SQLCHAR);
      21. mssql_bind($stmt, '@serverindex', $sindex, SQLCHAR);
      22. mssql_bind($stmt, '@item_name', $itemname, SQLTEXT);
      23. mssql_bind($stmt, '@item_count', $itemcount, SQLINT1);
      24. mssql_bind($stmt, '@item_id', $itemid, SQLINT1);
      25. $return = mssql_execute($stmt);
      26. mssql_free_statement($stmt);
      27. }
      28. return $return;
      29. }
      Alles anzeigen
      Dort findet ihr dann auch das PW, welches auch genau 24 stellen lang sein muss und genau das selbe wie im source sein muss.
      Den Port 29000 solltet ihr am besten in iwas anderes ändern (auch im source)

      =================

      Und nun habt ihr das Shop system so bearbeitet, das man Items einkaufen kann und sich nicht mehr dafür ausloggen/reloggen muss.

      Edit: Den Port 29000, oder was ihr da nehmt, müsst ihr nicht nach außen freigeben, da php ServerSided ist und es so funktioniert.

      Credits: Sedrika
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )