Player Object Documentation

Overview

The Player object in GrowSoft provides access to player-specific data, actions, and UI interactions. Most methods are used with the colon operator (player:methodName()).


Player Currency

player:getGems() -- Returns the player's gems count.
player:addGems(amount, sendPacket:optional, isDisplay:optional) -- Adds gems to the player.
player:removeGems(amount, sendPacket:optional, isDisplay:optional) -- Removes gems from the player.
player:setGems(number) -- Sets the player's gems count.
player:getCoins() -- Returns the player's coins count.
player:removeCoins(amount, sendPacket:optional) -- Removes coins from the player.
player:setCoins(number) -- Sets the player's coins count.
player:getBankBalance() -- Returns bank balance.
player:addBankBalance(amount) -- Adds to bank balance.
player:setBankBalance(number) -- Sets bank balance.
player:removeBankBalance(amount) -- Removes from bank balance.

Player Position

player:getPosX()
player:getPosY()
player:getMiddlePosX()

Player Inventory

player:getInventorySize() -- Returns the player's inventory size.
player:isMaxInventorySpace() -- Returns true if inventory is full.
player:upgradeInventorySpace(amount) -- Increases inventory slots.
player:getItemAmount(itemID) -- Returns the count of a specific item.
player:changeItem(itemID, amount, sendPacket) -- Adds/removes an item.
player:getInventoryItems() -- Returns table of all inventory items.
player:getClothingItemID([clothesID]) -- Returns a clothing item's ID.
player:getBackpackUsedSize() -- Returns backpack used slots.
player:setSlots(slotAmount) -- Sets the player's slots.

Player Stats

player:getGems()
player:getCoins()
player:getUnlockedAchievementsCount()
player:getAchievementsCount()
player:isFacingLeft()
player:isOnline()

Player UI & Dialogs

player:onConsoleMessage(message) -- send console message to the player.
player:onTalkBubble(netID, message, isApi) -- Show a talk bubble, netID set to player:getNetID() if you want only you can see isApi = 0 is false and 1 is true.
player:onDialogRequest(dialog) -- Opens a dialog.
player:setNextDialogRGBA(r, g, b, a) -- Change dialog background color.
player:setNextDialogBorderRGBA(r, g, b, a) -- Change dialog border color.
player:resetDialogColor() -- Reset dialog color to default.
player:onTextOverlay(text) -- Displays overlay text.

Player Menus / Interfaces

player:onTradeScanUI()
player:onGrow4GoodUI()
player:onGuildNotebookUI()
player:onGrowmojiUI()
player:onGrowpassUI()
player:onNotebookUI()
player:onBillboardUI()
player:onPersonalizeWrenchUI()
player:onOnlineStatusUI()
player:onFavItemsUI()
player:onCoinsBankUI()
player:onUnlinkDiscordUI()
player:onLinkDiscordUI()
player:onClothesUI(targetPlayer)
player:onAchievementsUI(targetPlayer)
player:onTitlesUI(targetPlayer)
player:onWrenchIconsUI(targetPlayer)
player:onNameIconsUI(targetPlayer)
player:onVouchersUI()
player:onMentorshipUI()
player:onBackpackUI(targetPlayer)
player:onStorePurchaseResult()
player:onRedeemMenu()
player:onGrow4GoodDonate()

Player Audio & Actions

player:playAudio("audio.wav") -- Plays an audio file.
player:setNickname(name) -- Sets the player's display name (now supports colors, spaces, '@', saved on relog).
player:resetNickname() -- Resets the player's display name to their original name.
player:hasRole(roleID) -- Checks if player has role.
player:setRole(roleID) -- Sets player's role.
player:sendAction("action|play_sfx\nfile|audio/blabla.mp3\ndelayMS|0")
player:sendVariant({"OnTalkBubble", player:getNetID(), "Hello", 0, 0})
player:sendVariant({"OnConsoleMessage", "Hello"})
player:sendVariant({"OnConsoleMessage", "Hello"}, delay, netID)
ℹ️

Nickname Feature

The setNickname() function now supports colors, spaces, and the ’@’ symbol. Nicknames are saved and persist across relogs!


Player World & Connection

player:getWorld() -- Returns the current World object or nil.
player:getWorldName() -- Returns the current worldName as a string.
player:enterWorld(worldName, doorID) -- Enters specified world, optional doorID for spawn location.
player:disconnect() -- Disconnects the player from server.
player:setBroadcastWorld(worldName) -- Sets broadcast world for this player (/go will work).

Player Identity

player:getNetID() -- Returns the player's net ID.
player:getUserID() -- Returns the player's user ID.
player:getName() -- Returns the player's display name.
player:getCleanName() -- Returns the player's clean name.
player:lower() -- Returns lowercase player name.
player:getCleanName():lower() -- Clean name in lowercase.
player:getCountry() -- Returns player's country (string, online only).
player:getPlatform() -- Returns player's platform ID (0=Windows, 1=iOS, 2=MacOS, 4=Android).
player:getDiscordID() -- Returns the player's Discord ID.
player:getAccountCreationDateStr() -- Returns account creation date.
player:getType() -- Returns the player's type. Non-zero means it is an NPC.
player:hasGrowID() -- Returns true if player has a GrowID.

Player World Lists

player:getOwnedWorlds() -- Returns table of world IDs that player owns (with world locks).
player:getRecentWorlds() -- Returns table of world IDs that player recently entered.
player:getAccessWorlds() -- Returns table of world IDs that player has access to.
player:getSmallLockedWorlds() -- Returns table of world IDs locked by player with small locks (SL, BL, HL, etc).

Player Security & History

player:getIPHistory() -- Returns table of strings (IP addresses recently used to login).
player:getRIDHistory() -- Returns table of strings (RID addresses recently used to login).
⚠️

Privacy Notice

Use IP and RID history data responsibly and in accordance with privacy regulations. This data is sensitive and should be handled securely.


Advanced Account Protection (AAP)

Control player’s Advanced Account Protection settings:

player:setAAPEnabled(1) -- Enable AAP (1 = enable, 0 = disable).
⚠️

Discord Requirement

You cannot enable AAP if the player does not have a Discord account linked. The operation will fail if Discord is not connected.


Player Friends Management

player:getFriends() -- Returns table of friend user IDs (numbers).
player:addFriend(targetPlayer) -- Adds a friend (bidirectional, updates both players).
player:removeFriend(targetPlayer) -- Removes a friend (bidirectional, updates both players).

Player Quests & Goals

player:getLifeGoals() -- Returns table of life goal task objects.
player:getBiweeklyQuests() -- Returns table of biweekly quest task objects.
getJimDailyQuest() -- (Global function) Returns Jim's daily quest object (same for everyone).

Life Goals & Biweekly Quest Properties

Task objects from getLifeGoals() and getBiweeklyQuests() contain:

lifeGoal.taskID
lifeGoal.taskTargetValue
lifeGoal.taskCompletedValue
lifeGoal.taskReward
lifeGoal.deliverItem
lifeGoal.rewardAmount
lifeGoal.claimed
lifeGoal.givenup
lifeGoal.completed
lifeGoal.lastAnnouncePercentage

Jim Daily Quest Properties

The getJimDailyQuest() object contains:

jimDaily.firstItemID
jimDaily.firstItemCount
jimDaily.secondItemID
jimDaily.secondItemCount
jimDaily.completedPlayers -- Table of user IDs who completed it

Player Network & Connection

player:getPing() -- Returns player's ping in milliseconds.

Player Modifiers & Buffs

player:getMod(modID) -- Returns player's mod status.
player:addMod(modID, durationSeconds) -- Adds a mod/buff to the player.
player:getHomeWorldID() -- Returns player's home world ID.
player:getOnlineStatus() -- Returns online status.
player:getGuildID() -- Returns guild ID.
player:getTransformProfileButtons() -- Returns transform profile buttons.
player:setCustomAutofarmDelay(ms) -- Sets custom auto-farm delay in milliseconds (0 to reset).

Custom Auto-Farm Delay

Control the auto-farm tick rate for individual players:

player:setCustomAutofarmDelay(ms)

Parameters:

  • ms - Delay in milliseconds (set to 0 to reset to default)

Example:

-- Set a custom 500ms auto-farm delay for VIP players
player:setCustomAutofarmDelay(500)
 
-- Reset to default delay
player:setCustomAutofarmDelay(0)
 
-- Apply on login to make it permanent
onPlayerLoginCallback(function(player)
    if player:getSubscription(0) ~= nil then -- If supporter
        player:setCustomAutofarmDelay(300) -- Faster auto-farm
    end
end)
⚠️

High CPU Warning

Setting extremely low values (below 100ms) can cause high CPU usage and may shutdown your server. Use responsibly and test performance impacts. This setting does not persist between logins - apply it in onPlayerLoginCallback for permanent effect.


Player Subscriptions Manager

Manage player subscriptions with comprehensive type support and modification capabilities.

ℹ️

Subscription Type Constants

See Subscription Types for all available subscription type constants (TYPE_SUPPORTER, TYPE_GROWPASS, etc.).

Get Subscription

local sub = player:getSubscription(1) -- Returns subscription object or nil
 
if sub ~= nil then
    -- Player has this subscription type
end

Subscription Methods

sub:getType() -- Returns the subscription type ID.
sub:getExpireTime() -- Returns expiration timestamp (seconds).
sub:getActivationTime() -- Returns activation timestamp (seconds).
sub:isPermanent() -- Returns true if subscription is permanent.
sub:getNextRewardTime() -- Returns next reward timestamp (seconds).
 
-- Modification methods
sub:setExpireTime(timestamp) -- Set new expiration time (seconds).
sub:setNextRewardTime(timestamp) -- Set next reward time (seconds).

Add New Subscription

local sub = player:addSubscription(type, expire_timestamp_seconds)
-- If expire_timestamp_seconds is 0, the subscription is permanent

Example Usage

-- Check if player is a supporter
if player:getSubscription(0) ~= nil then
    player:onConsoleMessage("You are a supporter!")
end
 
-- Add a 30-day subscription
local currentTime = os.time()
local expireTime = currentTime + (30 * 24 * 60 * 60) -- 30 days
local sub = player:addSubscription(3, expireTime) -- TYPE_MONTH_SUBSCRIPTION
 
-- Modify existing subscription
local sub = player:getSubscription(4) -- Get GrowPass
if sub ~= nil then
    sub:setExpireTime(os.time() + (365 * 24 * 60 * 60)) -- Extend by 1 year
    
    -- If player is offline, manually save them
    if not player:isOnline() then
        savePlayer(player)
    end
end
ℹ️

Manual Saving

When modifying subscriptions for offline players, you must manually save using savePlayer(player) after making changes.


Player Profile & Content

player:getClassicProfileContent(category, flags)

Player Dungeons

player:getDungeonScrolls() -- Returns how many dungeon scrolls the player has.
player:setDungeonScrolls(number) -- Sets dungeon scrolls (max 255).
ℹ️

Dungeon Scrolls

The maximum number of dungeon scrolls a player can have is 255.


Player Growpass & Progression

player:addGrowpassPoints(points) -- Adds growpass points that can be spent on rewards.

Player Block Hit Count Adjustment

Adjust how many hits it takes to break blocks:

player:adjustBlockHitCount(amount) -- Adjust block break difficulty (-10 to +10).
player:getAdjustedBlockHitCount() -- Get current adjustment value.
ℹ️

Block Hit Count Examples

  • +1: Makes blocks take more hits to break (amount varies by block)
  • -1: Makes blocks easier to break
  • -10: Makes all blocks 1-hit to break (very efficient!)
  • +10: Maximum difficulty increase
⚠️

Important Note

Setting to -10 makes all blocks break in 1 hit. The digger’s spade increases hit count by 1 for non-dirt blocks.


Player Stats Management

player:setStats(type, amount) -- Sets player statistics.

Player Account Notes & Moderation

player:addNote("Some note text") -- Adds an account note (visible in punishment UI).
player:addMod(GAME_BAN, 60) -- Bans player for 60 seconds (0 = permanent).
ℹ️

Account Notes

Account notes provide a history of previous punishments and system warnings, useful for moderation decisions.


Enhanced Dialog Callbacks

You can now pass a callback function directly to player:onDialogRequest() to handle responses without using the global dialog callback:

function handleMyGazetteDialogResponse(world, player, data)
    if data["buttonClicked"] == "test" then
        player:onConsoleMessage("tada!")
    end
end
 
player:onDialogRequest(
    "set_default_color|`o\n" ..
    "add_button|test|Test Button|left|\n" ..
    "end_dialog|my_gazette|||",
    0, -- delay (optional)
    handleMyGazetteDialogResponse -- callback (optional)
)

Cleaner Dialog Handling

This makes dialog handling cleaner and less error-prone by localizing the callback logic.