Advertisement
Guest User

item_effects.script

a guest
Mar 11th, 2013
47
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local wpnid = {}
  2.  
  3. function get_base_section(section)
  4.     local ini = system_ini()
  5.     if string.sub(section,-3,-2) == "_m" and tonumber(string.sub(section,-1,-1)) ~= nil then
  6.         return section
  7.     end
  8.     local sub = string.sub(section,1,(string.len(section)-3))
  9.     local base_section
  10.     if ini:section_exist(sub) then
  11.         base_section = sub
  12.     else
  13.         base_section = section
  14.     end
  15.     return base_section
  16. end
  17.  
  18.  
  19. function nv_effect(section)
  20.     local nv_on = xr_logic.pstor_retrieve(db.actor, "nv_on", "nil") -- P
  21.     local ini = system_ini()
  22.     local ppe = ini:r_string(section, "ppe")
  23.     local lamp
  24.     if ini:line_exist(section, "light_amp") then
  25.         lamp = ini:r_float(section, "light_amp")
  26.     else
  27.         lamp = 1
  28.     end
  29.     if nv_on == section then -- если используем тот ПНВ, что уже включен, значит отключаем
  30.         ppe = "nightvision_nil"
  31.         lamp = 1
  32.         xr_logic.pstor_store(db.actor, "nv_on", "nil")
  33.     else
  34.         xr_logic.pstor_store(db.actor, "nv_on", section)
  35.     end
  36.     alife():create(section, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  37.     nightvision.pnv(ppe,lamp)
  38. end
  39.  
  40. function convert_wpn(sect,id)
  41.     if sect == "wpn_binoc" or sect == "wpn_knife" then return end
  42.     local base_sect = get_base_section(sect)
  43.     if sect == base_sect and not string.find(sect,"_arena") then
  44.         sect = base_sect.."_aa"
  45.         local wobj = alife():object(id)
  46.         local wdat = weap_data.get_weapon_data(wobj)
  47.         alife():release(wobj, true)
  48.         local pos = db.actor:position() --vector():set(0,100,0)
  49.         pos.x = pos.x + 0.5
  50.         local sobj = alife():create(sect, pos, db.actor:level_vertex_id(), db.actor:game_vertex_id())
  51.         if sobj then
  52.             table.insert(wpnid,sobj.id)
  53.             weap_data.set_weapon_data(wdat,sobj)
  54.         end
  55.     end
  56. end
  57.  
  58. function convert_addon(sect,id)
  59.     if is_scope(sect) then
  60.         local base_sect = get_base_section(sect)
  61.         if sect == base_sect then
  62.             sect = base_sect.."_aa"
  63.         end
  64.         local fake_sect = "fake"..string.sub(sect, -(string.len(sect)-3))
  65.         alife():create(fake_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  66.         alife():release(alife():object(id), true)
  67.     end
  68. end
  69.  
  70. function is_scope(section)
  71.     local ini = system_ini()
  72.     local addon_class = ini:r_string(section, "class")
  73.     return addon_class == "WP_SCOPE"
  74. end
  75.  
  76. function check_gun_scope(weapon_section, scope_section) -- подходит ли эта линейка прицелов к этой линейке стволов.
  77.     local result
  78.     local newsect, scope_type = "nil", "a"
  79.     if string.find(weapon_section,"_arena") then
  80.         result = false
  81.         return result, newsect
  82.     end
  83.     local weapon_base_section = get_base_section(weapon_section)
  84.     local scope_base_section = get_base_section(scope_section)
  85.  
  86.     local scope_status, scope_name = 0, "nil"
  87.     if string.sub(weapon_base_section,1,4) ~= "wpn_" then
  88.         result = false
  89.         return result, newsect
  90.     end
  91.     local ini = system_ini()
  92.     scope_status = ini:r_float(weapon_section, "scope_status")
  93.     if scope_status == 0 then
  94.         result = false
  95.         return result, newsect
  96.     end
  97.     if not ini:line_exist(weapon_section, "scope_name") then
  98.         result = false
  99.         return result, newsect
  100.     else
  101.         scope_name = get_base_section(ini:r_string(weapon_section, "scope_name"))
  102.         if scope_name == scope_base_section then
  103.             result = true
  104.             if weapon_base_section == weapon_section then
  105.                 newsect = weapon_section.."_a"  -- если оружие в базовой секции, ставим стандартные патроны, информацию о прицеле не ставим
  106.             else
  107.                 newsect = string.sub(weapon_section,1,(string.len(weapon_section)-1)) -- иначе сбрасываем информацию о прицеле
  108.             end
  109.             if scope_base_section == scope_section then
  110.                 scope_type = "a" -- если прицел в базовой секции (врядли, ну а вдруг?), ставим стандарт не разбираясь
  111.             else
  112.                 scope_type = string.sub(scope_section,-1) -- иначе смотрим, что за прицел
  113.             end
  114.             newsect = newsect..scope_type
  115.         else
  116.             result = false
  117.             return result, newsect
  118.         end
  119.     end
  120.     return result, newsect
  121. end
  122.  
  123. function fake_scope_effect(sect)
  124.     local real_sect = "wpn"..string.sub(sect, -(string.len(sect)-4))
  125.     if not is_scope(real_sect) then
  126.         return
  127.     end
  128.     local scope_type = string.sub(sect,-1)
  129.     local weapon1, weapon2 = db.actor:item_in_slot(1), db.actor:item_in_slot(2)
  130.     local aweapon, pweapon, pslot, ss, sn = nil, nil, nil, nil, nil
  131.     local aslot = db.actor:active_slot()
  132.     if aslot == 1 then -- если активен первый слот, сначала пытаемся поставить прицел туда
  133.         aweapon = weapon1
  134.         pweapon = weapon2
  135.         pslot = 2
  136.     else -- иначе начинаем со 2 слота
  137.         aslot = 2
  138.         aweapon = weapon2
  139.         pweapon = weapon1
  140.         pslot = 1
  141.     end
  142.     local newsect
  143.     if aweapon ~= nil then -- если в слоте есть оружие,
  144.         local result, newsect = check_gun_scope(aweapon:section(),real_sect)
  145.         if result then --и на него можно поставить данный прицел
  146.             if check_scope_attached(aweapon) == false or scope_type ~= string.sub(aweapon:section(),-1) then
  147.                 fake_scope_effect_set_scope(aslot,newsect) -- ставим именно сюда
  148.                 return
  149.             else
  150.             end
  151.         end
  152.     else
  153.     end
  154.     if pweapon ~= nil then -- если в первой попытке прицел не поставился, и в слоте есть оружие,  
  155.         local result, newsect = check_gun_scope(pweapon:section(),real_sect)
  156.         if result then --и на него можно поставить данный прицел
  157.             if check_scope_attached(pweapon) == false or scope_type ~= string.sub(pweapon:section(),-1) then
  158.                 fake_scope_effect_set_scope(pslot,newsect) -- ставим именно сюда
  159.                 return
  160.             else
  161.             end
  162.         end
  163.     else
  164.     end
  165.     -- попробовали на оба слота, никуда не ставится. Возвращаем прицел в инвентарь
  166.     alife():create(sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  167.     --]]
  168. end
  169.  
  170. function fake_scope_effect_set_scope(slot, newsect)
  171.     local wpn = db.actor:item_in_slot(slot)
  172.     if wpn then
  173.         local ss = system_ini():r_float(wpn:section(), "scope_status")
  174.         local wsect = newsect --
  175.         local wobj = alife():object(wpn:id())
  176.         local wdat = weap_data.get_weapon_data(wobj)
  177.         wdat.visual = system_ini():r_string(newsect, "visual") -- обновляем визуал
  178.         if ss == 1 then
  179.             detach_old_scope(wpn:section()) -- если прицел предустановленный, возвращаем его в инвентарь.
  180.         elseif wdat.addon_flags/2 == math.floor(wdat.addon_flags/2) then -- если флаги 0,2,4 или 6 - прицел не установлен.
  181.         wdat.addon_flags = wdat.addon_flags + 1 -- устанавливаем
  182.             if wdat.addon_flags > 7 then -- если флаги зашкаливают
  183.                 wdat.addon_flags = wdat.addon_flags - 8 -- возвращаем на круги своя
  184.             end
  185.         else
  186.             detach_old_scope(wpn:section()) -- если уже был установленный прицел, возвращаем его в инвентарь.
  187.         end
  188.         alife():release(wobj,true)
  189.         local pos = db.actor:position()
  190.         pos.x = pos.x + 0.5
  191.         local sobj = alife():create(wsect, pos, db.actor:level_vertex_id(), db.actor:game_vertex_id())
  192.         if sobj then
  193.             table.insert(wpnid,sobj.id)
  194.             weap_data.set_weapon_data(wdat,sobj)
  195.         end
  196.         return sobj
  197.     end
  198. end
  199.  
  200. function fake_scope_effect_take_wpn()
  201.     if table.getn(wpnid) > 0 then
  202.         while table.getn(wpnid) > 0 do
  203.             local wid = wpnid[1]
  204.             local weapon = level.object_by_id(wpnid[1])
  205.             if weapon then
  206.                 db.actor:transfer_item(weapon,db.actor)
  207.                 table.remove(wpnid,1)
  208.             else
  209.                 return
  210.             end
  211.         end
  212.     end
  213. end
  214.  
  215. function detach_old_scope(weapon_section)
  216.     local ini = system_ini()
  217.     local scope_name = get_base_section(ini:r_string(weapon_section, "scope_name"))
  218.     local scope_type = string.sub(weapon_section,-1)
  219.     local fake_scope_section = "fake"..string.sub(scope_name, -(string.len(scope_name)-3)).."_"..scope_type..scope_type
  220.     alife():create(fake_scope_section, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
  221. end
  222.  
  223. function check_scope_attached(wpn)
  224.     local ss = system_ini():r_float(wpn:section(), "scope_status")
  225.     local wobj = alife():object(wpn:id())
  226.     local wdat = weap_data.get_weapon_data(wobj)
  227.     return (wdat.addon_flags/2 ~= math.floor(wdat.addon_flags/2)) or (ss == 1)  -- если флаги 1,2,5 или 5 - прицел установлен.
  228. end
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement