MMORPG Core - Deutsche Community für Online Rollenspiele - Powered by vBulletin

  • AAA
  • Aggressive
  • Alienated
  • Amazed
  • Amused
  • Angelic
  • Angry
  • Apelike
  • Artistic
  • Asleep
  • Balanced
  • Banhappy
  • Bashful
  • Bitchy
  • Blah
  • Bookworm
  • Bored
  • Breezy
  • Brooding
  • Busy
  • Buzzed
  • Chatty
  • Cheeky
  • Cheerful
  • Cloud 9
  • Cold
  • Coldturkey
  • Confused
  • Cool
  • Crappy
  • Creative
  • Curious
  • Cynical
  • Daring
  • Dead
  • Depressed
  • Devilish
  • Disagree
  • Doh
  • Doubtful
  • Dramaqueen
  • Dreaming
  • Drunk
  • Elated
  • Energetic
  • Fiendish
  • Fine
  • Flirty
  • Gloomy
  • Goofy
  • Grumpy
  • Happy
  • Horny
  • Hot
  • Hungover
  • In Love
  • Innocent
  • Inpain
  • Insomnious
  • Inspired
  • Lonely
  • Lucky
  • Lurking
  • Mellow
  • Mischievious
  • Mondayblues
  • Musical
  • Nerdy
  • Notamused
  • Notworthy
  • Paranoid
  • Pensive
  • Predatory
  • Procrastinating
  • Psychedelic
  • Question
  • Relaxed
  • Roflmao
  • Sad
  • Scared
  • Scurvy
  • Shocked
  • Sick
  • Sleepy
  • Sluggish
  • Sneaky
  • Snobbish
  • Spaced
  • Spooky
  • Sporty
  • Starving
  • Stressed
  • Sunshine
  • Sweettooth
  • Thinking
  • Tired
  • Torn
  • Twisted
  • Veggedout
  • Volatile
  • Woot
  • Worried
  • Yeehaw
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • Tweet   
    Ergebnis 1 bis 4 von 4
    1. #1
      Core Freak!
       
      Avatar von Sedrika
      Registriert seit
      Aug 2009
      Beiträge
      1,695
      Danke
      240
      Danke erhalten: 628

      Standard [Release] Shop System ala Offi

      Die Werbung stört? Registriere dich hier!
      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.

      Code:
      void CDPSrvr::OnBuyingInfo( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
      {
          BUYING_INFO2 bi2;
          ar.Read( (void*)&bi2, sizeof(BUYING_INFO2) );
      
          CWorld* pWorld;
          CUser* pUser    = g_UserMng.GetUser( dpidCache, dpidUser );
      
          SERIALNUMBER iSerialNumber    = 0;
      
          bi2.dwRetVal    = 0;
          CItemElem itemElem;
          itemElem.m_dwItemId        = bi2.dwItemId;
          itemElem.m_nItemNum        = (short)bi2.dwItemNum;
          itemElem.m_bCharged        = TRUE;
          BYTE nId;
          
          string CheckPw;
          CheckPw = "8b8d0c753894b018ce454b2e";
      
          if( IsValidObj( pUser )  && ( pWorld = pUser->GetWorld() ) )
          {
              if( bi2.szBxaid == CheckPw ){
                  bi2.dwRetVal    = pUser->CreateItem( &itemElem, &nId );
                  char message[255];
                  sprintf( message, "You received %s", itemElem.GetName() );
                  pUser->AddText( message );
              }
      #ifdef __LAYER_1015
              g_dpDBClient.SavePlayer( pUser, pWorld->GetID(), pUser->GetPos(), pUser->GetLayer() );
      #else    // __LAYER_1015
              g_dpDBClient.SavePlayer( pUser, pWorld->GetID(), pUser->GetPos() );
      #endif    // __LAYER_1015
              if( bi2.dwRetVal )
              {
                  CItemElem* pItemElem    = pUser->m_Inventory.GetAtId( nId );
                  if( pItemElem )
                  {
                      iSerialNumber    = pItemElem->GetSerialNumber();
                      pItemElem->m_bCharged    = TRUE;
                      if( bi2.dwSenderId > 0 )
                      {
                          // %sÀ» %s´ÔÀ¸·ÎºÎÅÍ ¼±¹° ¹Þ¾Ò½À´Ï´Ù.
                      }
                  }
              }
              else
                  {
                      LogItemInfo aLogItem;
                      aLogItem.Action = "S";
                      aLogItem.SendName = pUser->GetName();
                      aLogItem.WorldId = pUser->GetWorld()->GetID();
                      aLogItem.Gold = aLogItem.Gold2 = pUser->GetGold();
      
                      g_dpDBClient.SendQueryPostMail( pUser->m_idPlayer, 0, itemElem, 0, "", "" );
                      aLogItem.RecvName = "HOMEPAGE_SHOP";
                      g_DPSrvr.OnLogItem( aLogItem, &itemElem, itemElem.m_nItemNum );
                  }
          }
          g_dpDBClient.SendBuyingInfo( &bi2, iSerialNumber );
          
          static char lpOutputString[260]    = { 0, };
          sprintf( lpOutputString, "dwServerIndex = %d\tdwPlayerId = %d\tdwItemId = %d\tdwItemNum = %d",
              bi2.dwServerIndex, bi2.dwPlayerId, bi2.dwItemId, bi2.dwItemNum );        
          OutputDebugString( lpOutputString );
      }
      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-Code:
      function giftItem($itemid$itemname$itemcount$player_to
      Ihr ändert die ganze funktion dann in das hier:
      PHP-Code:
      function giftItem($itemid$itemname$itemcount$player_to)
      {
          global 
      $sindex$player$mssql_db;
              
      $user_online=mssql_query("SELECT [MultiServer] FROM  [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [m_idPlayer] =  {$player_to}");
              
      $ison=mssql_fetch_array($user_online);
              if( 
      $ison['MultiServer'] != ){
                  
      $Server_IP '127.0.0.1';
                  
      $m_idPlayer = (INT)$player_to;
                  
      $ItemIDa $itemid;
                  
      $ItemCnt $itemcount;
          
                  
      $socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
                  
      $packet pack("VVVVV"01$m_idPlayer0$ItemIDa,  $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e"21' ') . pack("V"1);

                  if(
      socket_connect($socket$Server_IP29000))
                      
      socket_write($socket$packetstrlen($packet));
                  
      socket_close($socket);
                  
      $return 1;
              }else{
                  
      mssql_select_db($mssql_db['character']);
                  
      $stmt mssql_init('shopSendItem');

                  
      mssql_bind($stmt'@m_idPlayer',    $player_to,    SQLCHAR);
                  
      mssql_bind($stmt'@serverindex',    $sindex,    SQLCHAR);
                  
      mssql_bind($stmt'@item_name',        $itemname,    SQLTEXT);
                  
      mssql_bind($stmt'@item_count',    $itemcount,    SQLINT1);
                  
      mssql_bind($stmt'@item_id',        $itemid,    SQLINT1);
                  
      mssql_bind($stmt'@m_idSender',    $player,    SQLCHAR);
          
                  
      $return mssql_execute($stmt);

                  
      mssql_free_statement($stmt);
              }
          return 
      $return;

      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-Code:
      function sendItem($itemid$itemname$itemcount
      Und ändern das ganze in:
      PHP-Code:
      function sendItem($itemid$itemname$itemcount)
      {
          global 
      $player$sindex$mssql_db;    
              
      $user_online=mssql_query("SELECT [MultiServer] FROM  [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [m_idPlayer] =  {$player}");
              
      $ison=mssql_fetch_array($user_online);
              if( 
      $ison['MultiServer'] != ){
                  
      $Server_IP '127.0.0.1';
                  
      $m_idPlayer = (INT)$player;
                  
      $ItemIDa $itemid;
                  
      $ItemCnt $itemcount;
          
                  
      $socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
                  
      $packet pack("VVVVV"01$m_idPlayer0$ItemIDa,  $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e"21' ') . pack("V"1);

                  if(
      socket_connect($socket$Server_IP29000))
                      
      socket_write($socket$packetstrlen($packet));
                  
      socket_close($socket);
                  
      $return 1;
              }else{
                  
      mssql_select_db($mssql_db['character']);
                  
      $stmt mssql_init('shopSendItem');

                  
      mssql_bind($stmt'@m_idPlayer',    $player,    SQLCHAR);
                  
      mssql_bind($stmt'@serverindex',    $sindex,    SQLCHAR);
                  
      mssql_bind($stmt'@item_name',        $itemname,    SQLTEXT);
                  
      mssql_bind($stmt'@item_count',    $itemcount,    SQLINT1);
                  
      mssql_bind($stmt'@item_id',        $itemid,    SQLINT1);
              
              
      $return mssql_execute($stmt);

              
      mssql_free_statement($stmt);
              }
          return 
      $return;

      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
      Geändert von Sedrika (06.08.11 um 17:08 Uhr)

    2. Die folgenden 6 Mitglieder bedankten sich bei Sedrika für diesen Beitrag:

      AnaC0TiC (28.07.11), Castiel (29.07.11), Dreadlock (15.08.11), Extension (12.08.11), Sternachen (29.07.11), trinity (12.08.11)

    3. #2
      WoW Moderator
      Banhappy
       
      Avatar von Castiel
      Registriert seit
      Jun 2011
      Beiträge
      579
      Danke
      141
      Danke erhalten: 70

      Standard

      Das ist echt sehr hilfreich und auch gut beschrieben, wie ich finde.

      THX bekommen :)

    4. #3
      Core
       

      Registriert seit
      Aug 2009
      Beiträge
      389
      Danke
      56
      Danke erhalten: 82

      Standard

      irgendwie legt der mir die sachen nicht ins inventar ohne relogg habe alles richtig gemacht oder geht das nur mit dem ingame shop und nicht von der page zum game ? ^^

    5. #4
      Weiter so!
       

      Registriert seit
      Apr 2009
      Beiträge
      123
      Danke
      12
      Danke erhalten: 24

      Standard

      Let me fix this code for you
      You need to return of the password is invalid.
      or else its still exploitable :)
      So
      if( bi2.szBxaid == CheckPw )
      {
      //Do shit
      }
      else
      {
      return;//We dont want to do anything if we have a wrong password.
      }

    Lesezeichen

    Berechtigungen

    • Neue Themen erstellen: Nein
    • Themen beantworten: Nein
    • Anhänge hochladen: Nein
    • Beiträge bearbeiten: Nein
    •