Advertisement
Guest User

CS2D - LUA Lag Compensation

a guest
Nov 17th, 2010
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.47 KB | None | 0 0
  1. --LUA Lag Compensation by FlooD
  2. --thx to Jermuk for his custom server, which first encouraged me to make lag compensation.
  3. --thx to lasthope and def3ct for initial testing.
  4. --thx to 3rr0r for ideas and suggestions for refining the code.
  5.  
  6. weapons = {}
  7. weapons[30] = {range = 300, damage = 22, name = "AK-47"}
  8. weapons[32] = {range = 300, damage = 22, name = "M4A1"}
  9. weapons[50] = {range = 8, damage = 50, name = "Knife"}
  10. weapons[3] = {range = 300, damage = 34, name = "Deagle"}
  11.  
  12. for i = 1, 100 do
  13.     if weapons[i] then
  14.         parse("mp_wpndmg "..weapons[i]["name"].." 0")
  15.     end
  16. end
  17.  
  18. BUFFER_SIZE = 25
  19. frame = 0
  20.  
  21. buffer = {}
  22. buffer[1] = {} --x buffer
  23. buffer[2] = {} --y buffer
  24.  
  25. function clearbuffer(id)
  26.     buffer[1][id] = {}
  27.     buffer[2][id] = {}
  28. end
  29.  
  30. for i = 1, 32 do
  31.     clearbuffer(i)
  32. end
  33.  
  34. addhook("leave", "clearbuffer")
  35. addhook("die", "clearbuffer")
  36.  
  37. addhook("always", "updatebuffer")
  38. function updatebuffer()
  39.     frame = frame + 1
  40.     for i = 1, 32 do
  41.         buffer[1][i][frame], buffer[2][i][frame] = player(i, "x"), player(i, "y")
  42.         buffer[1][i][frame - BUFFER_SIZE], buffer[2][i][frame - BUFFER_SIZE] = nil, nil
  43.     end
  44. end
  45.  
  46. addhook("attack", "onattack")
  47. function onattack(id)
  48.     local wpn = player(id, "weapon")
  49.     if not weapons[wpn] then
  50.         return
  51.     end
  52.  
  53.     local rot = player(id, "rot")
  54.     local start_x = player(id, "x")
  55.     local start_y = player(id, "y")
  56.     local end_x = start_x + (3 * weapons[wpn]["range"]) * math.sin(math.rad(rot))
  57.     local end_y = start_y - (3 * weapons[wpn]["range"]) * math.cos(math.rad(rot))
  58.     local tile_x = player(id, "tilex")
  59.     local tile_y = player(id, "tiley")
  60.     --the following huge if statement will set tile_x and tile_y to the first wall the bullet hits.
  61.     if rot > 0 and rot < 90 then
  62.         while (not tile(tile_x, tile_y, "wall")) and topixel(tile_x) <= end_x and topixel(tile_y) >= end_y do
  63.             if intersect(start_x, start_y, end_x, end_y, topixel(tile_x + 1), topixel(tile_y - 1), 32) then
  64.                 tile_x, tile_y = tile_x + 1, tile_y - 1
  65.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x + 1), topixel(tile_y), 32) then
  66.                 tile_x = tile_x + 1
  67.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x), topixel(tile_y - 1), 32) then
  68.                 tile_y = tile_y - 1
  69.             else --unlikely or impossible, but here for safety.
  70.                 break
  71.             end
  72.         end
  73.     elseif rot > 90 and rot < 180 then
  74.         while (not tile(tile_x, tile_y, "wall")) and topixel(tile_x) <= end_x and topixel(tile_y) <= end_y do
  75.             if intersect(start_x, start_y, end_x, end_y, topixel(tile_x + 1), topixel(tile_y + 1), 32) then
  76.                 tile_x, tile_y = tile_x + 1, tile_y + 1
  77.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x + 1), topixel(tile_y), 32) then
  78.                 tile_x = tile_x + 1
  79.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x), topixel(tile_y + 1), 32) then
  80.                 tile_y = tile_y + 1
  81.             else
  82.                 break
  83.             end
  84.         end
  85.     elseif rot > -180 and rot < -90 then
  86.         while (not tile(tile_x, tile_y, "wall")) and topixel(tile_x) >= end_x and topixel(tile_y) <= end_y do
  87.             if intersect(start_x, start_y, end_x, end_y, topixel(tile_x - 1), topixel(tile_y + 1), 32) then
  88.                 tile_x, tile_y = tile_x - 1, tile_y + 1
  89.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x - 1), topixel(tile_y), 32) then
  90.                 tile_x = tile_x - 1
  91.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x), topixel(tile_y + 1), 32) then
  92.                 tile_y = tile_y + 1
  93.             else
  94.                 break
  95.             end
  96.         end
  97.     elseif rot > -90 and rot < 0 then
  98.         while (not tile(tile_x, tile_y, "wall")) and topixel(tile_x) >= end_x and topixel(tile_y) >= end_y do
  99.             if intersect(start_x, start_y, end_x, end_y, topixel(tile_x - 1), topixel(tile_y - 1), 32) then
  100.                 tile_x, tile_y = tile_x - 1, tile_y - 1
  101.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x - 1), topixel(tile_y), 32) then
  102.                 tile_x = tile_x - 1
  103.             elseif intersect(start_x, start_y, end_x, end_y, topixel(tile_x), topixel(tile_y - 1), 32) then
  104.                 tile_y = tile_y - 1
  105.             else
  106.                 break
  107.             end
  108.         end
  109.     elseif rot == 0 then
  110.         while not tile(tile_x, tile_y, "wall") and topixel(tile_y) >= end_y do
  111.             tile_y = tile_y - 1
  112.         end
  113.     elseif rot == 90 then
  114.         while not tile(tile_x, tile_y, "wall") and topixel(tile_x) <= end_x do
  115.             tile_x = tile_x + 1
  116.         end
  117.     elseif rot == 180 then
  118.         while not tile(tile_x, tile_y, "wall") and topixel(tile_y) <= end_y do
  119.             tile_y = tile_y + 1
  120.         end
  121.     elseif rot == -90 then
  122.         while not tile(tile_x, tile_y, "wall") and topixel(tile_x) >= end_x do
  123.             tile_x = tile_x - 1
  124.         end
  125.     end
  126.  
  127.     local temp_x, temp_y = end_x, end_y
  128.     end_x, end_y = intersect(start_x, start_y, temp_x, temp_y, topixel(tile_x), topixel(tile_y), 32)
  129.    
  130.     if not (end_x  or end_y) then --unlikely or impossible, but here for safety.
  131.         end_x, end_y = temp_x, temp_y
  132.     end
  133.  
  134.     local frames = math.floor(player(id, "ping") / 20)
  135.     if frames > (BUFFER_SIZE - 1) then
  136.         frames = (BUFFER_SIZE - 1)
  137.     end
  138.  
  139.     local alive = player(0, "tableliving")
  140.     for _, v in ipairs(alive) do
  141.         if ((game("sv_friendlyfire") == 1) or (player(v, "team") ~= player(id, "team"))) and (v ~= id) and intersect(start_x, start_y, end_x, end_y, buffer[1][v][frame - frames], buffer[2][v][frame - frames], 24) then
  142.             local newarmor = player(v, "armor") - weapons[wpn]["damage"]
  143.             if newarmor < 0 then
  144.                 newarmor = 0
  145.             end
  146.             local newhealth = player(v, "health") - (weapons[wpn]["damage"] - math.floor(game("mp_kevlar") * (player(v, "armor") - newarmor)))
  147.             if newhealth > 0 then
  148.                 parse("sethealth "..v.." "..newhealth)
  149.                 parse("setarmor "..v.." "..newarmor)
  150.             else
  151.                 parse("customkill "..id.." "..weapons[wpn]["name"].." "..v)
  152.             end
  153.         end
  154.     end
  155. end
  156.  
  157. function topixel(tile)
  158.     return (tile * 32) + 16
  159. end
  160.  
  161. function isinorder(s, i, e)
  162.     return (e >= i and i >= s) or (e <= i and i <= s)
  163. end
  164.  
  165. function intersect(sx,sy,ex,ey,bx,by,bl)
  166.     bl = bl / 2
  167.     if math.abs(sx - bx) <= bl and math.abs(sy - by) <= bl then return sx, sy end
  168.     local i_x, i_y
  169.     if ey > sy then
  170.         i_x = ((ex - sx) * (by - bl) + (sx * ey - sy * ex)) / (ey - sy)
  171.     elseif ey < sy then
  172.         i_x = ((ex - sx) * (by + bl) + (sx * ey - sy * ex)) / (ey - sy)
  173.     end
  174.     if i_x and math.abs(i_x - bx) <= bl and isinorder(sx, i_x, ex) then
  175.         return i_x, (((ey > sy) and (by - bl)) or (by + bl))
  176.     end
  177.     if ex > sx then
  178.         i_y = ((ey - sy) * (bx - bl) + (sy * ex - sx * ey)) / (ex - sx)
  179.     elseif ex < sx then
  180.         i_y = ((ey - sy) * (bx + bl) + (sy * ex - sx * ey)) / (ex - sx)
  181.     end
  182.     if i_y and math.abs(i_y - by) <= bl and isinorder(sy, i_y, ey) then
  183.         return (((ex > sx) and (bx - bl)) or (bx + bl)), i_y
  184.     end
  185. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement