Postado Setembro 12, 2019 5 anos Venho tentando já há algum tempo encontrar a parte dos scripts de prey que determinam o tempo para o "Free Reroll". Por algum motivo, no meu, os 2 primeiro slots (o free e o vip) possuem um tempo de recarga de 20 horas para o free reroll, e o terceiro (que se compra na store), possui um tempo de recarga de 420 horas. Gostaria de saber onde mudar isso para que o slot comprado na store seja melhor, e não pior, que os outros. Além disso, quando o jogador dá o reroll no meu server, ele perde o bônus que ele tinha conseguido antes (se ele estava com um loot 10/10, e queria apenas mudar o monstro, quando ele der reroll o bonus vai mudar), mas ouvi dizer que isso funciona de forma diferente no global (o bonus se mantêm), e gostaria de saber onde posso mudar isso. Se ajudar, segue o preysystem que eu tenho em modules: Spoiler PreySystem = { Developer = "Charles (Cjaker)", Version = "3.0", LastUpdate = "23/07/2017 - 10:58 (AM)", Missing = {} } local RerollStorages = { [0] = 8420390, [1] = 8420391, [10] = 8420392 } local ColumId = { [512] = 0, [513] = 1, [514] = 2 } local monstersGenerated = {} local ServerPackets = { ShowDialog = 0xED, PreyRerollPrice = 0xE9, PreyData = 0xE8, PreyTimeLeft = 0xE7 } local StateTypes = { STATE_LOCKED = 0, STATE_INACTIVE = 1, STATE_ACTIVE = 2, STATE_SELECTION = 3, STATE_SELECTION_CHANGE_MONSTER = 4 } local UnlockTypes = { UNLOCK_PREMIUM_OR_STORE = 0, UNLOCK_STORE = 1, UNLOCK_NONE = 2 } local ClientPackets = { RequestData = 0xED, PreyAction = 0xEB } function getUnlockedColumn(player) local resultId = db.storeQuery("SELECT * FROM players WHERE name = " ..db.escapeString(player:getName())) if (resultId ~= false) then return result.getDataInt(resultId, "prey_column") end return nil end local function getMonsterList(player, column) local resultId = db.storeQuery("SELECT * FROM player_prey WHERE player_id = " ..player:getGuid()) if (resultId ~= false) then local preyMonsters = {} repeat local mName = result.getDataString(resultId, "name") local mIndex = result.getDataInt(resultId, "mindex") local mColumn = result.getDataInt(resultId, "mcolumn") if (mColumn == column) then preyMonsters[#preyMonsters+1] = {Name = mName, Index = mIndex, Column = mColumn} end until not result.next(resultId) result.free(resultId) if (#preyMonsters == 0) then return nil end return preyMonsters end return nil end local function tableContains(table, value) for i = 1, #table do if (table == value) then return true end end return false end local function havePreyMonsterByName(playerId, name) return db.storeQuery("SELECT player_id FROM player_prey WHERE player_id = " ..playerId.. " AND name = " ..db.escapeString(name)) end local function createMonstersColumn(player, column) local monsters, newTable = getPreyMonsters(), {} local count = 1 -- Get New List repeat local randomName = monsters[math.random(#monsters)] if (not havePreyMonsterByName(player:getGuid(), randomName)) then if (MonsterType(randomName) and MonsterType(randomName):getOutfit().lookType > 0) then newTable[count] = {Name = randomName, Index = count, Column = column} db.query("INSERT INTO player_prey SET player_id = " ..player:getGuid().. ", name = " ..db.escapeString(randomName).. ", mindex = " ..(count-1).. ", mcolumn = " ..column) count = count + 1 end end until count == 10 return newTable end function changeStateToSelection(player, indexColumn) local msg = NetworkMessage() msg:addByte(ServerPackets.PreyData) msg:addByte(indexColumn) msg:addByte(StateTypes.STATE_SELECTION) player:removeBonus(indexColumn) local Monsters = getMonsterList(player, indexColumn) if (not Monsters) then Monsters = createMonstersColumn(player, indexColumn) end msg:addByte(#Monsters) -- column length for i, v in pairs(Monsters) do if (v.Name and MonsterType(v.Name)) then msg:addString(v.Name) local mLook = MonsterType(v.Name):getOutfit() msg:addU16(mLook.lookType or 21) msg:addByte(mLook.lookHead or 0x00) -- outfit msg:addByte(mLook.lookBody or 0x00) -- outfit msg:addByte(mLook.lookLegs or 0x00) -- outfit msg:addByte(mLook.lookFeet or 0x00) -- outfit msg:addByte(mLook.lookAddons or 0x00) -- outfit end end msg:addU16(player:getNextFreeroll(indexColumn)) msg:addByte(0xEC) player:sendResource("prey", player:getBonusReroll()) player:sendResource("bank", player:getBankBalance()) player:sendResource("inventory", player:getMoney()) msg:addByte(ServerPackets.PreyRerollPrice) msg:addU32(player:getRerollPrice()) msg:sendToPlayer(player) end function changeStateToSelectionChangeMonster(player, indexColumn) local msg = NetworkMessage() msg:addByte(ServerPackets.PreyData) msg:addByte(indexColumn) msg:addByte(StateTypes.STATE_SELECTION_CHANGE_MONSTER) local newBonus = getRandomBonus(player, indexColumn, player:getPreyName(indexColumn), true) if (player:getPreyName(indexColumn) == "") then player:setPreyName(indexColumn, "BONUSREROLL") player:setPreyType(indexColumn, newBonus.Type) player:setPreyValue(indexColumn, newBonus.Value) end msg:addByte(player:getPreyType(indexColumn)) -- Type msg:addU16(player:getPreyValue(indexColumn)) -- Value msg:addByte(getBonusGrade(player:getPreyType(indexColumn), player:getPreyValue(indexColumn))) -- 1~10 Grade local Monsters = getMonsterList(player, indexColumn) if (not Monsters) then Monsters = createMonstersColumn(player, indexColumn) end msg:addByte(#Monsters) -- column length for i, v in pairs(Monsters) do msg:addString(v.Name) local mLook = MonsterType(v.Name):getOutfit() msg:addU16(mLook.lookType or 21) msg:addByte(mLook.lookHead or 0x00) -- outfit msg:addByte(mLook.lookBody or 0x00) -- outfit msg:addByte(mLook.lookLegs or 0x00) -- outfit msg:addByte(mLook.lookFeet or 0x00) -- outfit msg:addByte(mLook.lookAddons or 0x00) -- outfit end msg:addU16(player:getNextFreeroll(indexColumn)) -- Next Free Reroll msg:addByte(0xEC) player:sendResource("prey", player:getBonusReroll()) player:sendResource("bank", player:getBankBalance()) player:sendResource("inventory", player:getMoney()) msg:sendToPlayer(player) end function changeStateToLocked(player, indexColumn) local msg = NetworkMessage() msg:addByte(ServerPackets.PreyData) msg:addByte(indexColumn) msg:addByte(StateTypes.STATE_LOCKED) msg:addByte(UnlockTypes.UNLOCK_PREMIUM_OR_STORE) msg:addU16(0) msg:addByte(0xEC) player:sendResource("prey", player:getBonusReroll()) player:sendResource("bank", player:getBankBalance()) player:sendResource("inventory", player:getMoney()) msg:sendToPlayer(player) end function changeStateToActive(player, indexColumn) local timeLeft = player:getStaminaBonus(indexColumn) local Bonus = loadBonus(player, indexColumn) if (not Bonus) then changeStateToSelection(player, indexColumn) return end local mType = MonsterType(Bonus.Name) local mOutfit = nil if mType then mOutfit = mType:getOutfit() else mOutfit = {lookType = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookAddons = 0} end local msg = NetworkMessage() msg:addByte(ServerPackets.PreyData) msg:addByte(indexColumn) msg:addByte(StateTypes.STATE_ACTIVE) msg:addString(Bonus.Name) msg:addU16(mOutfit.lookType) msg:addByte(mOutfit.lookHead) msg:addByte(mOutfit.lookBody) msg:addByte(mOutfit.lookLegs) msg:addByte(mOutfit.lookFeet) msg:addByte(mOutfit.lookAddons) msg:addByte(Bonus.Type) -- Type msg:addU16(Bonus.Value) -- Value msg:addByte(Bonus.Grade) -- 1~10 Grade msg:addU16(timeLeft) -- Time Left Bonus msg:addU16(player:getNextFreeroll(indexColumn)) msg:addByte(0xEC) player:sendResource("prey", player:getBonusReroll()) player:sendResource("bank", player:getBankBalance()) player:sendResource("inventory", player:getMoney()) msg:addByte(ServerPackets.PreyRerollPrice) msg:addU32(player:getRerollPrice()) msg:sendToPlayer(player) end function sendPreyData(player, indexColumn) local isUnlockedColumn = player:isOpenColumn(indexColumn) if (not isUnlockedColumn) then -- STATE_LOCKED changeStateToLocked(player, indexColumn) elseif (player:isActive(indexColumn)) then -- STATE_ACTIVE changeStateToActive(player, indexColumn) elseif (player:isBonusReroll(indexColumn)) then -- STATE_SELECTION_CHANGE_MONSTER changeStateToSelectionChangeMonster(player, indexColumn) else if (player:getBonusMonster(indexColumn) ~= "") then player:removePreyMonster(player:getBonusMonster(indexColumn)) player:removeBonus(indexColumn) end -- STATE_SELECTION changeStateToSelection(player, indexColumn) end -- STATE_SELECTION_CHANGE_MONSTER IS FROM BONUSREROLL end local function getMonsterName(player, column, index) local resultId = db.storeQuery("SELECT name FROM player_prey WHERE mcolumn = " ..column.. " AND mindex = " ..index.." AND player_id = "..player:getGuid()) if (not resultId) then return false end return result.getDataString(resultId, "name") end local function sendError(player, error) local msg = NetworkMessage() msg:addByte(ServerPackets.ShowDialog) msg:addByte(0x15) -- Type Dialog Error (0x14 => Normal Message) msg:addString(error) msg:sendToPlayer(player) end function CheckPrey(player, msg) local PreyColumn = msg:getByte() -- Column local PreyAction = msg:getByte() -- Type Action (2 == select) if (PreyAction == 0) then if (getUnlockedColumn(player) < PreyColumn) then return sendError(player, "[ERROR] You don't have this column unlocked.") end player:preyRerollList(PreyColumn) elseif (PreyAction == 1) then if (getUnlockedColumn(player) < PreyColumn) then return sendError(player, "[ERROR] You don't have this column unlocked.") end if (player:isBonusReroll(PreyColumn)) then return sendError(player, "Are you fucking kidding me? Do you really wanna try bug my system? get out of here little sniffer.") end -- Bonus Reroll player:bonusReroll(PreyColumn) elseif (PreyAction == 2) then local PreyIndex = msg:getByte() -- monster index --print(PreyColumn.. " e " ..PreyAction.. " e " ..PreyIndex) if (getUnlockedColumn(player) < PreyColumn) then return sendError(player, "[ERROR] You don't have this column unlocked.") end local mName = getMonsterName(player, PreyColumn, PreyIndex) if (not mName) then return sendError(player, "[ERROR] Monster name don't exists in list.") end local mType = MonsterType(mName) if (not mType) then return sendError(player, "[ERROR] This monster don't exists in Server.") end SelectPrey(player, PreyColumn, mType) end end local function getBonusValue(min, max, steps, bonusReroll) if (bonusReroll) then return max, 10 end local retValue = 0 local retGrade = 0 local random = math.random(1, 10) while (retValue == 0) do if (retGrade >= 10) then retGrade = 0 end for i = min, max, steps do retGrade = retGrade + 1 if (retGrade == random) then retValue = i break end end end return retValue, retGrade end function getRandomBonus(player, column, name, bonusReroll) -- BONUS_DAMAGE_BOOST -- BONUS_DAMAGE_REDUCTION -- BONUS_XP_BONUS -- BONUS_IMPROVED_LOOT -- BONUS_NONE local BonusValues = { [0] = {Min = 7, Max = 25, Steps = 2}, [1] = {Min = 12, Max = 30, Steps = 2}, [2] = {Min = 13, Max = 40, Steps = 3}, [3] = {Min = 13, Max = 40, Steps = 3} } local randomBonus = math.random(0, 3) if (player:isActive(column) and not bonusReroll) then return false end local Bonus = BonusValues[randomBonus] local BonusValue, BonusGrade = getBonusValue(Bonus.Min, Bonus.Max, Bonus.Steps, bonusReroll) local retTable = {Type = randomBonus, Left = 7200, Value = BonusValue, Grade = BonusGrade} if (not bonusReroll) then player:setPreyStamina(column, 7200) player:setPreyType(column, retTable.Type) player:setPreyValue(column, retTable.Value) player:setPreyName(column, name) end return retTable end function getBonusGrade(bonusType, bonusValue) local BonusValues = { [0] = {Min = 7, Max = 25, Steps = 2}, [1] = {Min = 12, Max = 30, Steps = 2}, [2] = {Min = 13, Max = 40, Steps = 3}, [3] = {Min = 13, Max = 40, Steps = 3} } local Bonus = BonusValues[bonusType] local Grade = 0 for i = Bonus.Min, Bonus.Max, Bonus.Steps do Grade = Grade + 1 if (i >= bonusValue) then return Grade end end return nil end function loadBonus(player, column) local retTable = { Type = player:getPreyType(column), Value = player:getPreyValue(column), Name = player:getPreyName(column) } retTable.Grade = getBonusGrade(retTable.Type, retTable.Value) if (retTable.Name == "") then return false end return retTable end function SelectPrey(player, PreyColumn, mType) local msg = NetworkMessage() msg:addByte(ServerPackets.PreyData) msg:addByte(PreyColumn) local mLook = mType:getOutfit() if (not mLook) then return sendError(player, "[ERROR] Monster is invalid, please contact Administrator.") end local newBonus = nil if (player:isBonusReroll(PreyColumn)) then newBonus = {Type = player:getPreyType(PreyColumn), Left = 7200, Value = player:getPreyValue(PreyColumn), Grade = 10} player:setPreyName(PreyColumn, mType:getName()) else newBonus = getRandomBonus(player, PreyColumn, mType:getName(), false) end if (not newBonus) then return sendError(player, "[ERROR] You can't select a prey with bonus active.") end player:setPreyStamina(PreyColumn, 7200) msg:addByte(StateTypes.STATE_ACTIVE) msg:addString(mType:getName()) msg:addU16(mLook.lookType) msg:addByte(mLook.lookHead or 0x00) -- outfit msg:addByte(mLook.lookBody or 0x00) -- outfit msg:addByte(mLook.lookLegs or 0x00) -- outfit msg:addByte(mLook.lookFeet or 0x00) -- outfit msg:addByte(mLook.lookAddons or 0x00) -- outfit msg:addByte(newBonus.Type) -- Type msg:addU16(newBonus.Value) -- Value msg:addByte(newBonus.Grade) -- 1~10 Grade msg:addU16(newBonus.Left) -- Time Left Bonus msg:addU16(player:getNextFreeroll(PreyColumn)) -- Next Free Reroll msg:sendToPlayer(player) end function onRecvbyte(player, msg, byte) if (byte == ClientPackets.RequestData) then local column = msg:getByte() if (column == 10) then column = 2 end sendPreyData(player, column) elseif (byte == ClientPackets.PreyAction) then CheckPrey(player, msg) end end function Player.getBonusReroll(self) local resultId = db.storeQuery("SELECT bonus_reroll FROM players WHERE id = " ..self:getGuid()) if (resultId) then return result.getDataInt(resultId, "bonus_reroll") end return nil end function Player.getRerollPrice(self) return (self:getLevel()/2) * 100 end function Player.preyRerollList(self, column) if (self:getExhaustion(5042021) > 0) then return addEvent(function() sendError(self, "[ERROR] Wait a time!") end, 250) end self:setExhaustion(5042021, 2) local rerollStorage = RerollStorages[column] if (self:getStorageValue(rerollStorage) > 0) then local priceReroll = self:getRerollPrice() if (not self:removeMoneyNpc(self:getRerollPrice())) then sendError(self, "[ERROR] You don't have " ..priceReroll.. " gold.") end end self:removeBonus(column) db.query("DELETE FROM player_prey WHERE player_id = " ..self:getGuid().. " AND mcolumn = " ..column) db.query("UPDATE player_preytimes SET bonus_name" ..(column+1) .. " = '' WHERE player_id = " ..self:getGuid()) self:setStorageValue(rerollStorage, (os.time() / 60.000) + 1200) changeStateToSelection(self, column) end function Player.getNextFreeroll(self, column) local FreeRerollTime = self:getStorageValue(RerollStorages[column]) if (FreeRerollTime == -1) then self:setStorageValue(RerollStorages[column], 0) FreeRerollTime = 0 end if (FreeRerollTime > 0) then if (FreeRerollTime < (os.time() / 60.000)) then FreeRerollTime = 0 self:setStorageValue(RerollStorages[column], 0) else FreeRerollTime = FreeRerollTime - (os.time() / 60.000) self:setStorageValue(RerollStorages[column], (os.time() / 60.000) + FreeRerollTime) end end return FreeRerollTime end function Player.setBonusReroll(self, value) db.query("UPDATE players SET bonus_reroll = " ..value.. " WHERE id = " ..self:getGuid()) end function Player.addBonusReroll(self, value) db.query("UPDATE players SET bonus_reroll = bonus_reroll + " ..value.. " WHERE id = " ..self:getGuid()) end function Player.removeBonus(self, column) self:setPreyStamina(column, 0) self:setPreyType(column, 0) self:setPreyValue(column, 0) self:setPreyName(column, "") end function Player.getBonusMonster(self, column) return self:getPreyName(column) end function Player.getBonusInfo(self, column) return loadBonus(self, column) end function Player.isActive(self, column) local timeLeft, preyValue = self:getPreyStamina(column), self:getPreyValue(column) if (timeLeft > 0 and preyValue > 0) then return true end return false end function Player.isOpenColumn(self, column) local resultId = db.storeQuery("SELECT prey_column FROM players WHERE name = " ..db.escapeString(self:getName())) if (resultId ~= false) then return result.getDataInt(resultId, "prey_column") >= column end return nil end function Player.sendResource(self, resourceType, value) local typeByte = 0 if (resourceType == "bank") then typeByte = 0x00 elseif (resourceType == "inventory") then typeByte = 0x01 elseif (resourceType == "prey") then typeByte = 0x0A end local msg = NetworkMessage() msg:addByte(0xEE) msg:addByte(typeByte) msg:addU64(value) msg:sendToPlayer(self) end function Player.isActiveByName(self, column, name) if (self:getPreyStamina(column) > 0 and self:getPreyName(column) == name) then return true end return false end function Player.bonusReroll(self, column) local bonusReroll = self:getBonusReroll() if (bonusReroll == 0) then return sendError(self, "[ERROR] You don't have Bonus Reroll.") end if (not self:isActive(column)) then return sendError(self, "[ERROR] You don't have a active bonus.") end local bonusMonster = self:getBonusMonster(column) self:setBonusReroll(bonusReroll-1) self:removeBonus(column) local msg = NetworkMessage() msg:addByte(0xEE) msg:addByte(0x0A) msg:addU64(bonusReroll-1) msg:sendToPlayer(self) changeStateToSelectionChangeMonster(self, column) end function Player.getStaminaBonus(self, column) return self:getPreyStamina(column) end function Player.setStaminaBonus(self, column, value) self:setPreyStamina(column, value) end function Player.removePreyMonster(self, name) local resultId = db.storeQuery("SELECT * FROM player_prey WHERE player_id = " ..self:getGuid().. " AND name = " ..db.escapeString(name)) if (resultId ~= false) then local lastIndex = 0 local mIndex = result.getDataInt(resultId, "mindex") local mColumn = result.getDataInt(resultId, "mcolumn") local totalElements = db.storeQuery("SELECT COUNT(*) FROM player_prey WHERE player_id = " ..self:getGuid().. " AND mcolumn = " ..mColumn) if (totalElements ~= false) then lastIndex = result.getDataInt(totalElements, "COUNT(*)")-1 end if (mIndex == lastIndex) then return true end local resultMonsters = db.storeQuery("SELECT * FROM player_prey WHERE player_id = " ..self:getGuid().. " AND mcolumn = " ..mColumn.. " AND mindex > " ..mIndex.. " AND mindex <= " ..lastIndex) repeat local tmpIndex = result.getDataInt(resultMonsters, "mindex") db.query("UPDATE player_prey SET mindex = mindex - 1 WHERE player_id = " ..self:getGuid() .. " AND mcolumn = " ..mColumn.. " AND mindex = " ..tmpIndex) until not result.next(resultMonsters) result.free(resultMonsters) db.query("DELETE FROM player_prey WHERE player_id = " ..self:getGuid().. " AND name = " ..db.escapeString(name)) end end function Player.addPreySlot(self) db.query("UPDATE players SET prey_column = 2 WHERE id = " ..self:getGuid()) sendPreyData(self, 2) end function Player.getPreySlots(self) local resultId = db.storeQuery("SELECT prey_column FROM players WHERE name = " ..db.escapeString(self:getName())) if (resultId ~= false) then return result.getDataInt(resultId, "prey_column") end return nil end function Player.sendPreyTimeLeft(self, column, time) local msg = NetworkMessage() msg:addByte(ServerPackets.PreyTimeLeft) msg:addByte(column) msg:addU16(time) msg:sendToPlayer(self) end function Player.isBonusReroll(self, column) return self:getPreyName(column) == "BONUSREROLL" end Segue imagem do tempo para os free rerolls: Editado Setembro 12, 2019 5 anos por MatCollier (veja o histórico de edições)
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.