216 lines
8.9 KiB
Lua

local UtilLib = require("BenUtils")
local BenUtils = UtilLib.new()
-- Globals
LOOPLICATOR_PRE_ID = 0
LOOPLICATOR_POST_ID = 0
LOOPLICATOR_MULITPLIER = 2
LOOPLICATOR_ROUNDS = 10
LOOPLICATOR_XL_COST = 1
LOOPLICATOR_ALL_MODS = false
LOOPLICATOR_NUM_MODS = 3
-- End Globals
-- Internal functions
---@param pre number
---@param post number
local function SetLooplicatorHookIds(pre, post)
ModRef:SetSharedVariable("LooplicatorPreID", pre)
ModRef:SetSharedVariable("LooplicatorPostID", post)
end
local function GetLooplicatorHookIds()
local pre = ModRef:GetSharedVariable("LooplicatorPreID")
local post = ModRef:GetSharedVariable("LooplicatorPostID")
return pre, post
end
local function GetIsActive()
return ModRef:GetSharedVariable("LooplicatorEnabled")
end
local function SetIsActive(active)
ModRef:SetSharedVariable("LooplicatorEnabled", active)
end
-- End internal functions
-- Mod functions
---@param PlayerName string
function LooplicatorSettings(PlayerName, ...)
print("[BenUtil] Got chat command loopset from " .. PlayerName)
---@class player ACrabPC
local player = FindFirstOf("CrabPC")
player:ServerSendChatMessage(BenUtils.StringToFString("Looplicator settings:"))
player:ServerSendChatMessage(BenUtils.StringToFString(string.format("Enabled: %s", tostring(LOOPLICATOR_POST_ID > 0))))
player:ServerSendChatMessage(BenUtils.StringToFString(string.format("Num of rounds: %d", LOOPLICATOR_ROUNDS)))
player:ServerSendChatMessage(BenUtils.StringToFString(string.format("XL cost: %d", LOOPLICATOR_XL_COST)))
player:ServerSendChatMessage(BenUtils.StringToFString(string.format("Multiply all mods: %s",
tostring(LOOPLICATOR_ALL_MODS))))
player:ServerSendChatMessage(BenUtils.StringToFString(string.format("Num of mods to Multiply: %d",
LOOPLICATOR_NUM_MODS)))
end
function looplicator()
local gamestate = FindFirstOf("CrabGS")
local player = FindFirstOf("CrabPC")
local island_num = gamestate.CurrentIsland
if island_num % (LOOPLICATOR_ROUNDS) == 0.00 then
gamestate.XLLevel = 1
player:ServerSendChatMessage(BenUtils.StringToFString("Looplicator Challenge Round"))
player:ServerSendChatMessage(BenUtils.StringToFString("All Items will double their levels next round"))
player:ServerSendChatMessage(BenUtils.StringToFString("If you win that is!"))
end
-- This checks to see if the last round was divisble by 10
if island_num ~= 1 and (island_num - 1) % LOOPLICATOR_ROUNDS == 0.00 then
print("[BenUtils] Triggered Looplicator, doubling levels of all perks")
local crabs = FindAllOf("CrabPS")
if crabs then
if LOOPLICATOR_ALL_MODS then
---@param v ACrabPS
for i, v in ipairs(crabs) do
---@param wmod FCrabWeaponMod
v.WeaponMods:ForEach(function(index, wmod)
---@class mod FCrabWeaponMod
local mod = wmod:get()
if mod.InventoryInfo.Level ~= 255 then
if mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER < 255 then
mod.InventoryInfo.Level = mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER
else
mod.InventoryInfo.Level = 255
end
end
end)
---@param wmod FCrabAbilityMod
v.AbilityMods:ForEach(function(index, wmod)
---@class mod FCrabAbilityMod
local mod = wmod:get()
if mod.InventoryInfo.Level ~= 255 then
if mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER < 255 then
mod.InventoryInfo.Level = mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER
else
mod.InventoryInfo.Level = 255
end
end
end)
---@param wmod FCrabMeleeMod
v.MeleeMods:ForEach(function(index, wmod)
---@class mod FCrabMeleeMod
local mod = wmod:get()
if mod.InventoryInfo.Level ~= 255 then
if mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER < 255 then
mod.InventoryInfo.Level = mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER
else
mod.InventoryInfo.Level = 255
end
end
end)
---@param wmod FCrabPerk
v.Perks:ForEach(function(index, wmod)
---@class mod FCrabPerk
local mod = wmod:get()
if mod.InventoryInfo.Level ~= 255 then
if mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER < 255 then
mod.InventoryInfo.Level = mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER
else
mod.InventoryInfo.Level = 255
end
end
end)
end
else
---@type table
for i, v in ipairs(crabs) do
local mods = {}
print(string.format("Crab with ID: %s", v.PlayerNamePrivate:ToString()))
---@param wmod FCrabWeaponMod
v.WeaponMods:ForEach(function(index, wmod)
---@class mod FCrabWeaponMod
local mod = wmod:get()
table.insert(mods, mod)
end)
---@param wmod FCrabAbilityMod
v.AbilityMods:ForEach(function(index, wmod)
---@class mod FCrabAbilityMod
local mod = wmod:get()
table.insert(mods, mod)
end)
---@param wmod FCrabMeleeMod
v.MeleeMods:ForEach(function(index, wmod)
---@class mod FCrabMeleeMod
local mod = wmod:get()
table.insert(mods, mod)
end)
---@param wmod FCrabPerk
v.Perks:ForEach(function(index, wmod)
---@class mod FCrabPerk
local mod = wmod:get()
table.insert(mods, mod)
end)
-- Shuffle the mods table so the mods are more random
BenUtils.ShuffleInPlace(mods)
---@type table
local to_upgrade = {}
for index, mod in ipairs(mods) do
if #to_upgrade < LOOPLICATOR_NUM_MODS then
if math.random(2) == 1 then
print(string.format("Upgrading mod with index %d", index))
table.insert(to_upgrade, mod)
end
end
end
print(string.format("We have %s mods to upgrade", #to_upgrade))
for index, mod in ipairs(to_upgrade) do
if mod.InventoryInfo.Level ~= 255 then
if mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER < 255 then
mod.InventoryInfo.Level = mod.InventoryInfo.Level * LOOPLICATOR_MULITPLIER
else
mod.InventoryInfo.Level = 255
end
end
end
end
end
end
end
end
function ToggleLooplicator()
---@type AcrabPC
local player = FindFirstOf("CrabPC")
if LOOPLICATOR_POST_ID == 0 and LOOPLICATOR_POST_ID == 0 then
LOOPLICATOR_PRE_ID, LOOPLICATOR_POST_ID = RegisterHook("/Script/CrabChampions.CrabPC:ClientOnEnteredPortal",
looplicator)
player:ServerSendChatMessage(BenUtils.StringToFString("Enabling looplicator"))
else
UnregisterHook("/Script/CrabChampions.CrabPC:ClientOnEnteredPortal", LOOPLICATOR_PRE_ID, LOOPLICATOR_POST_ID)
LOOPLICATOR_PRE_ID = 0
LOOPLICATOR_POST_ID = 0
player:ServerSendChatMessage(BenUtils.StringToFString("Disabling looplicator"))
end
end
-- End mod functions
-- Register Hooks and Commands
RegisterKeyBind(Key.F3, function()
print("[BenUtils] Enabled Looplicator\n")
ExecuteInGameThread(function()
ToggleLooplicator()
end)
end)
BenUtils.RegisterCommand("looplicator", ToggleLooplicator)
BenUtils.RegisterCommand("loopset", LooplicatorSettings)
-- End Register Hooks and Commands
-- -- Set init values here
-- SetIsActive(false)
-- -- End init values