Advertisement
Guest User

Untitled

a guest
Jul 14th, 2014
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.08 KB | None | 0 0
  1. --CARRYSTACKER TOGGLE (CUSTOM LIMIT) by Harfatus, Sirgoodsmoke, B1313, and hejoro
  2. --Carry multiple bags, toggleable, limitable
  3.  
  4. _debugEnabled   = false
  5. BagIcon         = "pd2_loot"
  6. _toggleCarry    =   true
  7.  
  8. if not CarryStackerSetupDone then
  9.     CarryStackerSetupDone = true
  10.    
  11.     if managers and managers.player and IntimitateInteractionExt and CarryInteractionExt then
  12.         managers.player.carry_limit = 4 -- <<< CHANGE TO YOUR DESIRE!
  13.         managers.player.carry_stack = {}
  14.         managers.player.carrystack_lastpress = 0
  15.         managers.player.drop_all_bags = false
  16.         ofuncs = {
  17.           managers_player_set_carry = managers.player.set_carry,
  18.           managers_player_drop_carry = managers.player.drop_carry,
  19.           IntimitateInteractionExt__interact_blocked = IntimitateInteractionExt._interact_blocked,
  20.           CarryInteractionExt__interact_blocked = CarryInteractionExt._interact_blocked,
  21.           CarryInteractionExt_can_select = CarryInteractionExt.can_select,
  22.         }
  23.            
  24.         function managers.player:refresh_stack_counter()
  25.             local count = #self.carry_stack + (self:is_carrying() and 1 or 0)
  26.             managers.hud:remove_special_equipment("carrystacker")
  27.             if count > 0 then
  28.                 managers.hud:add_special_equipment({id = "carrystacker", icon = BagIcon, amount = count})
  29.             end
  30.         end
  31.            
  32.         function managers.player:rotate_stack(dir)
  33.             if #managers.player.carry_stack < 1 or (#managers.player.carry_stack < 2 and not self:is_carrying()) then
  34.                 return
  35.             end
  36.             if self:is_carrying() then
  37.                 table.insert(self.carry_stack, self:get_my_carry_data())
  38.             end
  39.             if dir == "up" then
  40.                 table.insert(self.carry_stack, 1, table.remove(self.carry_stack))
  41.             else
  42.                 table.insert(self.carry_stack, table.remove(self.carry_stack, 1))
  43.             end
  44.             local cdata = table.remove(self.carry_stack)
  45.             if cdata then
  46.                 if self:is_carrying() then self:carry_discard() end
  47.                 ofuncs.managers_player_set_carry(self, cdata.carry_id, cdata.multiplier, cdata.dye_initiated, cdata.has_dye_pack, cdata.dye_value_multiplier, cdata.zipline_unit)
  48.             end
  49.         end
  50.  
  51.         -- pops an item from the stack when the player drops their carried item
  52.         function managers.player:drop_carry(zipline_unit)
  53.             ofuncs.managers_player_drop_carry(self, zipline_unit)
  54.             if #self.carry_stack > 0 then
  55.                 local cdata = table.remove(self.carry_stack)
  56.                 if cdata then
  57.                     self:set_carry(cdata.carry_id, cdata.multiplier or 1, cdata.dye_initiated, cdata.has_dye_pack, cdata.dye_value_multiplier, cdata.zipline_unit)
  58.                 end
  59.             end
  60.             self:refresh_stack_counter()
  61.             if self.drop_all_bags then
  62.                 if #self.carry_stack > 0 or self:is_carrying() then
  63.                     self:drop_carry()
  64.                 end
  65.                 self.drop_all_bags = false
  66.             end
  67.             --If carrystacker is off, then drop all but one bag if this is run
  68.             if not _toggleCarry then
  69.                 if #self.carry_stack > 0 then
  70.                     self:drop_carry()
  71.                 end
  72.             end
  73.         end
  74.  
  75.         -- saves the current item to the stack if we're already carrying something
  76.         function managers.player:set_carry(carry_id, carry_multiplier, dye_initiated, has_dye_pack, dye_value_multiplier, zipline_unit)
  77.             if self:is_carrying() and self:get_my_carry_data() then
  78.                 table.insert(self.carry_stack, self:get_my_carry_data())
  79.             end
  80.             ofuncs.managers_player_set_carry(self, carry_id, carry_multiplier, dye_initiated, has_dye_pack, dye_value_multiplier, zipline_unit)
  81.             self:refresh_stack_counter()
  82.         end
  83.  
  84.         -- new function to discard the currently carried item
  85.         function managers.player:carry_discard()
  86.             managers.hud:remove_teammate_carry_info( HUDManager.PLAYER_PANEL )
  87.             managers.hud:temp_hide_carry_bag()
  88.             self:update_removed_synced_carry_to_peers()
  89.             if self._current_state == "carry" then
  90.                 managers.player:set_player_state( "standard" )
  91.             end
  92.         end
  93.  
  94.         -- overridden to prevent blocking us from picking up a dead body
  95.         function IntimitateInteractionExt:_interact_blocked( player )
  96.             if _toggleCarry and self.tweak_data == "corpse_dispose" then
  97.                 --if managers.player:chk_body_bags_depleted() then
  98.                 --  return true, nil, "body_bag_limit_reached"
  99.                 --end
  100.                 local count = #managers.player.carry_stack + (managers.player:is_carrying() and 1 or 0)
  101.                 if managers.player.carry_limit > 0 and count == managers.player.carry_limit then
  102.                     return true
  103.                 elseif managers.player.carry_limit > 0 and count > managers.player.carry_limit then
  104.                     if not managers.player:is_carrying() then managers.player:carry_stacker() end
  105.                     managers.player:drop_carry()
  106.                     return true
  107.                 end
  108.                    
  109.                 if not managers.player:has_category_upgrade( "player", "corpse_dispose" ) then
  110.                     return true
  111.                 end
  112.                 return not managers.player:can_carry( "person" )
  113.             end
  114.            
  115.             if self.tweak_data == "hostage_convert" then
  116.                 return not (managers.player:has_category_upgrade( "player", "convert_enemies" ) and not managers.player:chk_minion_limit_reached() )
  117.             elseif self.tweak_data == "corpse_dispose" and not managers.player.carry_stack then
  118.                 if not managers.player:has_category_upgrade( "player", "corpse_dispose" ) or managers.player:is_carrying() then
  119.                     return true
  120.                 end
  121.                 return not managers.player:can_carry( "person" )
  122.             else
  123.                 return ofuncs.IntimitateInteractionExt__interact_blocked(self, player)
  124.             end    
  125.         end
  126.  
  127.         -- overridden to always allow us to pick up a carry item
  128.         function CarryInteractionExt:_interact_blocked( player )
  129.             if _toggleCarry then
  130.                 local count = #managers.player.carry_stack + (managers.player:is_carrying() and 1 or 0)
  131.                 if managers.player.carry_limit > 0 and count == managers.player.carry_limit then
  132.                     return true
  133.                 elseif managers.player.carry_limit > 0 and count > managers.player.carry_limit then
  134.                     if not managers.player:is_carrying() then managers.player:carry_stacker() end
  135.                     managers.player:drop_carry()
  136.                     return true
  137.                 end
  138.                 return not managers.player:can_carry( self._unit:carry_data():carry_id() )
  139.             end
  140.             --Run the original function if carrystacker is off
  141.             return ofuncs.CarryInteractionExt__interact_blocked(self, player)
  142.         end
  143.  
  144.         -- overridden to always allow us to select a carry item
  145.         function CarryInteractionExt:can_select( player )
  146.             local count = #managers.player.carry_stack + (managers.player:is_carrying() and 1 or 0)
  147.             if _toggleCarry then
  148.                 if (managers.player.carry_limit > 0 and count < managers.player.carry_limit) or managers.player.carry_limit == 0 then
  149.                     return CarryInteractionExt.super.can_select( self, player )
  150.                 elseif not managers.player:is_carrying() and count >= managers.player.carry_limit then
  151.                     return false
  152.                 end
  153.             end
  154.             --Run the original function if carrystacker is off
  155.             return ofuncs.CarryInteractionExt_can_select(self, player)
  156.         end
  157.  
  158.         -- custom function. Pushes a carried item to stack and discards it or pops one if we're not carrying anything.
  159.         -- this function is called every time the script gets run.
  160.         function managers.player:carry_stacker()
  161.             if _debugEnabled then
  162.                 io.stderr:write("current stack size: ".. tostring(#managers.player.carry_stack) .. "\n")
  163.                 if #managers.player.carry_stack > 0 then
  164.                     for _,v in pffairs(managers.player.carry_stack) do
  165.                         io.stderr:write("item: ".. v.carry_id .. "\n")
  166.                     end
  167.                 end
  168.             end
  169.             local cdata = self:get_my_carry_data()
  170.             if self:is_carrying() and cdata then
  171.                 table.insert(self.carry_stack, self:get_my_carry_data())
  172.                 self:carry_discard()
  173.                 -- managers.hud:present_mid_text( { title = "Carry Stack", text = cdata.carry_id .. " Pushed", time = 1 } )
  174.             elseif #self.carry_stack > 0 then
  175.                 cdata = table.remove(self.carry_stack)
  176.                 self:set_carry(cdata.carry_id, cdata.multiplier, cdata.dye_initiated, cdata.has_dye_pack, cdata.dye_value_multiplier, cdata.zipline_unit)
  177.                 -- managers.hud:present_mid_text( { title = "Carry Stack", text = cdata.carry_id .. " Popped", time = 1 } )
  178.             -- else
  179.                 -- managers.hud:present_mid_text( { title = "Carry Stack", text = "Empty", time = 1 } )
  180.             end
  181.             if (Application:time() - self.carrystack_lastpress) < 0.3 and (self:is_carrying() or #self.carry_stack > 0) then
  182.                 self.drop_all_bags = true
  183.                 self:drop_carry()
  184.             end
  185.             self.carrystack_lastpress = Application:time()
  186.             self:refresh_stack_counter()
  187.         end
  188.     end
  189. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement