From a55bddfe2fcc9725d8e6e772cb7784835d5088ad Mon Sep 17 00:00:00 2001 From: Eduardo Dantas <8551443+dudantas@users.noreply.github.com> Date: Mon, 20 Mar 2023 21:05:13 -0300 Subject: [PATCH 1/5] improve: better player group flags management --- src/creatures/players/player.h | 10 ++++- .../creatures/player/player_functions.cpp | 39 +++++++++++++++++++ .../creatures/player/player_functions.hpp | 8 ++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/creatures/players/player.h b/src/creatures/players/player.h index eb56fc9ecd3..9391b08a106 100644 --- a/src/creatures/players/player.h +++ b/src/creatures/players/player.h @@ -350,7 +350,15 @@ class Player final : public Creature, public Cylinder { } bool hasFlag(PlayerFlags_t flag) const { - return group->flags[Groups::getFlagNumber(flag)]; + return group->flags[static_cast(flag)]; + } + + void setFlag(PlayerFlags_t flag) const { + group->flags[static_cast(flag)] = true; + } + + void removeFlag(PlayerFlags_t flag) const { + group->flags[static_cast(flag)] = false; } BedItem* getBedItem() { diff --git a/src/lua/functions/creatures/player/player_functions.cpp b/src/lua/functions/creatures/player/player_functions.cpp index 8891a212e10..daa237cb7f1 100644 --- a/src/lua/functions/creatures/player/player_functions.cpp +++ b/src/lua/functions/creatures/player/player_functions.cpp @@ -3319,3 +3319,42 @@ int PlayerFunctions::luaPlayerGetBossBonus(lua_State* L) { lua_pushnumber(L, static_cast(bonusBoss)); return 1; } + +int PlayerFunctions::luaPlayerHasGroupFlag(lua_State* L) { + // player:hasGroupFlag(flag) + const Player* player = getUserdata(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + pushBoolean(L, false); + return 0; + } + + pushBoolean(L, player->hasFlag(getNumber(L, 2))); + return 1; +} + +int PlayerFunctions::luaPlayerSetGroupFlag(lua_State* L) { + // player:setGroupFlag(flag) + const Player* player = getUserdata(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + pushBoolean(L, false); + return 0; + } + + player->setFlag(getNumber(L, 2)); + return 1; +} + +int PlayerFunctions::luaPlayerRemoveGroupFlag(lua_State* L) { + // player:removeGroupFlag(flag) + const Player* player = getUserdata(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + pushBoolean(L, false); + return 0; + } + + player->removeFlag(getNumber(L, 2)); + return 1; +} diff --git a/src/lua/functions/creatures/player/player_functions.hpp b/src/lua/functions/creatures/player/player_functions.hpp index 37d27c68bd9..10e617c5a33 100644 --- a/src/lua/functions/creatures/player/player_functions.hpp +++ b/src/lua/functions/creatures/player/player_functions.hpp @@ -295,6 +295,10 @@ class PlayerFunctions final : LuaScriptInterface { registerMethod(L, "Player", "getSlotBossId", PlayerFunctions::luaPlayerGetSlotBossId); registerMethod(L, "Player", "getBossBonus", PlayerFunctions::luaPlayerGetBossBonus); + registerMethod(L, "Player", "hasGroupFlag", PlayerFunctions::luaPlayerHasGroupFlag); + registerMethod(L, "Player", "setGroupFlag", PlayerFunctions::luaPlayerSetGroupFlag); + registerMethod(L, "Player", "removeGroupFlag", PlayerFunctions::luaPlayerRemoveGroupFlag); + GroupFunctions::init(L); GuildFunctions::init(L); MountFunctions::init(L); @@ -581,6 +585,10 @@ class PlayerFunctions final : LuaScriptInterface { static int luaPlayerGetSlotBossId(lua_State* L); static int luaPlayerGetBossBonus(lua_State* L); + static int luaPlayerHasGroupFlag(lua_State* L); + static int luaPlayerSetGroupFlag(lua_State* L); + static int luaPlayerRemoveGroupFlag(lua_State* L); + friend class CreatureFunctions; }; From 54444d1a35bc6fdd676e650403cf17195a547fe1 Mon Sep 17 00:00:00 2001 From: Eduardo Dantas Date: Thu, 27 Apr 2023 18:20:01 -0300 Subject: [PATCH 2/5] improve: add talkactions to manage flags new talkactions: /hasflag playername, flagname or number /setflag playername, flagname or number /removeflag playername, flagname or number new string function: string.trimSpace(str) or string:trimSpace() documented the strings functions and moved from global.lua to string.lua --- data-canary/scripts/talkactions/god/flags.lua | 26 +++ .../scripts/talkactions/god/reload.lua | 5 +- .../scripts/talkactions/god/flags.lua | 26 +++ .../scripts/talkactions/god/reload.lua | 5 +- data/global.lua | 20 -- data/libs/functions/string.lua | 91 +++++++-- data/scripts/talkactions.lua | 188 +++++++++++++++++- 7 files changed, 309 insertions(+), 52 deletions(-) create mode 100644 data-canary/scripts/talkactions/god/flags.lua create mode 100644 data-otservbr-global/scripts/talkactions/god/flags.lua diff --git a/data-canary/scripts/talkactions/god/flags.lua b/data-canary/scripts/talkactions/god/flags.lua new file mode 100644 index 00000000000..dc0b898833a --- /dev/null +++ b/data-canary/scripts/talkactions/god/flags.lua @@ -0,0 +1,26 @@ +local flag = TalkAction("/hasflag") + +function flag.onSay(player, words, param) + return player:talkactionHasFlag(param) +end + +flag:separator(" ") +flag:register() + +flag = TalkAction("/setflag") + +function flag.onSay(player, words, param) + return player:talkactionSetFlag(param) +end + +flag:separator(" ") +flag:register() + +flag = TalkAction("/removeflag") + +function flag.onSay(player, words, param) + return player:talkactionRemoveFlag(param) +end + +flag:separator(" ") +flag:register() diff --git a/data-canary/scripts/talkactions/god/reload.lua b/data-canary/scripts/talkactions/god/reload.lua index ee898e036a4..4b38d19cfcb 100644 --- a/data-canary/scripts/talkactions/god/reload.lua +++ b/data-canary/scripts/talkactions/god/reload.lua @@ -8,10 +8,7 @@ local reload = TalkAction("/reload") function reload.onSay(player, words, param) - if player:reloadTalkaction(param) then - return true - end - return false + return player:reloadTalkaction(words, param) end reload:separator(" ") diff --git a/data-otservbr-global/scripts/talkactions/god/flags.lua b/data-otservbr-global/scripts/talkactions/god/flags.lua new file mode 100644 index 00000000000..dc0b898833a --- /dev/null +++ b/data-otservbr-global/scripts/talkactions/god/flags.lua @@ -0,0 +1,26 @@ +local flag = TalkAction("/hasflag") + +function flag.onSay(player, words, param) + return player:talkactionHasFlag(param) +end + +flag:separator(" ") +flag:register() + +flag = TalkAction("/setflag") + +function flag.onSay(player, words, param) + return player:talkactionSetFlag(param) +end + +flag:separator(" ") +flag:register() + +flag = TalkAction("/removeflag") + +function flag.onSay(player, words, param) + return player:talkactionRemoveFlag(param) +end + +flag:separator(" ") +flag:register() diff --git a/data-otservbr-global/scripts/talkactions/god/reload.lua b/data-otservbr-global/scripts/talkactions/god/reload.lua index ee898e036a4..4b38d19cfcb 100644 --- a/data-otservbr-global/scripts/talkactions/god/reload.lua +++ b/data-otservbr-global/scripts/talkactions/god/reload.lua @@ -8,10 +8,7 @@ local reload = TalkAction("/reload") function reload.onSay(player, words, param) - if player:reloadTalkaction(param) then - return true - end - return false + return player:reloadTalkaction(words, param) end reload:separator(" ") diff --git a/data/global.lua b/data/global.lua index e7a4821e8b6..71c1b80738b 100644 --- a/data/global.lua +++ b/data/global.lua @@ -115,26 +115,6 @@ table.contains = function(array, value) return false end -string.split = function(str, sep) - local res = {} - for v in str:gmatch("([^" .. sep .. "]+)") do - res[#res + 1] = v - end - return res -end - -string.splitTrimmed = function(str, sep) - local res = {} - for v in str:gmatch("([^" .. sep .. "]+)") do - res[#res + 1] = v:trim() - end - return res -end - -string.trim = function(str) - return str:match'^()%s*$' and '' or str:match'^%s*(.*%S)' -end - -- for use of: data\scripts\globalevents\customs\save_interval.lua SAVE_INTERVAL_TYPE = configManager.getString(configKeys.SAVE_INTERVAL_TYPE) SAVE_INTERVAL_CONFIG_TIME = configManager.getNumber(configKeys.SAVE_INTERVAL_TIME) diff --git a/data/libs/functions/string.lua b/data/libs/functions/string.lua index 737be047e42..8b6035a65cd 100644 --- a/data/libs/functions/string.lua +++ b/data/libs/functions/string.lua @@ -1,3 +1,6 @@ +-- Function that splits a string into parts using a separator +-- Parameters: str (string) - the string to be split, sep (string) - the separator to be used +-- Returns: a table containing the separated parts of the string string.split = function(str, sep) local res = {} for v in str:gmatch("([^" .. sep .. "]+)") do @@ -6,37 +9,85 @@ string.split = function(str, sep) return res end +-- Function that removes whitespace from the beginning and end of a string +-- Parameters: str (string) - the string to be modified +-- Returns: the string without whitespace at the beginning and end string.trim = function(str) return str:match'^()%s*$' and '' or str:match'^%s*(.*%S)' end +-- Function that checks if a string starts with a specific substring +-- Parameters: str (string) - the string to be checked, substr (string) - the substring to be searched for +-- Returns: true if the string starts with the substring, false otherwise string.starts = function(str, substr) return string.sub(str, 1, #substr) == substr end +-- Function that converts a string where each word starts with an uppercase letter +-- Parameters: str (string) - the string to be modified +-- Returns: the string with each word starting with an uppercase letter string.titleCase = function(str) return str:gsub("(%a)([%w_']*)", function(first, rest) return first:upper() .. rest:lower() end) end +-- Function that converts a time interval into a human-readable format +-- Parameters: diff (number) - the time interval in seconds +-- Returns: a string representing the time interval in a readable format string.diff = function(diff) - local format = { - {'day', diff / 60 / 60 / 24}, - {'hour', diff / 60 / 60 % 24}, - {'minute', diff / 60 % 60}, - {'second', diff % 60} - } - - local out = {} - for k, t in ipairs(format) do - local v = math.floor(t[2]) - if(v > 0) then - table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) - end - end - local ret = table.concat(out) - if ret:len() < 16 and ret:find('second') then - local a, b = ret:find(' and ') - ret = ret:sub(b+1) - end - return ret + local format = { + {'day', diff / 60 / 60 / 24}, + {'hour', diff / 60 / 60 % 24}, + {'minute', diff / 60 % 60}, + {'second', diff % 60} + } + + local out = {} + for k, t in ipairs(format) do + local v = math.floor(t[2]) + if(v > 0) then + table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) + end + end + local ret = table.concat(out) + if ret:len() < 16 and ret:find('second') then + local a, b = ret:find(' and ') + ret = ret:sub(b+1) + end + return ret +end + +-- Function that removes whitespace from the beginning and end of a string +-- Parameters: str (string) - the string to be modified +-- Returns: the string without whitespace at the beginning and end +string.trimSpace = function(str) + return str:gsub("^%s*(.-)%s*$", "%1") +end + +-- Function that splits a string into parts using a separator +-- Parameters: str (string) - the string to be split, sep (string) - the separator to be used +-- Returns: a table containing the separated parts of the string +string.split = function(str, sep) + local res = {} + for v in str:gmatch("([^" .. sep .. "]+)") do + res[#res + 1] = v + end + return res +end + +-- Function that splits a string into parts using a separator, and trims whitespace from each part +-- Parameters: str (string) - the string to be split, sep (string) - the separator to be used +-- Returns: a table containing the separated parts of the string with whitespace removed from each part +string.splitTrimmed = function(str, sep) + local res = {} + for v in str:gmatch("([^" .. sep .. "]+)") do + res[#res + 1] = v:trim() + end + return res +end + +-- Function that removes whitespace from the beginning and end of a string +-- Parameters: str (string) - the string to be modified +-- Returns: the string without whitespace at the beginning and end +string.trim = function(str) + return str:match('^%s*(.*%S)') or '' end diff --git a/data/scripts/talkactions.lua b/data/scripts/talkactions.lua index 9ceefff222d..23ec8ccdb1e 100644 --- a/data/scripts/talkactions.lua +++ b/data/scripts/talkactions.lua @@ -1,10 +1,190 @@ +local PlayerFlags_t = { + ["CannotUseCombat"] = CannotUseCombat, + ["CannotAttackPlayer"] = CannotAttackPlayer, + ["CannotAttackMonster"] = CannotAttackMonster, + ["CannotBeAttacked"] = CannotBeAttacked, + ["CanConvinceAll"] = CanConvinceAll, + ["CanSummonAll"] = CanSummonAll, + ["CanIllusionAll"] = CanIllusionAll, + ["CanSenseInvisibility"] = CanSenseInvisibility, + ["IgnoredByMonsters"] = IgnoredByMonsters, + ["NotGainInFight"] = NotGainInFight, + ["HasInfiniteMana"] = HasInfiniteMana, + ["HasInfiniteSoul"] = HasInfiniteSoul, + ["HasNoExhaustion"] = HasNoExhaustion, + ["CannotUseSpells"] = CannotUseSpells, + ["CannotPickupItem"] = CannotPickupItem, + ["CanAlwaysLogin"] = CanAlwaysLogin, + ["CanBroadcast"] = CanBroadcast, + ["CanEditHouses"] = CanEditHouses, + ["CannotBeBanned"] = CannotBeBanned, + ["CannotBePushed"] = CannotBePushed, + ["HasInfiniteCapacity"] = HasInfiniteCapacity, + ["CanPushAllCreatures"] = CanPushAllCreatures, + ["CanTalkRedPrivate"] = CanTalkRedPrivate, + ["CanTalkRedChannel"] = CanTalkRedChannel, + ["TalkOrangeHelpChannel"] = TalkOrangeHelpChannel, + ["NotGainExperience"] = NotGainExperience, + ["NotGainMana"] = NotGainMana, + ["NotGainHealth"] = NotGainHealth, + ["NotGainSkill"] = NotGainSkill, + ["SetMaxSpeed"] = SetMaxSpeed, + ["SpecialVIP"] = SpecialVIP, + ["NotGenerateLoot"] = NotGenerateLoot, + ["CanTalkRedChannelAnonymous"] = CanTalkRedChannelAnonymous, + ["IgnoreProtectionZone"] = IgnoreProtectionZone, + ["IgnoreSpellCheck"] = IgnoreSpellCheck, + ["IgnoreWeaponCheck"] = IgnoreWeaponCheck, + ["CannotBeMuted"] = CannotBeMuted, + ["IsAlwaysPremium"] = IsAlwaysPremium, + ["CanMapClickTeleport"] = CanMapClickTeleport, + ["IgnoredByNpcs"] = IgnoredByNpcs, +} + local function notAccountTypeGod(player) if not player:getGroup():getAccess() or player:getAccountType() < ACCOUNT_TYPE_GOD then return true end end -function Player.reloadTalkaction(self, param) +local function sendValidKeys(player) + local flagsList = {} + for flagName, _ in pairs(PlayerFlags_t) do + table.insert(flagsList, flagName) + end + + local text = "Invalid flag. Valid flags are: ".. table.concat(flagsList, "\n") + player:showTextDialog(2019, text) +end + +function GetFlagNumberOrName(flagType) + for flagName, flagEnum in pairs(PlayerFlags_t) do + if tonumber(flagEnum) == tonumber(flagType) then + return flagEnum + end + if type(flagType) == "string" and string.lower(flagType) == string.lower(flagName) then + return flagEnum + end + end + return nil +end + +function GetFlagNameByType(flagType) + for flagName, flagEnum in pairs(PlayerFlags_t) do + if tonumber(flagEnum) == tonumber(flagType) then + return flagName + end + end + return nil +end + +function Player.talkactionHasFlag(self, param, flagType) + if notAccountTypeGod(self) then + return true + end + + if not param or param == "" then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Usage: /hasflag , ") + return false + end + + local split = param:split(",") + local playerName = split[1]:trimSpace() + local flag = split[2]:trimSpace() + local flagValue = GetFlagNumberOrName(flag) + if not flagValue then + sendValidKeys(self) + return false + end + + local targetPlayer = Player(playerName) + if not targetPlayer then + self:sendCancelMessage("Player " .. playerName .. " not found.") + return false + end + + if not targetPlayer:hasGroupFlag(flagValue) then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Player " .. playerName .. " not have flag type: " .. GetFlagNameByType(flagValue) .. ".") + else + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Player " .. playerName .. " have flag type: " .. GetFlagNameByType(flagValue) .. ".") + end + + return true +end + +function Player.talkactionSetFlag(self, param, flagType) + if notAccountTypeGod(self) then + return true + end + + if not param or param == "" then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Usage: /setflag , , ") + return false + end + + local split = param:split(",") + local playerName = split[1]:trimSpace() + local flag = split[2]:trimSpace() + local flagValue = GetFlagNumberOrName(flag) + if not flagValue then + sendValidKeys(self) + return false + end + + local targetPlayer = Player(playerName) + if not targetPlayer then + self:sendCancelMessage("Player " .. playerName .. " not found.") + return false + end + + if not targetPlayer:hasFlag(flagValue) then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Player " .. playerName .. " not have flag " .. GetFlagNameByType(flagValue) .. ".") + return false + end + + targetPlayer:removeGroupFlag(flagValue) + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Flag " .. GetFlagNameByType(flagValue) .. " removed from player " .. playerName .. ".") + Spdlog.info("[Player.talkactionRemoveFlag] Removed flag " .. GetFlagNameByType(flagValue) .. " from ".. targetPlayer:getName().. " character by " .. self:getName() .. ".") + return true +end + +function Player.reloadTalkaction(self, words, param) local reloadTypes = { ["all"] = RELOAD_TYPE_ALL, @@ -60,12 +240,12 @@ function Player.reloadTalkaction(self, param) end if not configManager.getBoolean(configKeys.ALLOW_RELOAD) then - self:sendCancelMessage("Reload command is disabled.") + self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Reload command is disabled.") return true end if param == "" then - self:sendCancelMessage("Command param required.") + self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Command param required.") return false end @@ -78,7 +258,7 @@ function Player.reloadTalkaction(self, param) Spdlog.info("Reloaded " .. param:lower() .. "") return true elseif not reloadType then - self:sendCancelMessage("Reload type not found.") + self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Reload type not found.") Spdlog.warn("[reload.onSay] - Reload type '".. param.. "' not found") return false end From ee1a96dbc34613e62a64030c37a060e0e0980453 Mon Sep 17 00:00:00 2001 From: Eduardo Dantas Date: Fri, 5 May 2023 18:40:26 -0300 Subject: [PATCH 3/5] fix: check params --- data/scripts/talkactions.lua | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/data/scripts/talkactions.lua b/data/scripts/talkactions.lua index e912e1f56fd..43403f5016c 100644 --- a/data/scripts/talkactions.lua +++ b/data/scripts/talkactions.lua @@ -57,6 +57,21 @@ local function sendValidKeys(player) player:showTextDialog(2019, text) end +local function hasValidParams(player, param, usage) + if not param or param == "" then + player:sendCancelMessage("Command param required. Usage: ".. usage) + return false + end + + local split = param:split(",") + if not split[2] then + player:sendCancelMessage("Insufficient parameters. Usage: ".. usage) + return false + end + + return true +end + function GetFlagNumberOrName(flagType) for flagName, flagEnum in pairs(PlayerFlags_t) do if tonumber(flagEnum) == tonumber(flagType) then @@ -83,8 +98,7 @@ function Player.talkactionHasFlag(self, param, flagType) return true end - if not param or param == "" then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Usage: /hasflag , ") + if not hasValidParams(player, param, "Usage: /hasflag , ") then return false end @@ -117,8 +131,7 @@ function Player.talkactionSetFlag(self, param, flagType) return true end - if not param or param == "" then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Usage: /setflag , , ") then return false end @@ -153,8 +166,7 @@ function Player.talkactionRemoveFlag(self, param, flagType) return true end - if not param or param == "" then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE,"Usage: /removeflag , ") + if not hasValidParams(player, param, "Usage: /removeflag , ") then return false end From 7349c0cb65fbc7f5593495fc692b2f532265be96 Mon Sep 17 00:00:00 2001 From: Eduardo Dantas Date: Sat, 6 May 2023 16:40:16 -0700 Subject: [PATCH 4/5] fix wrong player --- data/scripts/talkactions.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/scripts/talkactions.lua b/data/scripts/talkactions.lua index 43403f5016c..56f51c8f9d7 100644 --- a/data/scripts/talkactions.lua +++ b/data/scripts/talkactions.lua @@ -98,7 +98,7 @@ function Player.talkactionHasFlag(self, param, flagType) return true end - if not hasValidParams(player, param, "Usage: /hasflag , ") then + if not hasValidParams(self, param, "Usage: /hasflag , ") then return false end @@ -131,7 +131,7 @@ function Player.talkactionSetFlag(self, param, flagType) return true end - if not hasValidParams(player, param, "Usage: /setflag , ") then + if not hasValidParams(self, param, "Usage: /setflag , ") then return false end @@ -166,7 +166,7 @@ function Player.talkactionRemoveFlag(self, param, flagType) return true end - if not hasValidParams(player, param, "Usage: /removeflag , ") then + if not hasValidParams(self, param, "Usage: /removeflag , ") then return false end From 9ce787a53b0803480e5af5f34a6ed384c94466a3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 9 May 2023 00:20:17 +0000 Subject: [PATCH 5/5] Code format - (Clang-format) --- .../functions/creatures/player/player_functions.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lua/functions/creatures/player/player_functions.cpp b/src/lua/functions/creatures/player/player_functions.cpp index 927393a7a39..79f7ecb7e00 100644 --- a/src/lua/functions/creatures/player/player_functions.cpp +++ b/src/lua/functions/creatures/player/player_functions.cpp @@ -3381,13 +3381,13 @@ int PlayerFunctions::luaPlayerGetName(lua_State* L) { } pushString(L, player->getName()); - return 1; + return 1; } int PlayerFunctions::luaPlayerHasGroupFlag(lua_State* L) { // player:hasGroupFlag(flag) const Player* player = getUserdata(L, 1); - if (!player) { + if (!player) { reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 0; @@ -3407,18 +3407,18 @@ int PlayerFunctions::luaPlayerSetGroupFlag(lua_State* L) { } player->setFlag(getNumber(L, 2)); - return 1; + return 1; } int PlayerFunctions::luaPlayerRemoveGroupFlag(lua_State* L) { // player:removeGroupFlag(flag) const Player* player = getUserdata(L, 1); - if (!player) { + if (!player) { reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); pushBoolean(L, false); return 0; } - + player->removeFlag(getNumber(L, 2)); return 1; }