Advertisement
rockbandcheeseman

MultiWeapon (Under Construction)

Nov 22nd, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.30 KB | None | 0 0
  1. -- MultiWeapon
  2.  
  3. weapons = {}
  4. switch = {}
  5. multiweap = {}
  6. onweaponpickup = {}
  7.  
  8. max_weapons = 6
  9.  
  10. for i = 0,15 do
  11.     weapons[i] = {}
  12.     multiweap[i] = {}
  13.     switch[i] = 0
  14.     onweaponpickup[i] = true
  15. end
  16.  
  17. function GetRequiredVersion()
  18.  
  19.     return 10058
  20. end
  21.  
  22. function OnScriptLoad(process)
  23.  
  24.  
  25. end
  26.  
  27. function OnScriptUnload()
  28.  
  29.    
  30. end
  31.  
  32. function OnNewGame(map)
  33.  
  34.  
  35. end
  36.  
  37. function OnGameEnd(mode)
  38.  
  39.  
  40. end
  41.  
  42. function OnServerChat(player, chattype, message)
  43.  
  44.     return 1
  45. end
  46.  
  47. function OnServerCommand(player, command)
  48.  
  49.     return 1
  50. end
  51.  
  52. function OnTeamDecision(team)
  53.  
  54.     return team
  55. end
  56.  
  57. function OnPlayerJoin(player, team)
  58.  
  59.    
  60. end
  61.  
  62. function OnPlayerLeave(player, team)
  63.  
  64.  
  65. end
  66.  
  67. function OnPlayerKill(killer, victim, mode)
  68.  
  69.  
  70. end
  71.  
  72. function OnKillMultiplier(player, multiplier)
  73.  
  74.  
  75. end
  76.  
  77. function OnPlayerSpawn(player, m_objId)
  78.  
  79.  
  80. end
  81.  
  82. function OnPlayerSpawnEnd(player, m_objId)
  83.  
  84.    
  85. end
  86.  
  87. function OnTeamChange(relevant, player, cur_team, dest_team)
  88.  
  89.     return 1
  90. end
  91.  
  92. function OnObjectCreation(m_objId, player, tagName)
  93.  
  94.  
  95. end
  96.  
  97. function OnObjectInteraction(player, m_objId, tagType, tagName)
  98.    
  99.     return 1
  100. end
  101.  
  102. function OnWeaponAssignment(player, m_objId, slot, tagName)
  103.    
  104.     return 0
  105. end
  106.  
  107. function OnWeaponReload(player, m_weapId)
  108.  
  109.     return 1
  110. end
  111.  
  112. function OnDamageLookup(receiver, causer, tagData, tagName)
  113.  
  114.  
  115. end
  116.  
  117. function OnVehicleEntry(relevant, player, m_vehicleId, tagName, seat)
  118.  
  119.     return 1
  120. end
  121.  
  122. function OnVehicleEject(player, forced)
  123.  
  124.     return 1
  125. end
  126.  
  127. function OnWeaponPickup(player, m_objId, tagName, m_weapId, slot)
  128.  
  129.     if #weapons[player] <= max_weapons then
  130.         table.insert(weapons[player], tagName)
  131.     end
  132. end
  133.  
  134. function OnWeaponSwitch(player, m_objId, cur_tagName, next_tagName, cur_weapId, next_weapId, cur_slot, next_slot)
  135.  
  136.     local slot = table.find(weapons[player], cur_tagName)
  137.     if weapons[slot + 1] then
  138.         destroyobject(next_weapId)
  139.         assignweapon(player, weapons[slot + 1])
  140.     else
  141.         destroyobject(next_weapId)
  142.         assignweapon(player, weapons[1])
  143.     end
  144. end
  145.  
  146. function OnClientUpdate(player, m_objId)
  147.  
  148.  
  149. end
  150.  
  151. registertimer(10, "WeaponTimer")
  152.  
  153. function WeaponTimer(id, count)
  154.  
  155.     for i = 0,15 do
  156.         if gethash(i) then
  157.             local m_player = getplayer(i)
  158.             local m_objId = readdword(m_player, 0x34)
  159.             local m_object = getobject(m_objId)
  160.             if m_object then
  161.                 local primary_weapId = readdword(m_object, 0x2F8)
  162.                 local secondary_weapId = readdword(m_object, 0x2FC)
  163.                 local tertiary_weapId = readdword(m_object, 0x300)
  164.                 local quartenary_weapId = readdword(m_object, 0x304)
  165.                 local new_weaps = {primary_weapId, secondary_weapId, tertiary_weapId, quartenary_weapId}
  166.                 for k,v in opairs(new_weaps) do
  167.                     local tagType, tagName = getobjecttag(v)
  168.                     if weapons[i][k] ~= tagName then
  169.                         if onweaponpickup[i] then
  170.                             OnWeaponPickup(i, m_objId, tagName, v, k)
  171.                             weapons[i][k] = tagName
  172.                         end
  173.                     end
  174.                 end
  175.                
  176.                 local next_slot = readword(m_object, 0x2F4)
  177.                 if next_slot ~= switch[i] then
  178.                     local cur_slot = readword(m_object, 0x2F2)
  179.                     local cur_weapId = readdword(m_object, 0x118)
  180.                     local next_weapId = readdword(m_object, 0x2F8 + next_slot * 4)
  181.                     local _, cur_tagName = getobjecttag(cur_weapId)
  182.                     local __, next_tagName = getobjecttag(next_weapId)
  183.                     OnWeaponSwitch(i, m_objId, cur_tagName, next_tagName, cur_weapId, next_weapId, cur_slot, next_slot)
  184.                     switch[i] = next_slot
  185.                 end
  186.             end
  187.         end
  188.     end
  189.    
  190.     return 1
  191. end
  192.  
  193. local phasor_assignweapon = assignweapon
  194.  
  195. function assignweapon(player, tagName)
  196.  
  197.     onweaponpickup[player] = false
  198.     phasor_assignweapon(player, tagName)
  199.     onweaponpickup[player] = true
  200. end
  201.  
  202. function table.find(t, val)
  203.  
  204.     for k,v in pairs(t) do
  205.         if v == val then
  206.             return k
  207.         end
  208.     end
  209. end
  210.  
  211. function opairs(t)
  212.    
  213.     local keys = {}
  214.     for k,v in pairs(t) do
  215.         table.insert(keys, k)
  216.     end
  217.     table.sort(keys,
  218.     function(a,b)
  219.         if type(a) == "number" and type(b) == "number" then
  220.             return a < b
  221.         end
  222.         an = string.lower(tostring(a))
  223.         bn = string.lower(tostring(b))
  224.         if an ~= bn then
  225.             return an < bn
  226.         else
  227.             return tostring(a) < tostring(b)
  228.         end
  229.     end)
  230.     local count = 1
  231.     return function()
  232.         if unpack(keys) then
  233.             local key = keys[count]
  234.             local value = t[key]
  235.             count = count + 1
  236.             return key,value
  237.         end
  238.     end
  239. end
  240.  
  241. -- The following were written by Smiley --
  242.  
  243. function getobjecttag(m_objId)
  244.  
  245.     local m_object = getobject(m_objId)
  246.     local object_map_id = readdword(m_object, 0x0)
  247.  
  248.     local map_pointer = 0x460678
  249.     local map_base = readdword(map_pointer, 0x0)
  250.     local map_tag_count = todec(endian(map_base, 0xC, 0x3))
  251.     local tag_table_base = map_base + 0x28
  252.     local tag_table_size = 0x20
  253.  
  254.     for i = 0, (map_tag_count - 1) do
  255.         local tag_id = todec(endian(tag_table_base, 0xC + (tag_table_size * i), 0x3))
  256.  
  257.         if tag_id == object_map_id then
  258.             local tag_class = readstring(tag_table_base, (tag_table_size * i), 0x3, 1)
  259.             local tag_name_address = endian(tag_table_base, 0x10 + (tag_table_size * i), 0x3)
  260.             local tag_name = readtagname("0x" .. tag_name_address)
  261.  
  262.             return tag_class, tag_name
  263.         end
  264.     end
  265. end
  266.  
  267. function readstring(address, offset, length, endian)
  268.  
  269.     local char_table = {}
  270.     local string = ""
  271.     for i=0,length do  
  272.         if readbyte(address, (offset + (0x1 * i))) ~= 0 then       
  273.             table.insert(char_table, string.char(readbyte(address, (offset + (0x1 * i)))))         
  274.         end    
  275.     end
  276.     for k,v in pairs(char_table) do
  277.         if endian == 1 then    
  278.             string = v .. string           
  279.         else       
  280.             string = string .. v           
  281.         end    
  282.     end
  283.  
  284.     return string
  285. end
  286.  
  287. function readtagname(address)
  288.  
  289.     local char_table = {}
  290.     local i = 0
  291.     local string = ""
  292.     while readbyte(address, (0x1 * i)) ~= 0 do 
  293.         table.insert(char_table, string.char(readbyte(address, (0x1 * i))))
  294.         i = i + 1      
  295.     end
  296.     for k,v in pairs(char_table) do
  297.         string = string .. v       
  298.     end
  299.  
  300.     return string
  301. end
  302.  
  303. function endian(address, offset, length)
  304.  
  305.     local data_table = {}
  306.     local data = ""
  307.     for i=0,length do
  308.         local hex = string.format("%X", readbyte(address, offset + (0x1 * i)))
  309.         if tonumber(hex, 16) < 16 then     
  310.             hex = 0 .. hex         
  311.         end
  312.         table.insert(data_table, hex)
  313.     end
  314.     for k,v in pairs(data_table) do
  315.         data = v .. data
  316.     end
  317.  
  318.     return data
  319. end
  320.  
  321. function tohex(number)
  322.  
  323.     return string.format("%X", number)
  324. end
  325.  
  326. function todec(number)
  327.  
  328.     return tonumber(number, 16)
  329. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement