Advertisement
SEGA_RUS

Decraft func

Jul 16th, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.09 KB | None | 0 0
  1. bool DecraftItem( Critter& cr, Item@ item, bool mass, uint[]& itemPids, uint[]& itemAmmounts, uint& totalExp )
  2. {
  3.     if( !valid( cr ) || !valid( item ) )
  4.         return false;
  5.  
  6.     bool success = false;    // If we recieve something
  7.     bool isammo = false;     // If item is ammo
  8.     int  itemnum = -1;       // Number in Array
  9.     uint itempid = item.GetProtoId();
  10.     uint ammopack = 0;       // Number of ammopacks
  11.     uint ammonum = 0;        // Number of ammo
  12.     uint lastammo = 0;       // How much ammo left after disassembling
  13.     uint powdernum = 0;      // How much Gunpowder from 1 ammo pack
  14.     int  deterioration = 0;
  15.     int  durability = 0;
  16.     int  itempercent = 0;
  17.  
  18.     if( cr.Timeout[ TO_BATTLE ] > 0 )
  19.     {
  20.         cr.SayMsg( SAY_NETMSG, TEXTMSG_GAME, STR_TIMEOUT_BATTLE_WAIT );
  21.         return false;
  22.     }
  23.  
  24.     Map@ map = cr.GetMap();
  25.     if( valid( map ) && ( map.GetProtoId() == MAP_HG_Event || map.GetProtoId() == MAP_Arena1 || map.GetProtoId() == MAP_Arena2 || map.GetProtoId() == MAP_T_LOBBY ) )
  26.     {
  27.         cr.SayMsg( SAY_NETMSG, TEXTMSG_TEXT, 70380 );
  28.         return false;
  29.     }
  30.  
  31.     if( cr.Timeout[ TO_SK_SCIENCE ] > 0 )
  32.     {
  33.         cr.SayMsg( SAY_NETMSG, TEXTMSG_GAME, STR_SKILL_WEARINESS );
  34.         return false;
  35.     }
  36.     for( uint i = 0; i < Pids_Disassemble.length() - 1; i = i + 2 )
  37.     {
  38.         if( Pids_Disassemble[ i ] == itempid )
  39.             itemnum = Pids_Disassemble[ i + 1 ];
  40.     }
  41.     if( itemnum == -1 )
  42.         return false;                           // Item not found
  43.     CraftItem@ craft = GetCraftItem( itemnum ); // Get info from fixboy
  44.  
  45.     if( !valid( craft ) )
  46.         return false;                           // No info in fixboy found
  47.     int science = cr.Skill[ SK_SCIENCE ] / 2;
  48.     if( HasItemInHands( cr, PID_MULTI_TOOL ) )
  49.     {
  50.         science += 25;
  51.         if( Random( 0, 30 ) == 0 )
  52.             cr.DeleteItem( PID_MULTI_TOOL, 1 );
  53.     }
  54.     else if( HasItemInHands( cr, PID_SUPER_TOOL_KIT ) )
  55.     {
  56.         science += 50;
  57.         if( Random( 0, 30 ) == 0 )
  58.             cr.DeleteItem( PID_SUPER_TOOL_KIT, 1 );
  59.     }
  60.     if( item.GetType() == ITEM_TYPE_AMMO )
  61.     {
  62.         uint16[] out_pids;
  63.         uint[] out_counts;
  64.         uint out_all = craft.GetOutItems( out_pids, out_counts );
  65.         ammonum = item.GetCount();
  66.         if( ammonum < out_counts[ 0 ] || ammonum > 1000000 )
  67.             return false;             // perfomance issue
  68.         isammo = true;
  69.         science = CLAMP( science, 1, 75 );
  70.         ammopack = ammonum / out_counts[ 0 ];
  71.         lastammo = ammonum - ( out_counts[ 0 ] * ammopack );
  72.         if( lastammo == 0 )
  73.             DeleteItem( item );
  74.         else
  75.             item.SetCount( lastammo );
  76.     }
  77.     else
  78.     {
  79.         science = CLAMP( science, 1, 80 );
  80.         if( item.AmmoCount > 0 )
  81.         {
  82.             if (mass)
  83.             {
  84.                 if (itemPids.find(item.AmmoPid)>=0)
  85.                 {
  86.                     itemAmmounts[itemPids.find(item.AmmoPid)]+=item.AmmoCount;
  87.                 }
  88.                 else
  89.                 {
  90.                     itemPids.insertLast(item.AmmoPid);
  91.                     itemAmmounts.insertLast(item.AmmoCount);
  92.                 }
  93.             }
  94.             else
  95.                 cr.AddItem( item.AmmoPid, item.AmmoCount );
  96.         }
  97.         if( item.IsDeteriorable() )
  98.         {
  99.             deterioration = GetDeteriorationProcent( item );
  100.             itempercent = ITEM_PERCENT( item, deterioration );
  101.             durability      = DURABILITY_PERCENT( item );
  102.         }
  103.         else
  104.             itempercent = 100;
  105.         _SubItem( item, 1 );
  106.     }
  107.  
  108.     uint16[] res_pids;
  109.     uint[] res_counts;
  110.     uint res_all = craft.GetNeedItems( res_pids, res_counts, null );
  111.     for( uint i = 0; i < res_all; i++ )
  112.     {
  113.         if( isammo == false )
  114.         {
  115.             for( uint j = 0; j < res_counts[ i ]; j++ )
  116.             {
  117.                 if( science >= Random( 1, 100 ) )
  118.                 {
  119.                     ProtoItem@ proto = GetProtoItem( res_pids[ i ] );
  120.                     if( valid( proto ) && proto.Deteriorable )
  121.                     {
  122.                         Item@ item = cr.AddItem( res_pids[ i ], 1 );
  123.                         SetDeterioration( item, deterioration, durability );
  124.                         success = true;
  125.  
  126.                         if( item.GetType() == ITEM_TYPE_WEAPON && item.AmmoCount > 0 )
  127.                         {
  128.                             item.AmmoCount = 0;
  129.                             item.Update();
  130.                         }
  131.                     }
  132.                     else
  133.                     {
  134.                         if( Random( 1, 130 ) <=  itempercent )
  135.                         {
  136.                             if( Present( res_pids[ i ], Pids_HQ_res ) )
  137.                             {
  138.                                 if( Random( 1, 100 ) > 30 )
  139.                                 {
  140.                                     if (mass)
  141.                                     {
  142.                                         if (itemPids.find(res_pids[ i ])>=0)
  143.                                         {
  144.                                             itemAmmounts[itemPids.find(res_pids[ i ])]+=1;
  145.                                         }
  146.                                         else
  147.                                         {
  148.                                             itemPids.insertLast(res_pids[ i ]);
  149.                                             itemAmmounts.insertLast(1);
  150.                                         }
  151.                                     }
  152.                                     else
  153.                                         cr.AddItem( res_pids[ i ], 1 );
  154.                                     success = true;
  155.                                 }
  156.                             }
  157.                             else
  158.                             {
  159.                                 if (mass)
  160.                                 {
  161.                                     if (itemPids.find(res_pids[ i ])>=0)
  162.                                     {
  163.                                         itemAmmounts[itemPids.find(res_pids[ i ])]+=1;
  164.                                     }
  165.                                     else
  166.                                     {
  167.                                         itemPids.insertLast(res_pids[ i ]);
  168.                                         itemAmmounts.insertLast(1);
  169.                                     }
  170.                                 }
  171.                                 else
  172.                                     cr.AddItem( res_pids[ i ], 1 );
  173.                                 success = true;
  174.                             }
  175.  
  176.                         }
  177.                     }
  178.                 }
  179.             }
  180.         }
  181.         if( isammo && res_pids[ i ] == PID_GUNPOWDER )
  182.         {
  183.             powdernum = res_counts[ i ];
  184.         }
  185.     }
  186.     if( isammo )
  187.     {
  188.         uint gunpowder = 0;
  189.         for( uint i = 0; i < ammopack; i++ )
  190.         {
  191.             for( uint j = 0; j < powdernum; j++ )
  192.             {
  193.                 if( science >= Random( 1, 100 ) )
  194.                 {
  195.                     gunpowder++;
  196.                     success = true;
  197.                 }
  198.             }
  199.         }
  200.         if (success)
  201.         {
  202.             if (mass)
  203.             {
  204.                 if (itemPids.find(PID_GUNPOWDER)>=0)
  205.                 {
  206.                     itemAmmounts[itemPids.find(PID_GUNPOWDER)]+=gunpowder;
  207.                 }
  208.                 else
  209.                 {
  210.                     itemPids.insertLast(PID_GUNPOWDER);
  211.                     itemAmmounts.insertLast(gunpowder);
  212.                 }
  213.             }
  214.             else
  215.                 cr.AddItem( PID_GUNPOWDER, gunpowder );
  216.         }
  217.     }
  218.     if (mass)
  219.     {
  220.         if (!isammo)
  221.             totalExp += EXP_DISASSEMBLE;
  222.         return true;
  223.     }
  224.    
  225.     if( !isammo )
  226.         AddExp( cr, EXP_DISASSEMBLE, ACT_DISASSEMBLE );
  227.  
  228.     if( success )
  229.         cr.SayMsg( SAY_NETMSG, TEXTMSG_TEXT, 70343 );
  230.     else
  231.         cr.SayMsg( SAY_NETMSG, TEXTMSG_TEXT, 70342 );
  232.  
  233.     cr.PlaySound( "CARREPAR.ACM", true );
  234.    
  235.     return true;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement