Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local time = GetDateTimeLocal()
- local seed = 3600*tonumber(string.sub(time,-8,-7))+60*tonumber(string.sub(time,-5,-4))+tonumber(string.sub(time,-2,-1))
- local RNG = CreateRandomNumberGenerator(seed + mthTruncF(mthRndF() * 1000))
- local rndIntRange = function(a,b)
- return (mthFloorF(RNG:RndF()*(b-a+1)) % (b-a+1) + a)
- end
- worldGlobals.CreateRPC("server","reliable","MysteryBoxPickupSound",function(player)
- player:PlaySound(LoadResource("Content/SeriousSam3/Sounds/Items/WeaponPickup/WeaponPickup0" ..rndIntRange(1,4).. ".wav"),1,1,0)
- end)
- if worldGlobals.netIsHost then
- if not scrFileExists("Content/SeriousSamFusion/Scripts/Startup/00_NSKuberWeaponDatabase.lua") then
- print("Weapon database not found! Please subscribe to NSKuber's 'Weapon Resources Database' mod!")
- WaitForever()
- end
- if (worldGlobals.CWMDoNotReplace == nil) then
- worldGlobals.CWMDoNotReplace = {}
- end
- local worldInfo = worldGlobals.worldInfo
- local availableWeaponsTable
- local boxCreateds = NewGroupVar()
- local boxPlacement
- local BoxesPlacement = {}
- local boxSpawners = NewGroupVar()
- local crates = worldInfo:GetAllEntitiesOfClass("CGenericAmmoRefillItemEntity")
- local createdsPerBox = NewGroupVar()
- local createdWeapon
- local cyclePlacement
- local doNotContinue = false
- local farPlacement = mthQuatVect(mthHPBToQuaternion(0,0,0),mthVector3f(0,-10000,0))
- local maxAmmo
- local mysteryBoxes = NewGroupVar()
- local mysteryBoxesCrates = NewGroupVar()
- local mysteryBoxPicker
- local mysteryBoxPuppet
- local mysteryBoxSpawner
- local mysteryBoxTemplate
- local newWeapon
- local newWeaponTemplate
- local rechargeDelay
- local randomWeapon
- local spawnersPerBox = NewGroupVar()
- local templatePointer
- local thisBox
- local thisWeaponTable
- local thisWeapon
- local weaponSpawners = NewGroupVar()
- local WeaponTemplates = {}
- local WeaponSpawners = {}
- local WeaponSpawnerItems = {}
- worldGlobals.MysBoxWeaponTables = {}
- local getTableByBox = function(box,printMessage)
- thisWeaponTable = {}
- availableWeaponsTable = {}
- for i=1,#worldGlobals.MysBoxWeaponTables,1 do
- if box == worldGlobals.MysBoxWeaponTables[i][1] then
- thisWeaponTable = worldGlobals.MysBoxWeaponTables[i][2]
- maxAmmo = worldGlobals.MysBoxWeaponTables[i][3]
- rechargeDelay = worldGlobals.MysBoxWeaponTables[i][4]
- break
- end
- end
- if #thisWeaponTable == 0 then
- thisWeaponTable = worldGlobals.MysBoxDefaultWeaponTable
- maxAmmo = false
- rechargeDelay = -1
- end
- for j=1,#thisWeaponTable,1 do
- templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[j].. "_BFE.rsc"
- if scrFileExists(templatePointer) then
- table.insert(availableWeaponsTable,thisWeaponTable[j])
- else
- if printMessage == true then
- 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.")
- end
- end
- end
- return availableWeaponsTable, maxAmmo, rechargeDelay
- end
- for i=1,#crates,1 do
- if crates[i]:GetItemParams():GetFileName() == "Content/SeriousSam3/Databases/Items/MysteryBox/MysteryBox.ep" then
- table.insert(mysteryBoxesCrates,crates[i])
- end
- end
- Wait(CustomEvent("OnStep"))
- local CheckLoadSpawner = function(weapon)
- if IsDeleted(WeaponSpawners[weapon]) then
- WeaponSpawnerItems[weapon] = WeaponTemplates[weapon]:SpawnEntityFromTemplate(0,worldInfo,farPlacement)
- worldGlobals.CWMDoNotReplace[WeaponSpawnerItems[weapon]] = {false}
- WeaponSpawners[weapon] = WeaponSpawnerItems[weapon]:GetEffectiveEntity()
- end
- end
- local SpawnBox = function(index,isBoxOpened)
- if IsDeleted(mysteryBoxPuppet) then
- mysteryBoxPuppet = mysteryBoxTemplate:SpawnEntityFromTemplate(0,worldInfo,BoxesPlacement[index])
- mysteryBoxSpawner = mysteryBoxPuppet:GetEffectiveEntity()
- end
- local box = mysteryBoxSpawner:SpawnOne()
- box:SetPlacement(BoxesPlacement[index])
- box:BeInvulnerable(true)
- if isBoxOpened then
- box:PlayAnim("Opened")
- end
- return box
- end
- local HandleMysteryBox = function(mysteryBoxCrate,index)
- RunAsync(function()
- BoxesPlacement[index] = mysteryBoxCrate:GetPlacement()
- mysteryBoxCrate:SetPlacement(farPlacement)
- local isBoxDepleted = false
- local isBoxOpened = false
- local mysteryBox
- while not isBoxDepleted do
- mysteryBox = SpawnBox(index,isBoxOpened)
- Wait(CustomEvent("OnStep"))
- while isBoxOpened do
- if IsDeleted(mysteryBox) then
- mysteryBox = SpawnBox(index,isBoxOpened)
- end
- Wait(CustomEvent("OnStep"))
- end
- if IsDeleted(mysteryBox) then
- mysteryBox = SpawnBox(index,isBoxOpened)
- end
- mysteryBox:EnableUsage()
- RunHandled(function()
- while not IsDeleted(mysteryBox) and not isBoxDepleted do
- Wait(CustomEvent("OnStep"))
- end
- end,
- OnEvery(Event(mysteryBox.Used)),
- function(payload)
- mysteryBox:DisableUsage()
- isBoxOpened = true
- mysteryBoxPicker = payload:GetUser()
- local cyclePlacement = mysteryBox:GetPlacement()
- cyclePlacement.vy = cyclePlacement.vy+0.6
- local thisWeaponTable
- local maxAmmo
- local rechargeDelay
- thisWeaponTable,maxAmmo,rechargeDelay = getTableByBox(mysteryBoxesCrates[index],false)
- mysteryBox:PlayAnim("Open")
- Wait(Delay(0.75))
- local baseDelay = 4/(3*#thisWeaponTable)
- local spawnedWeapon = nil
- for j=1,#thisWeaponTable*3,1 do
- local k=j%#thisWeaponTable
- if k == 0 then k = #thisWeaponTable end
- local weapon = thisWeaponTable[k]
- CheckLoadSpawner(weapon)
- --if doNotContinue == true then break end
- WeaponSpawnerItems[weapon]:SetPlacement(cyclePlacement)
- spawnedWeapon = WeaponSpawners[weapon]:SpawnOne()
- worldGlobals.CWMDoNotReplace[spawnedWeapon] = {false}
- spawnedWeapon:DisablePicking()
- WeaponSpawnerItems[weapon]:SetPlacement(farPlacement)
- --spawnedWeapon : CGenericItemEntity
- --spawnedWeapon:
- cyclePlacement.vy = cyclePlacement.vy+(0.3/(3*#thisWeaponTable))
- local delayFormula = 0.8*(j/(#thisWeaponTable*3))+0.6
- Wait(Delay(baseDelay*delayFormula))
- if not IsDeleted(spawnedWeapon) then
- spawnedWeapon:Delete()
- end
- end
- randomWeapon = thisWeaponTable[rndIntRange(1,#thisWeaponTable)]
- CheckLoadSpawner(randomWeapon)
- WeaponSpawnerItems[randomWeapon]:SetPlacement(cyclePlacement)
- spawnedWeapon = WeaponSpawners[randomWeapon]:SpawnOne()
- worldGlobals.CWMDoNotReplace[spawnedWeapon] = {false}
- spawnedWeapon:DisablePicking()
- WeaponSpawnerItems[randomWeapon]:SetPlacement(farPlacement)
- Wait(Delay(1))
- local weaponParams
- local weaponAmmo
- if worldGlobals.MysBoxIsBFE == true then
- weaponParams = LoadResource(worldGlobals.DBWeaponParamsPathsB[randomWeapon])
- if maxAmmo == true then
- weaponAmmo = worldGlobals.DBWeaponAmmoB[randomWeapon][3]
- else
- weaponAmmo = worldGlobals.DBWeaponAmmoB[randomWeapon][1]
- end
- else
- weaponParams = LoadResource(worldGlobals.DBWeaponParamsPaths[randomWeapon])
- if maxAmmo == true then
- weaponAmmo = worldGlobals.DBWeaponAmmo[randomWeapon][3]
- else
- weaponAmmo = worldGlobals.DBWeaponAmmo[randomWeapon][1]
- end
- end
- mysteryBoxPicker:AwardWeapon(weaponParams)
- mysteryBoxPicker:AwardAmmoForWeapon(weaponParams,weaponAmmo)
- if worldInfo:IsSinglePlayer() then
- mysteryBoxPicker:PlaySound(LoadResource("Content/SeriousSam3/Sounds/Items/WeaponPickup/WeaponPickup0" ..rndIntRange(1,4).. ".wav"),1,1,0)
- else
- worldGlobals.MysteryBoxPickupSound(mysteryBoxPicker)
- end
- if not IsDeleted(spawnedWeapon) then
- spawnedWeapon:Delete()
- end
- if rechargeDelay > 0 then
- Wait(Delay(rechargeDelay))
- if not IsDeleted(mysteryBox) then
- mysteryBox:PlayAnim("Close")
- Wait(Delay(0.75))
- isBoxOpened = false
- end
- end
- end)
- end
- end)
- end
- if #mysteryBoxesCrates > 0 then
- mysteryBoxTemplate = LoadResource("Content/SeriousSamFusion/Scripts/Templates/MysteryBox.rsc")
- for i=1,#mysteryBoxesCrates,1 do
- HandleMysteryBox(mysteryBoxesCrates[i],i)
- end
- else
- WaitForever()
- end
- RunHandled(function()
- WaitForever()
- end,
- On(Delay(0.1)),
- function()
- for i=1,#mysteryBoxesCrates,1 do
- local boxPlacement = mthCloneQuatVect(BoxesPlacement[i])
- boxPlacement.vy = boxPlacement.vy+0.6
- thisWeaponTable = getTableByBox(mysteryBoxesCrates[i],true)
- for k=1,#thisWeaponTable,1 do
- templatePointer = "Content/SeriousSamFusion/Scripts/Templates/WeaponDatabase/" ..thisWeaponTable[k].. "_BFE.rsc"
- if (WeaponTemplates[thisWeaponTable[k]] == nil) then
- WeaponTemplates[thisWeaponTable[k]] = LoadResource(templatePointer)
- CheckLoadSpawner(thisWeaponTable[k])
- end
- end
- thisWeaponTable = nil
- end
- end)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement