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.lastAnnouncePercentageJim Daily Quest Properties
The getJimDailyQuest() object contains:
jimDaily.firstItemID
jimDaily.firstItemCount
jimDaily.secondItemID
jimDaily.secondItemCount
jimDaily.completedPlayers -- Table of user IDs who completed itPlayer 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
endSubscription 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 permanentExample 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
endManual 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.