Advertisement
NSKuber

Untitled

Feb 11th, 2018
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.81 KB | None | 0 0
  1. local time = GetDateTimeLocal()
  2. local seed = 3600*tonumber(string.sub(time,-8,-7))+60*tonumber(string.sub(time,-5,-4))+tonumber(string.sub(time,-2,-1))
  3. local RNG = CreateRandomNumberGenerator(seed + mthTruncF(mthRndF() * 1000))
  4. local rndIntRange = function(a,b)
  5.   return (mthFloorF(RNG:RndF()*(b-a+1)) % (b-a+1) + a)
  6. end
  7.  
  8. worldGlobals.CreateRPC("server","reliable","MysteryBoxPickupSound",function(player)
  9.   player:PlaySound(LoadResource("Content/SeriousSam3/Sounds/Items/WeaponPickup/WeaponPickup0" ..rndIntRange(1,4).. ".wav"),1,1,0)
  10. end)
  11.  
  12. if worldGlobals.netIsHost then
  13.  
  14.   if not scrFileExists("Content/SeriousSamFusion/Scripts/Startup/00_NSKuberWeaponDatabase.lua") then
  15.     print("Weapon database not found! Please subscribe to NSKuber's 'Weapon Resources Database' mod!")
  16.     WaitForever()
  17.   end
  18.  
  19.   if (worldGlobals.CWMDoNotReplace == nil) then
  20.     worldGlobals.CWMDoNotReplace = {}
  21.   end  
  22.  
  23.   local worldInfo = worldGlobals.worldInfo
  24.   local availableWeaponsTable
  25.   local boxCreateds = NewGroupVar()
  26.   local boxPlacement
  27.   local BoxesPlacement = {}
  28.   local boxSpawners = NewGroupVar()
  29.   local crates = worldInfo:GetAllEntitiesOfClass("CGenericAmmoRefillItemEntity")
  30.   local createdsPerBox = NewGroupVar()
  31.   local createdWeapon
  32.   local cyclePlacement
  33.   local doNotContinue = false
  34.   local farPlacement = mthQuatVect(mthHPBToQuaternion(0,0,0),mthVector3f(0,-10000,0))
  35.   local maxAmmo
  36.   local mysteryBoxes = NewGroupVar()
  37.   local mysteryBoxesCrates = NewGroupVar()
  38.   local mysteryBoxPicker
  39.   local mysteryBoxPuppet
  40.   local mysteryBoxSpawner
  41.   local mysteryBoxTemplate
  42.   local newWeapon
  43.   local newWeaponTemplate
  44.   local rechargeDelay
  45.   local randomWeapon
  46.   local spawnersPerBox = NewGroupVar()
  47.   local templatePointer
  48.   local thisBox
  49.   local thisWeaponTable
  50.   local thisWeapon
  51.   local weaponSpawners = NewGroupVar()
  52.   local WeaponTemplates = {}
  53.   local WeaponSpawners = {}
  54.   local WeaponSpawnerItems = {}
  55.  
  56.   worldGlobals.MysBoxWeaponTables = {}
  57.  
  58.   local getTableByBox = function(box,printMessage)
  59.     thisWeaponTable = {}
  60.     availableWeaponsTable = {}
  61.     for i=1,#worldGlobals.MysBoxWeaponTables,1 do
  62.       if box == worldGlobals.MysBoxWeaponTables[i][1] then
  63.         thisWeaponTable = worldGlobals.MysBoxWeaponTables[i][2]
  64.         maxAmmo = worldGlobals.MysBoxWeaponTables[i][3]
  65.         rechargeDelay = worldGlobals.MysBoxWeaponTables[i][4]
  66.         break
  67.       end
  68.     end  
  69.  
  70.     if #thisWeaponTable == 0 then
  71.       thisWeaponTable = worldGlobals.MysBoxDefaultWeaponTable
  72.       maxAmmo = false
  73.       rechargeDelay = -1
  74.     end
  75.  
  76.     for j=1,#thisWeaponTable,1 do
  77.       templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[j].. "_BFE.rsc"
  78.       if scrFileExists(templatePointer) then
  79.         table.insert(availableWeaponsTable,thisWeaponTable[j])
  80.       else
  81.         if printMessage == true then
  82.           print("Weapon " ..thisWeaponTable[j].. " does not exist in Weapon Resource Database or is missing a BFE variant!\nIt cannot be included in Mystery Box (" ..box:GetName().. ") item pool.")
  83.         end
  84.       end
  85.     end        
  86.  
  87.     return availableWeaponsTable, maxAmmo, rechargeDelay
  88.   end
  89.  
  90.   for i=1,#crates,1 do
  91.     if crates[i]:GetItemParams():GetFileName() == "Content/SeriousSam3/Databases/Items/MysteryBox/MysteryBox.ep" then
  92.       table.insert(mysteryBoxesCrates,crates[i])
  93.     end
  94.   end
  95.  
  96.   Wait(CustomEvent("OnStep"))
  97.  
  98.   local CheckLoadSpawner = function(weapon)
  99.     if IsDeleted(WeaponSpawners[weapon]) then
  100.       WeaponSpawnerItems[weapon] = WeaponTemplates[weapon]:SpawnEntityFromTemplate(0,worldInfo,farPlacement)
  101.       worldGlobals.CWMDoNotReplace[WeaponSpawnerItems[weapon]] = {false}
  102.       WeaponSpawners[weapon] = WeaponSpawnerItems[weapon]:GetEffectiveEntity()
  103.     end
  104.   end
  105.  
  106.   local SpawnBox = function(index,isBoxOpened)
  107.     if IsDeleted(mysteryBoxPuppet) then
  108.       mysteryBoxPuppet = mysteryBoxTemplate:SpawnEntityFromTemplate(0,worldInfo,BoxesPlacement[index])
  109.       mysteryBoxSpawner = mysteryBoxPuppet:GetEffectiveEntity()
  110.     end
  111.     local box = mysteryBoxSpawner:SpawnOne()
  112.     box:SetPlacement(BoxesPlacement[index])
  113.     box:BeInvulnerable(true)
  114.     if isBoxOpened then
  115.       box:PlayAnim("Opened")
  116.     end
  117.     return box    
  118.   end
  119.  
  120.   local HandleMysteryBox = function(mysteryBoxCrate,index)
  121.     RunAsync(function()
  122.       BoxesPlacement[index] = mysteryBoxCrate:GetPlacement()
  123.       mysteryBoxCrate:SetPlacement(farPlacement)
  124.       local isBoxDepleted = false
  125.       local isBoxOpened = false
  126.       local mysteryBox
  127.       while not isBoxDepleted do
  128.         mysteryBox = SpawnBox(index,isBoxOpened)
  129.         Wait(CustomEvent("OnStep"))
  130.         while isBoxOpened do
  131.           if IsDeleted(mysteryBox) then
  132.             mysteryBox = SpawnBox(index,isBoxOpened)
  133.           end
  134.           Wait(CustomEvent("OnStep"))
  135.         end
  136.         if IsDeleted(mysteryBox) then
  137.           mysteryBox = SpawnBox(index,isBoxOpened)
  138.         end
  139.         mysteryBox:EnableUsage()
  140.  
  141.         RunHandled(function()
  142.           while not IsDeleted(mysteryBox) and not isBoxDepleted do
  143.             Wait(CustomEvent("OnStep"))
  144.           end
  145.         end,
  146.        
  147.         OnEvery(Event(mysteryBox.Used)),
  148.         function(payload)
  149.           mysteryBox:DisableUsage()
  150.           isBoxOpened = true
  151.           mysteryBoxPicker = payload:GetUser()
  152.           local cyclePlacement = mysteryBox:GetPlacement()
  153.           cyclePlacement.vy = cyclePlacement.vy+0.6
  154.  
  155.           local thisWeaponTable
  156.           local maxAmmo
  157.           local rechargeDelay
  158.           thisWeaponTable,maxAmmo,rechargeDelay = getTableByBox(mysteryBoxesCrates[index],false)          
  159.    
  160.           mysteryBox:PlayAnim("Open")
  161.           Wait(Delay(0.75))
  162.           local baseDelay = 4/(3*#thisWeaponTable)
  163.           local spawnedWeapon = nil
  164.          
  165.           for j=1,#thisWeaponTable*3,1 do
  166.             local k=j%#thisWeaponTable
  167.             if k == 0 then k = #thisWeaponTable end
  168.             local weapon = thisWeaponTable[k]
  169.             CheckLoadSpawner(weapon)
  170.             --if doNotContinue == true then break end
  171.             WeaponSpawnerItems[weapon]:SetPlacement(cyclePlacement)
  172.             spawnedWeapon = WeaponSpawners[weapon]:SpawnOne()
  173.             worldGlobals.CWMDoNotReplace[spawnedWeapon] = {false}
  174.             spawnedWeapon:DisablePicking()
  175.             WeaponSpawnerItems[weapon]:SetPlacement(farPlacement)
  176.             --spawnedWeapon : CGenericItemEntity
  177.             --spawnedWeapon:
  178.             cyclePlacement.vy = cyclePlacement.vy+(0.3/(3*#thisWeaponTable))
  179.             local delayFormula = 0.8*(j/(#thisWeaponTable*3))+0.6
  180.             Wait(Delay(baseDelay*delayFormula))
  181.             if not IsDeleted(spawnedWeapon) then
  182.               spawnedWeapon:Delete()
  183.             end
  184.           end
  185.            
  186.           randomWeapon = thisWeaponTable[rndIntRange(1,#thisWeaponTable)]
  187.           CheckLoadSpawner(randomWeapon)
  188.           WeaponSpawnerItems[randomWeapon]:SetPlacement(cyclePlacement)
  189.           spawnedWeapon = WeaponSpawners[randomWeapon]:SpawnOne()
  190.           worldGlobals.CWMDoNotReplace[spawnedWeapon] = {false}
  191.           spawnedWeapon:DisablePicking()
  192.           WeaponSpawnerItems[randomWeapon]:SetPlacement(farPlacement)            
  193.          
  194.           Wait(Delay(1))
  195.           local weaponParams
  196.           local weaponAmmo
  197.           if worldGlobals.MysBoxIsBFE == true then
  198.             weaponParams = LoadResource(worldGlobals.DBWeaponParamsPathsB[randomWeapon])
  199.             if maxAmmo == true then
  200.               weaponAmmo = worldGlobals.DBWeaponAmmoB[randomWeapon][3]
  201.             else
  202.               weaponAmmo = worldGlobals.DBWeaponAmmoB[randomWeapon][1]
  203.             end
  204.           else
  205.             weaponParams = LoadResource(worldGlobals.DBWeaponParamsPaths[randomWeapon])
  206.             if maxAmmo == true then
  207.               weaponAmmo = worldGlobals.DBWeaponAmmo[randomWeapon][3]
  208.             else
  209.               weaponAmmo = worldGlobals.DBWeaponAmmo[randomWeapon][1]
  210.             end
  211.           end
  212.          
  213.           mysteryBoxPicker:AwardWeapon(weaponParams)
  214.           mysteryBoxPicker:AwardAmmoForWeapon(weaponParams,weaponAmmo)
  215.           if worldInfo:IsSinglePlayer() then
  216.             mysteryBoxPicker:PlaySound(LoadResource("Content/SeriousSam3/Sounds/Items/WeaponPickup/WeaponPickup0" ..rndIntRange(1,4).. ".wav"),1,1,0)
  217.           else
  218.             worldGlobals.MysteryBoxPickupSound(mysteryBoxPicker)
  219.           end
  220.           if not IsDeleted(spawnedWeapon) then
  221.             spawnedWeapon:Delete()
  222.           end          
  223.          
  224.           if rechargeDelay > 0 then
  225.             Wait(Delay(rechargeDelay))
  226.             if not IsDeleted(mysteryBox) then
  227.               mysteryBox:PlayAnim("Close")
  228.               Wait(Delay(0.75))
  229.               isBoxOpened = false
  230.             end
  231.           end
  232.         end)
  233.       end    
  234.     end)
  235.   end
  236.  
  237.   if #mysteryBoxesCrates > 0 then
  238.     mysteryBoxTemplate = LoadResource("Content/SeriousSamFusion/Scripts/Templates/MysteryBox.rsc")
  239.     for i=1,#mysteryBoxesCrates,1 do
  240.       HandleMysteryBox(mysteryBoxesCrates[i],i)
  241.     end
  242.   else
  243.     WaitForever()
  244.   end
  245.  
  246.   RunHandled(function()
  247.     WaitForever()
  248.   end,
  249.  
  250.   On(Delay(0.1)),
  251.   function()
  252.     for i=1,#mysteryBoxesCrates,1 do
  253.       local boxPlacement = mthCloneQuatVect(BoxesPlacement[i])
  254.       boxPlacement.vy = boxPlacement.vy+0.6  
  255.       thisWeaponTable = getTableByBox(mysteryBoxesCrates[i],true)
  256.  
  257.       for k=1,#thisWeaponTable,1 do    
  258.         templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[k].. "_BFE.rsc"
  259.         if (WeaponTemplates[thisWeaponTable[k]] == nil) then
  260.           WeaponTemplates[thisWeaponTable[k]] = LoadResource(templatePointer)
  261.           CheckLoadSpawner(thisWeaponTable[k])
  262.         end
  263.       end
  264.  
  265.       thisWeaponTable = nil
  266.     end
  267.   end)
  268.  
  269. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement