Jump to content
JimPanzee

How to test .lua code on the fly?

Recommended Posts

Hi, maybe I missed it, but I didn't found a way to effectively test out lua code in the game.

Is there a way to type lua code in some kind of console and have it executed in a running game? Or do I have to write it in my mod files and reload the mod (and than the game) every time I make a change?

Share this post


Link to post
Share on other sites

Hi, maybe I missed it, but I didn't found a way to effectively test out lua code in the game.

Is there a way to type lua code in some kind of console and have it executed in a running game? Or do I have to write it in my mod files and reload the mod (and than the game) every time I make a change?

The Let Me Speak mod I'm testing has a very basic lua interpreter that interprets one line. I've almost completed the interpreter, so if you want I could give you the code for it.

It's basically a singleplayer chat bar, and you can type /lua codehere to launch some code. You can take advantage of this to launch (global) functions from your mod, or from the CheatCore provided, or just run some code in-game. You can also define variables with it.

 

Edit: Here you go. For each of the spoilers is a new lua file, FYI.

 

letmespeakwindow

LMSWindow = ISPanel:derive("LMSWindow");

function LMSWindow:initialise()

    ISPanel.initialise(self);

end

function LMSWindow:new(x, y, width, height)

    local o = {};

    o = ISPanel:new(x, y, width, height);

    setmetatable(o, self);

    self.__index = self;

    o.title = "";

    o.pin = false;

    o:noBackground();

    return o;

end

function LMSWindow:createChildren()

    ISPanel.createChildren(self);

    self.LMSChatBar = ISTextEntryBox:new("", 0, 15, 500, 20)

    self.LMSChatBar:initialise();

    self:addChild(self.LMSChatBar)

end

function LMScreate()

    LMSWindow = LMSWindow:new(35, getCore():getScreenHeight() - 100, 500, 40)

    LMSWindow:addToUIManager();

    LMSWindow:setVisible(false);

end

function KeyListener(_keyPressed)

    if _keyPressed == 20 and not LMSWindow.LMSChatBar:getText() ~= nil then

          if not LMSWindow:getIsVisible() then

              LMSWindow:setVisible(true);

            LMSWindow.LMSChatBar:focus()

          else

              LMSWindow:setVisible(false);

            LMSWindow.LMSChatBar:clear()

          end

    end

end

Events.OnGameStart.Add(LMScreate);

Events.OnKeyPressed.Add(KeyListener);

 

letmespeakcommands(unfinished, but the Lua part works)

 

 

function ISTextEntryBox:onCommandEntered()

    local LMSText = LMSWindow.LMSChatBar:getText()

    local LMSTable = {}

    local LMSKey = 0

    if LMSWindow:getIsVisible() then

        if not string.find(LMSText, "/", 1) then

            getPlayer():Say(LMSText);

        elseif string.match(LMSText, "/") and not string.match(LMSText, "/lua ") then

            for i in string.gmatch(LMSText, "%S+") do

                LMSTable[LMSKey] = i

                LMSKey = LMSKey + 1

            end

            if string.match(LMSText, "/godmode") then

                CheatCore.HandleToggle("God Mode", "CheatCore.IsGod", nil)

            end

            if string.match(LMSText, "/creative") then

                CheatCore.HandleToggle("Creative Mode", "ISBuildMenu.cheat")

            end

            for i = 1,3 do

                print(LMSTable)

                print("Table key is"..tostring(i))

            end

        elseif string.match(LMSText, "/lua ") then

            local LMSTextToLua = string.gsub(LMSText, "/lua ", "")

            loadstring(LMSTextToLua)()

        end

        LMSWindow.LMSChatBar:clear();

        LMSWindow.LMSChatBar:unfocus();

        LMSWindow:setVisible(false);

    end

end

 

CheatCore

 

------------------------------------------------------------

--                                                          --

--   ________               __     ______                    --

--  / ____/ /_  ___  ____ _/ /_   / ____/___  ________       --

-- / /   / __ \/ _ \/ __ `/ __/  / /   / __ \/ ___/ _ \      --

--/ /___/ / / /  __/ /_/ / /_   / /___/ /_/ / /  /  __/      --

--\____/_/ /_/\___/\__,_/\__/   \____/\____/_/   \___/       --

--                                                         --

--                                                          --

------------------------------------------------------------

CheatCore = {}

----------------------------------------------

--Needs/stats/whatever they're called toggle--

----------------------------------------------

CheatCore.ToggleAllStats = false

----------------------------------------------

function CheatCore.HandleToggle(DisplayName, VariableToToggle, Optional) -- CheatType is the string to add to the getPlayer():Say() function, VariableToToggle is the variable to toggle (woah, right?) in string form, and Optional is the optional function to call.

    if VariableToToggle ~= nil then

        if loadstring("return "..VariableToToggle)() == nil then

            loadstring(VariableToToggle.." = false")()

        end

        if loadstring("return "..VariableToToggle)() == false then

            loadstring(VariableToToggle.." = true")() -- concatenates the VariableToToggle string into the " = true" statement, so that I no longer need dedicated toggle functions for every cheat.

            getPlayer():Say(DisplayName.." cheat enabled.")

        else

            loadstring(VariableToToggle.." = false")()

            getPlayer():Say(DisplayName.." cheat disabled.")

        end

    end

    if Optional ~= nil then -- checks if the OptionalCall argument was passed

        loadstring(Optional)()

    end

end

function CheatCore.SetTime(TimeToSet, DayOrMonth)

    local time = getGameTime() -- gets game time

    

    if DayOrMonth == "Time" then

        time:setTimeOfDay( TimeToSet ) -- sets game time to whatever was passed to it.

        getPlayer():Say("Time successfully changed to "..TimeToSet..":00.")

    end

    

    if DayOrMonth == "Day" then

        time:setDay( time:getDay() + TimeToSet )

        

        if time:getDay() == TimeToSet and TimeToSet <= 30 then

            getPlayer():Say("Day successfully changed to "..TimeToSet)

        else

            if time:getDay() >= time:daysInMonth(time:getYear(), time:getMonth()) then

                time:setMonth( time:getMonth() + 1 )

                time:setDay( 0 )

            end

        end

    end

    if DayOrMonth == "Month" then

        time:setMonth( TimeToSet )

        

        if time:getMonth() > 12 then

            time:setYear( time:getYear() + 1 )

            time:setMonth( time:getMonth() + TimeToSet - 12)

        end

    end

    

    if DayOrMonth == "Year" then

        time:setYear( time:getYear() + TimeToSet )

    end

end

CheatCore.DoRefillAmmo = function()

    local primaryHandItemData = getPlayer():getPrimaryHandItem():getModData();

    primaryHandItemData.currentCapacity = primaryHandItemData.maxCapacity

end

CheatCore.DoMaxSkill = function(worldobjects, SkillToSet, ToLevel)

    getPlayer():getXp():setXPToLevel(SkillToSet, ToLevel);

    getPlayer():setNumberOfPerksToPick(ToLevel);

end

CheatCore.DoGhostMode = function(worldobjects)

    if not getPlayer():isGhostMode() then -- checks if player is already ghostmode

        getPlayer():Say("Ghost Mode cheat enabled.")

        getPlayer():setGhostMode(true)

    else

        getPlayer():Say("Ghost Mode cheat disabled.")

        getPlayer():setGhostMode(false)

    end

end

CheatCore.DoRepair = function()

    getPlayer():Say("Weapon repaired!")

    local ToolToRepair = getPlayer():getPrimaryHandItem() -- gets the item in the players hand

    ToolToRepair:setCondition( getPlayer():getPrimaryHandItem():getConditionMax() ) -- gets the maximum condition and sets it to it

end

CheatCore.SpawnZombieNow = function()

    if CheatCore.ZombieBrushEnabled == true then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = player:getZ();

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        local versionNumber = tonumber(string.match(getCore():getVersionNumber(), "%d+")) -- saves version number to variable, for checking versions

    

        if versionNumber <= 31 then -- checks for build 31 and below

            for i = 1,CheatCore.ZombiesToSpawn do

                getVirtualZombieManager():createRealZombieNow(wx,wy,wz);

            end

        else

            if versionNumber >= 32 then -- handles this differently if it is build 32 or above

                spawnHorde(wx,wy,wx,wy,wz,CheatCore.ZombiesToSpawn)

            end

        end

    end

end

CheatCore.DoHeal = function(_player)

    getPlayer():Say("Player healed.")

    getPlayer():getBodyDamage():RestoreToFullHealth();

end

CheatCore.DoDelete = function(_keyPressed)

    if CheatCore.IsDelete == true and _keyPressed == 45 then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = getPlayer():getZ();

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        wx = math.floor(wx);

        wy = math.floor(wy);

        local cell = getWorld():getCell();

        local sq = cell:getGridSquare(wx, wy, wz);

        local sqObjs = sq:getObjects();

        local sqSize = sqObjs:size();

        for i = sqSize-1, 0, -1 do

            local obj = sqObjs:get(i);

            if i > 0 then -- checks for floor, otherwise it'd leave a gaping hole

                sq:getSpecialObjects():remove(obj);

                sq:getObjects():remove(obj);

            end        

        end

    end

end

CheatCore.DoFireNow = function()

    if CheatCore.FireBrushEnabled == true then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = math.floor(player:getZ());

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        wx = math.floor(wx);

        wy = math.floor(wy);

        local cell = getWorld():getCell();

        local GridToBurn = cell:getGridSquare(wx, wy, wz)

        GridToBurn:StartFire();

    end

end

CheatCore.AllStatsToggle = function(_player)

    if CheatCore.ToggleAllStats == false then

        getPlayer():Say("Infinite stats enabled.")

        CheatCore.IsHunger = true

        CheatCore.IsThirst = true

        CheatCore.IsPanic = true

        CheatCore.IsSanity = true

        CheatCore.IsStress = true

        CheatCore.IsBoredom = true

        CheatCore.IsAnger = true

        CheatCore.IsPain = true

        CheatCore.IsSick = true

        CheatCore.IsEndurance = true

        CheatCore.IsFitness = true

        CheatCore.IsSleep = true

        CheatCore.ToggleAllStats = true

    else

        getPlayer():Say("Infinite stats disabled.")

        CheatCore.IsHunger = false

        CheatCore.IsThirst = false

        CheatCore.IsPanic = false

        CheatCore.IsSanity = false

        CheatCore.IsStress = false

        CheatCore.IsBoredom = false

        CheatCore.IsAnger = false

        CheatCore.IsPain = false

        CheatCore.IsSick = false

        CheatCore.IsEndurance = false

        CheatCore.IsFitness = false

        CheatCore.IsSleep = false

        CheatCore.ToggleAllStats = false

    end

end

CheatCore.DoCheats = function()

    

    if CheatCore.IsGod == true then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if CheatCore.IsAmmo == true then

        local primaryHandItemData = getPlayer():getPrimaryHandItem():getModData();

        if primaryHandItemData.currentCapacity >= 0 then

            primaryHandItemData.currentCapacity = primaryHandItemData.maxCapacity

        end

    end

    

    if CheatCore.IsHunger == true then

        getPlayer():getStats():setHunger(0);

    end

    

    if CheatCore.IsThirst == true then

        getPlayer():getStats():setThirst(0);

    end

    

    if CheatCore.IsPanic == true then

        getPlayer():getStats():setPanic(0);

    end

    

    if CheatCore.IsSanity == true then

        getPlayer():getStats():setSanity(1);

    end

    

    if CheatCore.IsStress == true then

        getPlayer():getStats():setStress(0);

    end

    

    if CheatCore.IsBoredom == true then

        getPlayer():getStats():setBoredom(0);

    end

    

    if CheatCore.IsAnger == true then

        getPlayer():getStats():setAnger(0);

    end

    

    if CheatCore.IsPain == true then

        getPlayer():getStats():setPain(0);

    end

    

    if CheatCore.IsSick == true then

        getPlayer():getStats():setSickness(0)

    end

    

    if CheatCore.IsEndurance == true then

        getPlayer():getStats():setEndurance(1);

    end

    

    if CheatCore.IsFitness == true then

    getPlayer():getStats():setFitness(1);

    end

    

    if CheatCore.IsSleep == true then

        getPlayer():getStats():setFatigue(0);

    end

    

    if CheatCore.IsWeightThing == true then

        getPlayer():setMaxWeightBase( 999999 )

    end

    

    if CheatCore.IsWeightThing == false then

        getPlayer():setMaxWeightBase( 8 );

    end

    

    if getPlayer():getBodyDamage():getHealth() <= 5 and CheatCore.DoPreventDeath == true then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if IsRepair == true and getPlayer():getPrimaryHandItem():getCondition() < getPlayer():getPrimaryHandItem():getConditionMax() then

        local ToolToRepair = getPlayer():getPrimaryHandItem() -- basically does the same thing as DoRepair

        ToolToRepair:setCondition( getPlayer():getPrimaryHandItem():getConditionMax() )

    end

end

CheatCore.DoTraitCheats = function() -- also does some other things

    if getPlayer():HasTrait("permagod") then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if getPlayer():HasTrait("permacreative") then

        ISBuildMenu.cheat = true

    end

    

    if getPlayer():HasTrait("permaweight") then

        getPlayer():setMaxWeightBase( 999999 );

    end

    

    if CheatCore.IsMelee == true and CheatCore.HasSwitchedWeapon ~= getPlayer():getPrimaryHandItem():getName() and not getPlayer():getPrimaryHandItem():isRanged() then

        getPlayer():Say("Re-initializing melee insta-kill cheat")

        CheatCore.DoWeaponDamage()

    else

        if CheatCore.IsMelee == true and CheatCore.HasSwitchedWeapon ~= getPlayer():getPrimaryHandItem():getName() and getPlayer():getPrimaryHandItem():isRanged() then

            getPlayer():Say("Non-melee weapon detected! Please switch back and disable the cheat.")

        end

    end

end

CheatCore.DoWeaponDamage = function()

    local weapon = getPlayer():getPrimaryHandItem()

    

    if CheatCore.IsMelee == true and not getPlayer():getPrimaryHandItem():isRanged() then

        CheatCore.HasSwitchedWeapon = getPlayer():getPrimaryHandItem():getName() -- stores name in variable, so if the player switches weapons DoCheats will detect it and disable the cheat, otherwise things get a bit messy

        

        originalMinDamage = weapon:getMinDamage() -- gets the original value, to make it toggleable

        originalMaxDamage = weapon:getMaxDamage()

        originalDoorDamage = weapon:getDoorDamage()

        originalTreeDamage = weapon:getTreeDamage()

        

        weapon:setMinDamage( 999 );

        weapon:setMaxDamage( 999 );

        weapon:setDoorDamage( 999 );

        weapon:setTreeDamage( 999 );

    else if CheatCore.IsMelee == true and getPlayer():getPrimaryHandItem():isRanged() then

            getPlayer():Say("Non-melee weapon detected! Melee insta-kill disabled.")

            CheatCore.IsMelee = false

        end

    end

    

    if CheatCore.IsMelee == false then

        weapon:setMinDamage( originalMinDamage ); -- returns the original weapon values

        weapon:setMaxDamage( originalMaxDamage );

        weapon:setDoorDamage( originalDoorDamage );

        weapon:setTreeDamage( originalTreeDamage );

    end    

end

CheatCore.DoNoReload = function()

    if CheatCore.IsMelee == true then -- checks to make sure that IsMelee is enabled, and if it is then it disables it.

        CheatCore.IsMelee = false

        CheatCore.DoWeaponDamage()

    end

    

    

    local weapon = getPlayer():getPrimaryHandItem()

    

    

    if CheatCore.NoReload == true then

        originalRecoilDelay = weapon:getRecoilDelay() -- again, saves the normal values into variables

        

        weapon:setRecoilDelay( 0 ) -- due to how the games code works, I can't set it under 0, or the class file that handles this function will just set it back to 0.

    end

    

    if CheatCore.NoReload == false then

        weapon:setRecoilDelay( originalRecoilDelay ) -- and again, it then restores the old values when disabled

    end

end

CheatCore.DoMaxAllSkills = function()

        getPlayer():Say("All skills maxed!")

        

        getPlayer():getXp():AddXP(Perks.Sprinting, 999999);

        getPlayer():getXp():AddXP(Perks.Lightfoot, 999999);

        getPlayer():getXp():AddXP(Perks.Nimble, 999999);

        getPlayer():getXp():AddXP(Perks.Sneak, 999999);

        getPlayer():getXp():AddXP(Perks.Cooking, 999999);

        getPlayer():getXp():AddXP(Perks.Woodwork, 999999);

        getPlayer():getXp():AddXP(Perks.Farming, 999999);

        getPlayer():getXp():AddXP(Perks.Axe, 999999);

        getPlayer():getXp():AddXP(Perks.Blunt, 999999);

        getPlayer():getXp():AddXP(Perks.Aiming, 999999);

        getPlayer():getXp():AddXP(Perks.Reloading, 999999);

        getPlayer():getXp():AddXP(Perks.Fishing, 999999);

        getPlayer():getXp():AddXP(Perks.Trapping, 999999);

        getPlayer():getXp():AddXP(Perks.BluntGuard, 999999);

        getPlayer():getXp():AddXP(Perks.BluntMaintenance, 999999);

        getPlayer():getXp():AddXP(Perks.BladeGuard, 999999);

        getPlayer():getXp():AddXP(Perks.BladeMaintenance, 999999);

        getPlayer():getXp():AddXP(Perks.PlantScavenging, 999999);

        getPlayer():getXp():AddXP(Perks.Doctor, 999999);

        

end

    Events.OnPlayerUpdate.Add(CheatCore.DoCheats);

    Events.OnTick.Add(CheatCore.DoTraitCheats);

    Events.OnMouseDown.Add(CheatCore.DoFireNow);

    Events.OnMouseDown.Add(CheatCore.SpawnZombieNow);

    Events.OnKeyPressed.Add(CheatCore.DoDelete);

Share this post


Link to post
Share on other sites

@Suomiboi: Oh, ok I did read the post about the debugger but may be to blind to see the part about loading a file. Thank you for the information. :)

 

@ethanwdp: Wow. Nice. That is exactly what I had in mind to mod myself. I will try to expand it with some kind of auto completion. I thought about reading all the lua files with "luadoc" and indexing the functions in a file. Than using tooltips to show available functions. Are custom tooltips at an edit-field possible?

Share this post


Link to post
Share on other sites

@Suomiboi: Oh, ok I did read the post about the debugger but may be to blind to see the part about loading a file. Thank you for the information. :)

 

@ethanwdp: Wow. Nice. That is exactly what I had in mind to mod myself. I will try to expand it with some kind of auto completion. I thought about reading all the lua files with "luadoc" and indexing the functions in a file. Than using tooltips to show available functions. Are custom tooltips at an edit-field possible?

Some of the code there was from an early version, so the lua interpreter might be buggy (fixed version below)

And for your question, I have no clue. I don't have much experience with lua interpreters. That was my first time making one :P

Not too sure how autocompletion would work. The ISTextEntryBox doesn't support tooltips AFAIK.

 

Btw, here's an updated lua interpreter, because the last one couldn't even accept spaces:

 

letmespeakcommands

function ISTextEntryBox:onCommandEntered()

    local LMSText = LMSWindow.LMSChatBar:getText()

    local LMSTable = {}

    local LMSKey = 0

    if LMSWindow:getIsVisible() then

        if not string.find(LMSText, "/", 1) then

            getPlayer():Say(LMSText);

        elseif string.match(LMSText, "/") and not string.match(LMSText, "/lua ") then

            for i in string.gmatch(LMSText, "%S+") do

                LMSTable[LMSKey] = i

                LMSKey = LMSKey + 1

            end

            if string.match(LMSText, "/godmode") then

                CheatCore.HandleToggle("God Mode", "CheatCore.IsGod", nil)

            end

            if string.match(LMSText, "/creative") then

                CheatCore.HandleToggle("Creative Mode", "ISBuildMenu.cheat")

            end

            if string.match(LMSText, "/deletemode") then

                CheatCore.HandleToggle("Delete Mode (X to Delete)", "CheatCore.IsDelete")

            end

            if string.match(LMSText, "/toggleneed") then

                local LMSTextToToggleNeed = "CheatCore.Is"..LMSTable[1]

                print(LMSTextToToggleNeed)

                CheatCore.HandleToggle(LMSTable[1], string.gsub(LMSTextToToggleNeed, "%a", string.upper, 1))

            end

            for i = 1,3 do

                print(LMSTable)

                print("Table key is"..tostring(i))

            end

        elseif string.match(LMSText, "/lua ") then

            local LMSTextToLua = string.gsub(LMSText, "/lua ", "")

            loadstring(LMSTextToLua)()

        end

        LMSWindow.LMSChatBar:clear();

        LMSWindow.LMSChatBar:unfocus();

        LMSWindow:setVisible(false);

    end

end

 

Updated CheatCore:

------------------------------------------------------------

--                                                          --

--   ________               __     ______                    --

--  / ____/ /_  ___  ____ _/ /_   / ____/___  ________       --

-- / /   / __ \/ _ \/ __ `/ __/  / /   / __ \/ ___/ _ \      --

--/ /___/ / / /  __/ /_/ / /_   / /___/ /_/ / /  /  __/      --

--\____/_/ /_/\___/\__,_/\__/   \____/\____/_/   \___/       --

--                                                         --

--                                                          --

------------------------------------------------------------

CheatCore = {}

----------------------------------------------

--Needs/stats/whatever they're called toggle--

----------------------------------------------

CheatCore.ToggleAllStats = false

----------------------------------------------

CheatCore.HandleToggle = function(DisplayName, VariableToToggle, Optional) -- CheatType is the string to add to the getPlayer():Say() function, VariableToToggle is the variable to toggle (woah, right?) in string form, and Optional is the optional function to call.

    if VariableToToggle ~= nil then

        if loadstring("return "..VariableToToggle)() == nil then

            loadstring(VariableToToggle.." = false")()

        end

        if loadstring("return "..VariableToToggle)() == false then

            loadstring(VariableToToggle.." = true")() -- concatenates the VariableToToggle string into the " = true" statement, so that I no longer need dedicated toggle functions for every cheat.

            getPlayer():Say(DisplayName.." cheat enabled.")

        else

            loadstring(VariableToToggle.." = false")()

            getPlayer():Say(DisplayName.." cheat disabled.")

        end

    end

    if Optional ~= nil then -- checks if the OptionalCall argument was passed

        loadstring(Optional)()

    end

end

CheatCore.SetTime = function(TimeToSet, DayOrMonth)

    local time = getGameTime() -- gets game time

    

    if DayOrMonth == "Time" then

        time:setTimeOfDay( TimeToSet ) -- sets game time to whatever was passed to it.

        getPlayer():Say("Time successfully changed to "..TimeToSet..":00.")

    end

    

    if DayOrMonth == "Day" then

        time:setDay( time:getDay() + TimeToSet )

        

        if time:getDay() == TimeToSet and TimeToSet <= 30 then

            getPlayer():Say("Day successfully changed to "..TimeToSet)

        else

            if time:getDay() >= time:daysInMonth(time:getYear(), time:getMonth()) then

                time:setMonth( time:getMonth() + 1 )

                time:setDay( 0 )

            end

        end

    end

    if DayOrMonth == "Month" then

        local roundToProperMonth = time:getMonth() + TimeToSet

        time:setMonth( time:getMonth() + TimeToSet )

        

        if time:getMonth() > 12 then

            time:setYear( time:getYear() + 1 )

            time:setMonth( roundToProperMonth - 12 )

        end

    end

    

    if DayOrMonth == "Year" then

        time:setYear( time:getYear() + TimeToSet )

    end

end

CheatCore.DoRefillAmmo = function()

    local primaryHandItemData = getPlayer():getPrimaryHandItem():getModData();

    primaryHandItemData.currentCapacity = primaryHandItemData.maxCapacity

end

CheatCore.DoMaxSkill = function(worldobjects, SkillToSet, ToLevel)

    getPlayer():getXp():setXPToLevel(SkillToSet, ToLevel);

    getPlayer():setNumberOfPerksToPick(ToLevel);

end

CheatCore.DoGhostMode = function()

    if not getPlayer():isGhostMode() then -- checks if player is already ghostmode

        getPlayer():Say("Ghost Mode cheat enabled.")

        getPlayer():setGhostMode(true)

    else

        getPlayer():Say("Ghost Mode cheat disabled.")

        getPlayer():setGhostMode(false)

    end

end

CheatCore.DoRepair = function()

    getPlayer():Say("Weapon repaired!")

    local ToolToRepair = getPlayer():getPrimaryHandItem() -- gets the item in the players hand

    ToolToRepair:setCondition( getPlayer():getPrimaryHandItem():getConditionMax() ) -- gets the maximum condition and sets it to it

end

CheatCore.SpawnZombieNow = function()

    if CheatCore.ZombieBrushEnabled == true then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = player:getZ();

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        local versionNumber = tonumber(string.match(getCore():getVersionNumber(), "%d+")) -- saves version number to variable, for checking versions

    

        if versionNumber <= 31 then -- checks for build 31 and below

            for i = 1,CheatCore.ZombiesToSpawn do

                getVirtualZombieManager():createRealZombieNow(wx,wy,wz);

            end

        else

            if versionNumber >= 32 then -- handles this differently if it is build 32 or above

                spawnHorde(wx,wy,wx,wy,wz,CheatCore.ZombiesToSpawn)

            end

        end

    end

end

CheatCore.DoHeal = function(_player)

    getPlayer():Say("Player healed.")

    getPlayer():getBodyDamage():RestoreToFullHealth();

end

CheatCore.DoDelete = function(_keyPressed)

    if CheatCore.IsDelete == true and _keyPressed == 45 then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = getPlayer():getZ();

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        wx = math.floor(wx);

        wy = math.floor(wy);

        local cell = getWorld():getCell();

        local sq = cell:getGridSquare(wx, wy, wz);

        local sqObjs = sq:getObjects();

        local sqSize = sqObjs:size();

        for i = sqSize-1, 0, -1 do

            local obj = sqObjs:get(i);

            if i > 0 then -- checks for floor, otherwise it'd leave a gaping hole

                sq:getSpecialObjects():remove(obj);

                sq:getObjects():remove(obj);

            end        

        end

    end

end

CheatCore.DoFireNow = function()

    if CheatCore.FireBrushEnabled == true then

        local mx = getMouseXScaled();

        local my = getMouseYScaled();

        local player = getPlayer();

        local wz = math.floor(player:getZ());

        local wx, wy = ISCoordConversion.ToWorld(mx, my, wz);

        wx = math.floor(wx);

        wy = math.floor(wy);

        local cell = getWorld():getCell();

        local GridToBurn = cell:getGridSquare(wx, wy, wz)

        GridToBurn:StartFire();

    end

end

CheatCore.AllStatsToggle = function(_player)

    if CheatCore.ToggleAllStats == false then

        getPlayer():Say("Infinite stats enabled.")

        CheatCore.IsHunger = true

        CheatCore.IsThirst = true

        CheatCore.IsPanic = true

        CheatCore.IsSanity = true

        CheatCore.IsStress = true

        CheatCore.IsBoredom = true

        CheatCore.IsAnger = true

        CheatCore.IsPain = true

        CheatCore.IsSick = true

        CheatCore.IsEndurance = true

        CheatCore.IsFitness = true

        CheatCore.IsSleep = true

        CheatCore.ToggleAllStats = true

    else

        getPlayer():Say("Infinite stats disabled.")

        CheatCore.IsHunger = false

        CheatCore.IsThirst = false

        CheatCore.IsPanic = false

        CheatCore.IsSanity = false

        CheatCore.IsStress = false

        CheatCore.IsBoredom = false

        CheatCore.IsAnger = false

        CheatCore.IsPain = false

        CheatCore.IsSick = false

        CheatCore.IsEndurance = false

        CheatCore.IsFitness = false

        CheatCore.IsSleep = false

        CheatCore.ToggleAllStats = false

    end

end

CheatCore.DoCheats = function()

    

    if CheatCore.IsGod == true then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if CheatCore.IsAmmo == true then

        local primaryHandItemData = getPlayer():getPrimaryHandItem():getModData();

        if primaryHandItemData.currentCapacity >= 0 then

            primaryHandItemData.currentCapacity = primaryHandItemData.maxCapacity

        end

    end

    

    if CheatCore.IsHunger == true then

        getPlayer():getStats():setHunger(0);

    end

    

    if CheatCore.IsThirst == true then

        getPlayer():getStats():setThirst(0);

    end

    

    if CheatCore.IsPanic == true then

        getPlayer():getStats():setPanic(0);

    end

    

    if CheatCore.IsSanity == true then

        getPlayer():getStats():setSanity(1);

    end

    

    if CheatCore.IsStress == true then

        getPlayer():getStats():setStress(0);

    end

    

    if CheatCore.IsBoredom == true then

        getPlayer():getStats():setBoredom(0);

    end

    

    if CheatCore.IsAnger == true then

        getPlayer():getStats():setAnger(0);

    end

    

    if CheatCore.IsPain == true then

        getPlayer():getStats():setPain(0);

    end

    

    if CheatCore.IsSick == true then

        getPlayer():getStats():setSickness(0)

    end

    

    if CheatCore.IsEndurance == true then

        getPlayer():getStats():setEndurance(1);

    end

    

    if CheatCore.IsFitness == true then

    getPlayer():getStats():setFitness(1);

    end

    

    if CheatCore.IsSleep == true then

        getPlayer():getStats():setFatigue(0);

    end

    

    if CheatCore.IsWeightThing == true then

        getPlayer():setMaxWeightBase( 999999 )

    end

    

    if CheatCore.IsWeightThing == false then

        getPlayer():setMaxWeightBase( 8 );

    end

    

    if getPlayer():getBodyDamage():getHealth() <= 5 and CheatCore.DoPreventDeath == true then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if CheatCore.IsRepair == true and getPlayer():getPrimaryHandItem():getCondition() < getPlayer():getPrimaryHandItem():getConditionMax() then

        local ToolToRepair = getPlayer():getPrimaryHandItem() -- basically does the same thing as DoRepair

        ToolToRepair:setCondition( getPlayer():getPrimaryHandItem():getConditionMax() )

    end

end

CheatCore.DoTraitCheats = function() -- also does some other things

    if getPlayer():HasTrait("permagod") then

        getPlayer():getBodyDamage():RestoreToFullHealth();

    end

    

    if getPlayer():HasTrait("permacreative") then

        ISBuildMenu.cheat = true

    end

    

    if getPlayer():HasTrait("permaweight") then

        getPlayer():setMaxWeightBase( 999999 );

    end

    

    if CheatCore.IsMelee == true and CheatCore.HasSwitchedWeapon ~= getPlayer():getPrimaryHandItem():getName() and not getPlayer():getPrimaryHandItem():isRanged() then

        getPlayer():Say("Re-initializing melee insta-kill cheat")

        CheatCore.DoWeaponDamage()

    else

        if CheatCore.IsMelee == true and CheatCore.HasSwitchedWeapon ~= getPlayer():getPrimaryHandItem():getName() and getPlayer():getPrimaryHandItem():isRanged() then

            getPlayer():Say("Non-melee weapon detected! Please switch back and disable the cheat.")

        end

    end

end

CheatCore.DoWeaponDamage = function()

    local weapon = getPlayer():getPrimaryHandItem()

    

    if CheatCore.IsMelee == true and not getPlayer():getPrimaryHandItem():isRanged() then

        CheatCore.HasSwitchedWeapon = getPlayer():getPrimaryHandItem():getName() -- stores name in variable, so if the player switches weapons DoCheats will detect it and disable the cheat, otherwise things get a bit messy

        

        originalMinDamage = weapon:getMinDamage() -- gets the original value, to make it toggleable

        originalMaxDamage = weapon:getMaxDamage()

        originalDoorDamage = weapon:getDoorDamage()

        originalTreeDamage = weapon:getTreeDamage()

        

        weapon:setMinDamage( 999 );

        weapon:setMaxDamage( 999 );

        weapon:setDoorDamage( 999 );

        weapon:setTreeDamage( 999 );

    else if CheatCore.IsMelee == true and getPlayer():getPrimaryHandItem():isRanged() then

            getPlayer():Say("Non-melee weapon detected! Melee insta-kill disabled.")

            CheatCore.IsMelee = false

        end

    end

    

    if CheatCore.IsMelee == false then

        weapon:setMinDamage( originalMinDamage ); -- returns the original weapon values

        weapon:setMaxDamage( originalMaxDamage );

        weapon:setDoorDamage( originalDoorDamage );

        weapon:setTreeDamage( originalTreeDamage );

    end    

end

CheatCore.DoNoReload = function()

    if CheatCore.IsMelee == true then -- checks to make sure that IsMelee is enabled, and if it is then it disables it.

        CheatCore.IsMelee = false

        CheatCore.DoWeaponDamage()

    end

    

    

    local weapon = getPlayer():getPrimaryHandItem()

    

    

    if CheatCore.NoReload == true then

        originalRecoilDelay = weapon:getRecoilDelay() -- again, saves the normal values into variables

        

        weapon:setRecoilDelay( 0 ) -- due to how the games code works, I can't set it under 0, or the class file that handles this function will just set it back to 0.

    end

    

    if CheatCore.NoReload == false then

        weapon:setRecoilDelay( originalRecoilDelay ) -- and again, it then restores the old values when disabled

    end

end

CheatCore.DoMaxAllSkills = function()

        getPlayer():Say("All skills maxed!")

        

        getPlayer():getXp():AddXP(Perks.Sprinting, 999999);

        getPlayer():getXp():AddXP(Perks.Lightfoot, 999999);

        getPlayer():getXp():AddXP(Perks.Nimble, 999999);

        getPlayer():getXp():AddXP(Perks.Sneak, 999999);

        getPlayer():getXp():AddXP(Perks.Cooking, 999999);

        getPlayer():getXp():AddXP(Perks.Woodwork, 999999);

        getPlayer():getXp():AddXP(Perks.Farming, 999999);

        getPlayer():getXp():AddXP(Perks.Axe, 999999);

        getPlayer():getXp():AddXP(Perks.Blunt, 999999);

        getPlayer():getXp():AddXP(Perks.Aiming, 999999);

        getPlayer():getXp():AddXP(Perks.Reloading, 999999);

        getPlayer():getXp():AddXP(Perks.Fishing, 999999);

        getPlayer():getXp():AddXP(Perks.Trapping, 999999);

        getPlayer():getXp():AddXP(Perks.BluntGuard, 999999);

        getPlayer():getXp():AddXP(Perks.BluntMaintenance, 999999);

        getPlayer():getXp():AddXP(Perks.BladeGuard, 999999);

        getPlayer():getXp():AddXP(Perks.BladeMaintenance, 999999);

        getPlayer():getXp():AddXP(Perks.PlantScavenging, 999999);

        getPlayer():getXp():AddXP(Perks.Doctor, 999999);

        

end

    Events.OnPlayerUpdate.Add(CheatCore.DoCheats);

    Events.OnTick.Add(CheatCore.DoTraitCheats);

    Events.OnMouseDown.Add(CheatCore.DoFireNow);

    Events.OnMouseDown.Add(CheatCore.SpawnZombieNow);

    Events.OnKeyPressed.Add(CheatCore.DoDelete);

I would throw up a download, but the rest of this mod still needs a lot of work. Hope that works in the meantime.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...