From c16018370055ed271d6d4dc96c31879aa99c0a17 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Fri, 23 Aug 2024 23:39:19 +1000 Subject: [PATCH] first commit --- README.md | 4 + Scripts/main.lua | 335 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 339 insertions(+) create mode 100644 README.md create mode 100644 Scripts/main.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..dbfd2f2 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Crab Champions Utilities Mod + +This uses [UE4SS 2.5.2](https://github.com/UE4SS-RE/RE-UE4SS) + diff --git a/Scripts/main.lua b/Scripts/main.lua new file mode 100644 index 0000000..db7823b --- /dev/null +++ b/Scripts/main.lua @@ -0,0 +1,335 @@ +print("[BenUtils] Loaded and waiting!") + +--- Swapping to use register/unregister +-- Disable looplicator by default +-- LOOPLICATOR_ENABLED = false +-- + + +-- Globals +LOOPLICATOR_PRE_ID = 0 +LOOPLICATOR_POST_ID = 0 +LOOPLICATOR_MULITPLIER = 2 +LOOPLICATOR_ROUNDS = 10 +LOOPLICATOR_XL_COST = 1 + +COMMANDS_REGISTERED = {} +-- End Globals + +---@param command string +---@param callback function +function RegisterCommand(command, callback) + COMMANDS_REGISTERED[command] = callback + print(string.format("[BenUtils] Registered command %s", command)) +end + +function FindKeyTodem() + print("test") + ---@type table + local todems = FindAllOf("CrabTotem") + print("Found " .. #todems .. " todems") + for i, item in ipairs(todems) do + if item.TotemType == 3 then + return item + end + end +end + +---@param PlayerName string +function GetPlayerStateByName(PlayerName) + local crabs = FindAllOf("CrabPS") + for _, v in ipairs(crabs) do + -- local crab = v:get() + if v.PlayerNamePrivate:ToString() == PlayerName then + return v + end + end + return nil +end + +function LookupCCWeaponByName(itemname) + +end + +function LookupCCPerkByName(itemname) + ---@type table + local perks = FindAllOf("CrabPerkDA") + print("Found " .. #perks .. " perks") + for i, item in ipairs(perks) do + if item.Name:ToString() == itemname then + return item + end + end + return nil +end + +function LookupCCAbilityByName(itemname) + +end + +function LookupCCMeleeByName(itemname) + +end + +function LookupCCArtifactByName(itemname) + +end + +-- Force UI Refresh? ACrabPC:ClientRefreshPSUI + +---@param CRAB ACrabInteractPickup +---@param nim any +function CheckReturnedSelf(CRAB, nim) + -- print(string.format("You have: %d crystals\n", CRAB.Keys)) + print(nim.PickupInfo.PickupDA.Name:ToString()) +end + +function SetScaleMultiplier() + ---@param crab ACrabPS + local crab = FindFirstOf("CrabPS") + print(type(crab)) + if crab then + print(string.format("[BenUtils] The current ScaleMultiplier is: %.3f", crab.ScaleMultiplier)) + end +end + +function GiveInitialStreamerLoot() + -- Get a copy of the game state and a list of players and the StreamerLoot item + local streamerloot = LookupCCPerkByName("Streamer Loot") + local gamestate = FindFirstOf("CrabGS") + local crabs = FindAllOf("CrabPS") + local crabss = FindAllOf("CrabPC") + local key_totem = FindKeyTodem() + crabs[1].Crystals = 10000000000 + crabss[1]:ClientRefreshPSUI() + ---@param v ACrabPS + -- for i, v in ipairs(crabs) do + -- v.ServerSpawnKeyTotemPickup(key_totem,) + + -- print(string.format("%d", x.TotemType)) + -- end +end + +---@param PlayerName string +function GiveCrystalsToPlayer(PlayerName, ...) + local args = table.pack(...) + ---@type ACrabPS + local player = GetPlayerStateByName(PlayerName) + if player and #args == 1 then + player.Crystals = tonumber(args[1]) or player.Crystals + end +end + +function GibCrystals() + local crabs = FindAllOf("CrabPS") + + if crabs then + ---@param v ACrabPS + for i, v in ipairs(crabs) do + v.Crystals = 10000000 + end + end +end + +function SetAllPerks100() + local crabs = FindAllOf("CrabPS") + + if crabs then + ---@param v ACrabPS + for i, v in ipairs(crabs) do + print(string.format("Crab with ID: %s", v.PlayerNamePrivate:ToString())) + if v.PlayerNamePrivate:ToString() == "Aztec" then + ---@param wmod FCrabWeaponMod + v.WeaponMods:ForEach(function(index, wmod) + ---@class mod FCrabWeaponMod + local mod = wmod:get() + if mod.InventoryInfo.Level <= 100 then + mod.InventoryInfo.Level = 100 + end + end) + ---@param wmod FCrabAbilityMod + v.AbilityMods:ForEach(function(index, wmod) + ---@class mod FCrabAbilityMod + local mod = wmod:get() + if mod.InventoryInfo.Level <= 100 then + mod.InventoryInfo.Level = 100 + end + end) + ---@param wmod FCrabMeleeMod + v.MeleeMods:ForEach(function(index, wmod) + ---@class mod FCrabMeleeMod + local mod = wmod:get() + if mod.InventoryInfo.Level <= 100 then + mod.InventoryInfo.Level = 100 + end + end) + ---@param wmod FCrabPerk + v.Perks:ForEach(function(index, wmod) + ---@class mod FCrabPerk + local mod = wmod:get() + if mod.InventoryInfo.Level <= 100 then + mod.InventoryInfo.Level = 100 + end + end) + end + end + end +end + +function looplicator() + local gamestate = FindFirstOf("CrabGS") + + local island_num = gamestate.CurrentIsland + if island_num % (LOOPLICATOR_ROUNDS) == 0.00 then + gamestate.XLLevel = 1 + 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 + ---@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 + end + end +end + +function enable_looplicator() + if LOOPLICATOR_POST_ID == 0 and LOOPLICATOR_POST_ID == 0 then + LOOPLICATOR_PRE_ID, LOOPLICATOR_POST_ID = RegisterHook("/Script/CrabChampions.CrabPC:ClientOnEnteredPortal", + looplicator) + else + UnregisterHook("/Script/CrabChampions.CrabPC:ClientOnEnteredPortal", LOOPLICATOR_PRE_ID, LOOPLICATOR_POST_ID) + LOOPLICATOR_PRE_ID = 0 + LOOPLICATOR_POST_ID = 0 + end +end + +---@param PlayerName string +function RollTheDice(PlayerName, ...) + print("[BenUtil] Got chat command rtd from " .. PlayerName) + local args = table.pack(...) + for k, v in ipairs(args) do + print(string.format("[BenUtil] Arg: %s", v)) + end + -- print(string.format("[BenUtil] %d arguments sent", args.n)) +end + +---@param PlayerName FString +---@param ChatMessage FString +function ParseChatCommand(self, PlayerName, ChatMessage) + local playername = PlayerName:get() + local chatmessage = ChatMessage:get() + local firstchar = string.sub(chatmessage:ToString(), 1, 1) + ---@type table + local command = {} + if firstchar == "/" then + for i in string.gmatch(chatmessage:ToString(), "%S+") do + table.insert(command, i) + end + local cmd = string.sub(command[1], 2, #command[1]) + -- local args = table.remove(command, 1) + if COMMANDS_REGISTERED[cmd] then + COMMANDS_REGISTERED[cmd](playername:ToString(), table.unpack(command, 2, #command)) + end + end +end + +---@param KeyTotem ACrabTotem +function TestThing(self, KeyTotem) + local test = KeyTotem:get() + print(string.format("%d", test.NumBuffs)) + print(string.format("%d", test.NumDeBuffs)) + print(string.format("%d", test.Cost)) +end + +---@param NextIslandInfo FCrabNextIslandInfo +function TestThing2(self, NextIslandInfo) + local test = NextIslandInfo:get() + print(string.format("%d", test.CurrentIsland)) + -- print(string.format("%d", test.NumDeBuffs)) + -- print(string.format("%d", test.Cost)) +end + +-- RegisterKeyBind(Key.F1, function() +-- print("[BenUtils] Set Perks to 100\n") +-- ExecuteInGameThread(function() +-- SetAllPerks100() +-- end) +-- end) + +-- RegisterKeyBind(Key.F2, function() +-- print("[BenUtils] Money Money Money\n") +-- ExecuteInGameThread(function() +-- GibCrystals() +-- end) +-- end) + +RegisterKeyBind(Key.F3, function() + print("[BenUtils] Enabled Looplicator\n") + ExecuteInGameThread(function() + enable_looplicator() + end) +end) + +-- RegisterHook("/Script/CrabChampions.CrabPC:ClientOnInteractedWithKeyTotem", TestThing) +-- RegisterHook("/Script/CrabChampions.CrabPC:ClientOnEnteredPortal", TestThing2) +RegisterHook("/Script/CrabChampions.CrabPC:ClientOnReceivedChatMessage", ParseChatCommand) +RegisterCommand("rtd", RollTheDice) +RegisterCommand("dosh", GiveCrystalsToPlayer) +-- RegisterHook("/Script/CrabChampions.CrabPC:ClientOnInteractedWithKeyTotem", TestThing); +-- NotifyOnNewObject("/Script/Engine.Actor", function(ConstructedObject) +-- print(string.format("Constructed: %s\n", ConstructedObject:GetFullName())) +-- end) + +--- CrabInteractPickup /Game/Island/Persistent.Persistent:PersistentLevel.CrabInteractPickup_2147481644