Advertisement
NSKuber

Untitled

Feb 9th, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.34 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 farPlacement = mthQuatVect(mthHPBToQuaternion(0,0,0),mthVector3f(0,-100000,0))
  34. local maxAmmo
  35. local mysteryBoxes = NewGroupVar()
  36. local mysteryBoxesCrates = NewGroupVar()
  37. local mysteryBoxPicker
  38. local mysteryBoxPuppet
  39. local mysteryBoxSpawner
  40. local mysteryBoxTemplate
  41. local rechargeDelay
  42. local randomWeapon
  43. local spawnersPerBox = NewGroupVar()
  44. local templatePointer
  45. local thisBox
  46. local thisWeaponTable
  47. local thisWeapon
  48. local weaponTemplate
  49. worldGlobals.MysBoxWeaponTables = {}
  50.  
  51. local getTableByBox = function(box,printMessage)
  52. thisWeaponTable = {}
  53. availableWeaponsTable = {}
  54. for i=1,#worldGlobals.MysBoxWeaponTables,1 do
  55. if box == worldGlobals.MysBoxWeaponTables[i][1] then
  56. thisWeaponTable = worldGlobals.MysBoxWeaponTables[i][2]
  57. maxAmmo = worldGlobals.MysBoxWeaponTables[i][3]
  58. rechargeDelay = worldGlobals.MysBoxWeaponTables[i][4]
  59. break
  60. end
  61. end
  62.  
  63. if #thisWeaponTable == 0 then
  64. thisWeaponTable = worldGlobals.MysBoxDefaultWeaponTable
  65. maxAmmo = false
  66. rechargeDelay = 30
  67. end
  68.  
  69. for j=1,#thisWeaponTable,1 do
  70. templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[j].. "_BFE.rsc"
  71. if scrFileExists(templatePointer) then
  72. table.insert(availableWeaponsTable, thisWeaponTable[j])
  73. else
  74. if printMessage == true then
  75. 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.")
  76. end
  77. end
  78. end
  79.  
  80. return availableWeaponsTable, maxAmmo, rechargeDelay
  81. end
  82.  
  83. for i=1,#crates,1 do
  84. if crates[i]:GetItemParams():GetFileName() == "Content/SeriousSam3/Databases/Items/MysteryBox/MysteryBox.ep" then
  85. table.insert(mysteryBoxesCrates, crates[i])
  86. end
  87. end
  88.  
  89. Wait(CustomEvent("OnStep"))
  90.  
  91. local HandleMysteryBox = function(mysteryBoxCrate,index)
  92. RunAsync(function()
  93. BoxesPlacement[index] = mysteryBoxCrate:GetPlacement()
  94. mysteryBoxCrate:SetPlacement(farPlacement)
  95. local isBoxDepleted = false
  96. local isBoxOpened = false
  97. local mysteryBox
  98. while not isBoxDepleted do
  99. if IsDeleted(mysteryBoxPuppet) then
  100. mysteryBoxPuppet = mysteryBoxTemplate:SpawnEntityFromTemplate(0,worldInfo,BoxesPlacement[index])
  101. mysteryBoxSpawner = mysteryBoxPuppet:GetEffectiveEntity()
  102. end
  103. mysteryBox = mysteryBoxSpawner:SpawnOne()
  104. mysteryBox:BeInvulnerable(true)
  105. Wait(CustomEvent("OnStep"))
  106. if not isBoxOpened then
  107. mysteryBox:EnableUsage()
  108. else
  109. mysteryBox:PlayAnim("Open")
  110. while isBoxOpened do
  111. Wait(CustomEvent("OnStep"))
  112. end
  113. end
  114. if IsDeleted(mysteryBox) then
  115. if IsDeleted(mysteryBoxPuppet) then
  116. mysteryBoxPuppet = mysteryBoxTemplate:SpawnEntityFromTemplate(0,worldInfo,BoxesPlacement[index])
  117. mysteryBoxSpawner = mysteryBoxPuppet:GetEffectiveEntity()
  118. end
  119. mysteryBox = mysteryBoxSpawner:SpawnOne()
  120. mysteryBox:BeInvulnerable(true)
  121. mysteryBox:EnableUsage()
  122. end
  123. RunHandled(function()
  124. while not IsDeleted(mysteryBox) and not isBoxDepleted do
  125. Wait(CustomEvent("OnStep"))
  126. end
  127. end,
  128.  
  129. On(Event(mysteryBox.Used)),
  130. function(payload)
  131. isBoxOpened = true
  132. mysteryBoxPicker = payload:GetUser()
  133. local cyclePlacement = mysteryBox:GetPlacement()
  134. cyclePlacement.vy = cyclePlacement.vy+0.6
  135.  
  136. mysteryBox:PlayAnim("Open")
  137. Wait(Delay(0.75))
  138. local spawnersInBox = boxSpawners[index]
  139. local baseDelay = 4/(3*#spawnersInBox)
  140. local spawnedWeapon
  141. for j=1,#spawnersInBox*3,1 do
  142. local k=j%#spawnersInBox
  143. if k == 0 then k = #spawnersInBox end
  144. boxCreateds[index][k]:SetPlacement(cyclePlacement)
  145. spawnedWeapon = spawnersInBox[k]:SpawnOne()
  146. worldGlobals.CWMDoNotReplace[spawnedWeapon] = {false}
  147. spawnedWeapon:DisablePicking()
  148. cyclePlacement.vy = cyclePlacement.vy+(0.3/(3*#spawnersInBox))
  149. local delayFormula = 0.8*(j/(#spawnersInBox*3))+0.6
  150. Wait(Delay(baseDelay*delayFormula))
  151. spawnedWeapon:Delete()
  152. end
  153.  
  154. randomWeapon = rndIntRange(1,#spawnersInBox)
  155. spawnedWeapon = spawnersInBox[randomWeapon]:SpawnOne()
  156. spawnedWeapon:DisablePicking()
  157. local thisWeaponTable
  158. local maxAmmo
  159. local rechargeDelay
  160. thisWeaponTable,maxAmmo,rechargeDelay = getTableByBox(mysteryBoxesCrates[index],false)
  161. thisWeapon = thisWeaponTable[randomWeapon]
  162.  
  163. Wait(Delay(1))
  164. local weaponParams
  165. local weaponAmmo
  166. if worldGlobals.MysBoxIsBFE == true then
  167. weaponParams = LoadResource(worldGlobals.DBWeaponParamsPathsB[thisWeapon])
  168. if maxAmmo == true then
  169. weaponAmmo = worldGlobals.DBWeaponAmmoB[thisWeapon][3]
  170. else
  171. weaponAmmo = worldGlobals.DBWeaponAmmoB[thisWeapon][1]
  172. end
  173. else
  174. weaponParams = LoadResource(worldGlobals.DBWeaponParamsPaths[thisWeapon])
  175. if maxAmmo == true then
  176. weaponAmmo = worldGlobals.DBWeaponAmmo[thisWeapon][3]
  177. else
  178. weaponAmmo = worldGlobals.DBWeaponAmmo[thisWeapon][1]
  179. end
  180. end
  181.  
  182. mysteryBoxPicker:AwardWeapon(weaponParams)
  183. mysteryBoxPicker:AwardAmmoForWeapon(weaponParams,weaponAmmo)
  184. if worldInfo:IsSinglePlayer() then
  185. mysteryBoxPicker:PlaySound(LoadResource("Content/SeriousSam3/Sounds/Items/WeaponPickup/WeaponPickup0" ..rndIntRange(1,4).. ".wav"),1,1,0)
  186. else
  187. worldGlobals.MysteryBoxPickupSound(mysteryBoxPicker)
  188. end
  189. spawnedWeapon:Delete()
  190.  
  191. if rechargeDelay > 0 then
  192. Wait(Delay(rechargeDelay))
  193. isBoxOpened = false
  194. if not IsDeleted(mysteryBox) then
  195. mysteryBox:PlayAnim("Close")
  196. mysteryBox:EnableUsage()
  197. end
  198. elseif rechargeDelay <= 0 then
  199. isBoxDepleted = true
  200. end
  201. end)
  202. end
  203. if not IsDeleted(mysteryBox) then
  204. mysteryBox:Delete()
  205. end
  206.  
  207. end)
  208. end
  209.  
  210. if #mysteryBoxesCrates > 0 then
  211. mysteryBoxTemplate = LoadResource("Content/SeriousSamFusion/Scripts/Templates/MysteryBox.rsc")
  212. for i=1,#mysteryBoxesCrates,1 do
  213. HandleMysteryBox(mysteryBoxesCrates[i],i)
  214. end
  215. else
  216. WaitForever()
  217. end
  218.  
  219. RunHandled(function()
  220. WaitForever()
  221. end,
  222.  
  223. On(Delay(0.1)),
  224. function()
  225. for i=1,#mysteryBoxesCrates,1 do
  226. local boxPlacement = mthCloneQuatVect(BoxesPlacement[i])
  227. boxPlacement.vy = boxPlacement.vy+0.6
  228. thisWeaponTable = getTableByBox(mysteryBoxesCrates[i],true)
  229.  
  230. for k=1,#thisWeaponTable,1 do
  231. templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[k].. "_BFE.rsc"
  232. weaponTemplate = LoadResource(templatePointer)
  233. createdWeapon = weaponTemplate:SpawnEntityFromTemplate(0,worldInfo,boxPlacement)
  234. worldGlobals.CWMDoNotReplace[createdWeapon] = {false}
  235. table.insert(createdsPerBox,createdWeapon)
  236. table.insert(spawnersPerBox,createdWeapon:GetEffectiveEntity())
  237. createdWeapon:SetPlacement(farPlacement)
  238. end
  239.  
  240. print("inserting "..#spawnersPerBox)
  241. table.insert(boxSpawners,spawnersPerBox)
  242. table.insert(boxCreateds,createdsPerBox)
  243. createdsPerBox = NewGroupVar()
  244. spawnersPerBox = NewGroupVar()
  245. thisWeaponTable = nil
  246.  
  247. for l=1,#createdsPerBox,1 do
  248. createdsPerBox[l]:SetPlacement(boxPlacement)
  249. end
  250. end
  251. end)
  252.  
  253. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement