Ir para conteúdo

Featured Replies

Postado

Boa tarde, estou com o problema no meu Prey System, onde todos os chares sempre ficam com a mesma Prey independente do monstro.

Alguem sabe o que pode ter de errado?

 

Prey = {
    Credits = "System remake: Westwol ~ Packet logic: Cjaker ~  Formulas: slavidodo",
    Version = "4.0",
    LastUpdate = "07/07/19",
}

CONST_PREY_SLOT_FIRST = 0
CONST_PREY_SLOT_SECOND = 1
CONST_PREY_SLOT_THIRD = 2

CONST_MONSTER_TIER_BRONZE = 0
CONST_MONSTER_TIER_SILVER = 1
CONST_MONSTER_TIER_GOLD = 2
CONST_MONSTER_TIER_GOLD = 3
CONST_MONSTER_TIER_PLATINUM = 4

CONST_BONUS_DAMAGE_BOOST = 0
CONST_BONUS_DAMAGE_REDUCTION = 1
CONST_BONUS_XP_BONUS = 2
CONST_BONUS_IMPROVED_LOOT = 3

Prey.Config = {
    ListRerollPrice = 2000
}

Prey.S_Packets = {
    ShowDialog = 0xED,
    PreyRerollPrice = 0xE9,
    PreyData = 0xE8,
    PreyTimeLeft = 0xE7
}

Prey.StateTypes = {
    LOCKED = 0,
    INACTIVE = 1,
    ACTIVE = 2,
    SELECTION = 3,
    SELECTION_CHANGE_MONSTER = 4
}

Prey.UnlockTypes = {
    PREMIUM_OR_STORE = 0,
    STORE = 1,
    NONE = 2
}

Prey.Actions = {
    NEW_LIST = 0,
    NEW_BONUS = 1,
    SELECT = 2,
}

Prey.C_Packets = {
    RequestData = 0xED,
    PreyAction = 0xEB
}

Prey.Bonuses = {
    [CONST_BONUS_DAMAGE_BOOST] = {step = 2, min = 7, max = 25},
    [CONST_BONUS_DAMAGE_REDUCTION] = {step = 2, min = 12, max = 30},
    [CONST_BONUS_XP_BONUS] = {step = 3, min = 13, max = 40},
    [CONST_BONUS_IMPROVED_LOOT] = {step = 3, min = 13, max = 40}
}

Prey.MonsterList = {
    [CONST_MONSTER_TIER_BRONZE] = {
        "Rotworm", "Carrion Worm", "Skeleton", "Ghoul", "Cyclops", "Cyclops Drone", "Cyclops Smith", "Dark Magician",
        "Beholder", "Dragon", "Dragon Hatchling", "Dwarf", "Dwarf Guard", "Dwarf Geomancer", "Dwarf Soldier", "Earth Elemental",
        "Fire Elemental", "Gargoyle", "Merlkin", "Minotaur", "Minotaur Guard", "Minotaur Mage", "Minotaur Archer", "Nomad",
        "Amazon", "Hunter", "Orc", "Orc Berserker", "Orc Leader", "Orc Shaman", "Orc Spearman", "Orc Warlord", "Panda",
        "Rotworm Queen", "Tarantula", "Scarab", "Skeleton Warrior", "Smuggler"
    },
    [CONST_MONSTER_TIER_SILVER] = {
         "Pirate Buccaneer", "Pirate Ghost", "Pirate Marauder", "Pirate Skeleton", "Dragon Lord Hatchling", "Frost Dragon Hatchling",
        "Behemoth", "Faun", "Dark Faun", "Dragon Lord", "Frost Dragon", "Hydra", "Hero", "Bullwark", "Giant Spider", "Crystal Spider",
        "Deepling Brawler", "Deepling Elite", "Deepling Guard", "Deepling Master Librarian", "Deepling Tyrant", "Deepling Warrior",
        "Wyrm", "Elder Wyrm", "Fleshslicer", "Frost Giant", "Ghastly Dragon", "Ice Golem", "Infernalist", "Warlock", "Lich",
        "Lizard Chosen", "Lizard Dragon Priest", "Lizard High Guard", "Lizard Legionnaire", "Lizard Zaogun", "Massive Energy Elemental",
        "Massive Fire Elemental", "Massive Water Elemental", "Minotaur Amazon", "Execowtioner", "Minotaur Hunter", "Mooh'Tah Warrior",
        "Mutated Bat", "Mutated Human", "Necromancer", "Nightmare", "Nightmare Scion", "Ogre Brute", "Ogre Savage", "Ogre Shaman",
        "Orclops Doomhauler", "Orclops Ravager", "Quara Constrictor", "Quara Constrictor Scout", "Quara Hydromancer", "Quara Mantassin",
        "Quara Pincher", "Quara Predator", "Sea Serpent", "Shaper Matriarch", "Silencer", "Spitter", "Worker Golem", "Werewolf",
        "Hellspawn", "Shadow Tentacle", "Vampire Bride", "Dragonling", "Shock Head", "Frazzlemaw",
    },
    [CONST_MONSTER_TIER_GOLD] = {
        "Plaguesmith", "Demon", "Crystal Spider", "Defiler", "Destroyer", "Diamond Servant", "Draken Elite",
        "Draken Spellweaver", "Draken Warmaster", "Draken Abomination", "Feversleep", "Terrorsleep", "Draptor",
        "Grim Reaper", "Guzzlemaw", "Hellfire Fighter", "Hand of Cursed Fate", "Hellhound", "Juggernaut",
        "Sparkion", "Dark Torturer", "Undead Dragon", "Retching Horror", "Choking Fear", "Choking Fear",
        "Shiversleep", "Sight Of Surrender", "Demon Outcast", "Blightwalker", "Grimeleech", "Vexclaw", "Grimeleech",
        "Dawnfire Asura", "Midnight Asura", "Frost Flower Asura", "True Dawnfire Asura", "True Frost Flower Asura",
        "True Midnight Asura"
    }
}

-- Communication functions
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.sendErrorDialog(self, error)
    local msg = NetworkMessage()
    msg:addByte(Prey.S_Packets.ShowDialog)
    msg:addByte(0x15)
    msg:addString(error)
    msg:sendToPlayer(self)
end

-- Core functions
function Player.setRandomBonusValue(self, slot, bonus, typeChange)
    local type = self:getPreyBonusType(slot)

    local min = Prey.Bonuses[type].min
    local max = Prey.Bonuses[type].max
    local step = Prey.Bonuses[type].step

    if bonus then
        if typeChange then
            self:setPreyBonusValue(slot, math.random(min, max))
        else
            local oldValue = self:getPreyBonusValue(slot)
            if (oldValue + step >= max) then
                self:setPreyBonusValue(slot, max)
            else
                while (self:getPreyBonusValue(slot) - oldValue < step) do
                    self:setPreyBonusValue(slot, math.random(min, max))
                end
            end
        end
    else
        self:setPreyBonusValue(slot, math.random(min, max))
    end

    self:setPreyBonusGrade(slot, math.floor((self:getPreyBonusValue(slot) - min) / (max - min) * 10))
    if (self:getPreyBonusGrade(slot) == 10 and self:getPreyBonusValue(slot) < max) then
        self:setPreyBonusGrade(slot, self:getPreyBonusGrade(slot) - 1)
    end
end

function Player.getMonsterTier(self)
    if self:getLevel() > 0 and self:getLevel() < 60 then
        return CONST_MONSTER_TIER_BRONZE
    elseif self:getLevel() >= 60 and self:getLevel() < 160 then
        return CONST_MONSTER_TIER_SILVER
    elseif self:getLevel() >= 160 then
        return CONST_MONSTER_TIER_GOLD
    end
end

function Player.createMonsterList(self)
    -- Do not allow repeated monsters
    local repeatedList = {}
    for slot = CONST_PREY_SLOT_FIRST, CONST_PREY_SLOT_THIRD do
        if (self:getPreyCurrentMonster(slot) ~= '') then
            repeatedList[#repeatedList + 1] = self:getPreyCurrentMonster(slot)
        end
        if (self:getPreyMonsterList(slot) ~= '') then
            local currentList = self:getPreyMonsterList(slot):split(";")
            for i = 1, #currentList do
                repeatedList[#repeatedList + 1] = currentList
            end
        end
    end
    -- Generating monsterList
    local monsters = {}
    while (#monsters ~= 9) do
        local randomMonster = Prey.MonsterList[self:getMonsterTier()][math.random(#Prey.MonsterList[self:getMonsterTier()])]
        -- Verify that monster actually exists
        if MonsterType(randomMonster) and not table.contains(monsters, randomMonster) and not table.contains(repeatedList, randomMonster) then
            monsters[#monsters + 1] = randomMonster
        end
    end
    return table.concat(monsters, ";")
end

function Player.resetPreySlot(self, slot, from)
    self:setPreyMonsterList(slot, self:createMonsterList())
    self:setPreyState(slot, from)
    return self:sendPreyData(slot)
end

function Player.getMinutesUntilFreeReroll(self, slot)
    local currentTime = os.time()
    if (self:getPreyNextUse(slot) <= currentTime) then
        return 0
    end
    return math.floor((self:getPreyNextUse(slot) - currentTime) / 60)
end

function Player.getRerollPrice(self)
    return (self:getLevel() / 2) * 100
end

function onRecvbyte(player, msg, byte)
    if (byte == Prey.C_Packets.RequestData) then
        player:sendPreyData(CONST_PREY_SLOT_FIRST)
        player:sendPreyData(CONST_PREY_SLOT_SECOND)
        player:sendPreyData(CONST_PREY_SLOT_THIRD)
    elseif (byte == Prey.C_Packets.PreyAction) then
        player:preyAction(msg)
    end
end

function Player.preyAction(self, msg)

    local slot = msg:getByte()
    local action = msg:getByte()

    if not slot then
        return self:sendErrorDialog("Sorry, there was an issue, please relog-in.")
    end

    -- Verify whether the slot is unlocked
    if (self:getPreyUnlocked(slot) ~= 1) then
        return self:sendErrorDialog("Sorry, you don't have this slot unlocked yet.")
    end

    -- Listreroll
    if (action == Prey.Actions.NEW_LIST) then

        -- Verifying state
        if (self:getPreyState(slot) ~= Prey.StateTypes.ACTIVE and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION_CHANGE_MONSTER) then
            return self:sendErrorDialog("This is slot is not even active.")
        end

        -- If free reroll is available
        if (self:getMinutesUntilFreeReroll(slot) == 0) then
            self:setPreyNextUse(slot, os.time() + 20 * 60 * 60)
        elseif (not self:removeMoneyNpc(self:getRerollPrice())) then
            return self:sendErrorDialog("You do not have enough money to perform this action.")
        end

        self:setPreyCurrentMonster(slot, "")
        self:setPreyMonsterList(slot, self:createMonsterList())
        self:setPreyState(slot, Prey.StateTypes.SELECTION_CHANGE_MONSTER)

    -- Bonus reroll
    elseif (action == Prey.Actions.NEW_BONUS) then

        -- Verifying state
        if (self:getPreyState(slot) ~= Prey.StateTypes.ACTIVE) then
            return self:sendErrorDialog("This is slot is not even active.")
        end

        if (self:getPreyBonusRerolls() < 1) then
            return self:sendErrorDialog("You don't have any bonus rerolls.")
        end

        -- Removing bonus rerolls
        self:setPreyBonusRerolls(self:getPreyBonusRerolls() - 1)

        -- Calculating new bonus
        local oldType = self:getPreyBonusType(slot)
        self:setPreyBonusType(slot, math.random(CONST_BONUS_DAMAGE_BOOST, CONST_BONUS_IMPROVED_LOOT))
        self:setRandomBonusValue(slot, true, (oldType ~= self:getPreyBonusType(slot) and true or false))

    -- Select monster from list
    elseif (action == Prey.Actions.SELECT) then

        local selectedMonster = msg:getByte()
        local monsterList = self:getPreyMonsterList(slot):split(";")

        -- Verify if the monster exists.
        local monster = MonsterType(monsterList[selectedMonster + 1])
        if not monster then
            return self:sendPreyData(slot)
        end

        -- Verifying slot state
        if (self:getPreyState(slot) ~= Prey.StateTypes.SELECTION and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION_CHANGE_MONSTER) then
            return self:sendErrorDialog("This slot can't select monsters.")
        end

        -- Proceeding to prey monster selection
        self:selectPreyMonster(slot, monsterList[selectedMonster + 1])
    end

    -- Perfom slot update
    return self:sendPreyData(slot)
end

function Player.selectPreyMonster(self, slot, monster)

    -- Verify if the monster exists.
    local monster = MonsterType(monster)
    if not monster then
        return self:sendPreyData(slot)
    end

    local msg = NetworkMessage()

    -- Only first/expired selection list gets new prey bonus
    if (self:getPreyState(slot) == Prey.StateTypes.SELECTION) then
        -- Generating random prey type
        self:setPreyBonusType(slot, math.random(CONST_BONUS_DAMAGE_BOOST, CONST_BONUS_IMPROVED_LOOT))
        -- Generating random bonus stats
        self:setRandomBonusValue(slot, false, false)
    end

    -- Setting current monster
    self:setPreyCurrentMonster(slot, monster:getName())
    -- Setting preySlot state
    self:setPreyState(slot, Prey.StateTypes.ACTIVE)
    -- Cleaning up monsterList
    self:setPreyMonsterList(slot, "")
    -- Time left
    self:setPreyTimeLeft(slot, 7200) -- 2 hours
end

function Player.sendPreyData(self, slot)
    if not slot then
        return true
    end

    local slotState = self:getPreyState(slot)

    local msg = NetworkMessage()
    msg:addByte(Prey.S_Packets.PreyData) -- packet header
    msg:addByte(slot) -- slot number
    msg:addByte(slotState) -- slot state

    -- This slot will preserve the same bonus and % but the monster might be changed
    if slotState == Prey.StateTypes.SELECTION_CHANGE_MONSTER then

        -- This values have to be stored on each slot
        msg:addByte(self:getPreyBonusType(slot))
        msg:addU16(self:getPreyBonusValue(slot))
        msg:addByte(self:getPreyBonusGrade(slot))

        -- MonsterList already exists in the slot
        local monsterList = self:getPreyMonsterList(slot):split(";")
        msg:addByte(#monsterList)
        for i = 1, #monsterList do
            local monster = MonsterType(monsterList)
            if monster then
                msg:addString(monster:getName())
                msg:addU16(monster:getOutfit().lookType or 21)
                msg:addByte(monster:getOutfit().lookHead or 0x00)
                msg:addByte(monster:getOutfit().lookBody or 0x00)
                msg:addByte(monster:getOutfit().lookLegs or 0x00)
                msg:addByte(monster:getOutfit().lookFeet or 0x00)
                msg:addByte(monster:getOutfit().lookAddons or 0x00)
            else
                -- Reset slot as it got bugged
                return self:resetPreySlot(slot, Prey.StateTypes.SELECTION_CHANGE_MONSTER)
            end
        end


    -- This slot will have a new monsterList and a random bonus
    elseif slotState == Prey.StateTypes.SELECTION then

        -- If list is empty, then we will create a new one and assign it to the monsterList or timeleft = 0
        local preyMonsterList = self:getPreyMonsterList(slot)
        if preyMonsterList == '' then
            self:setPreyMonsterList(slot, self:createMonsterList())
            -- Resending this preySlot as there was a change.
            return self:sendPreyData(slot)
        end

        local monsterList = preyMonsterList:split(";")
        msg:addByte(#monsterList)
        for i = 1, #monsterList do
            local monster = MonsterType(monsterList)
            if monster then
                msg:addString(monster:getName())
                msg:addU16(monster:getOutfit().lookType or 21)
                msg:addByte(monster:getOutfit().lookHead or 0x00)
                msg:addByte(monster:getOutfit().lookBody or 0x00)
                msg:addByte(monster:getOutfit().lookLegs or 0x00)
                msg:addByte(monster:getOutfit().lookFeet or 0x00)
                msg:addByte(monster:getOutfit().lookAddons or 0x00)
            else
                -- Reset slot as it got bugged
                return self:resetPreySlot(slot, Prey.StateTypes.SELECTION)
            end
        end

    -- This slot is active and will show current monster and bonus
    elseif slotState == Prey.StateTypes.ACTIVE then

        -- Getting current monster
        local monster = MonsterType(self:getPreyCurrentMonster(slot))
        if monster then
            msg:addString(monster:getName())
            msg:addU16(monster:getOutfit().lookType or 21)
            msg:addByte(monster:getOutfit().lookHead or 0x00)
            msg:addByte(monster:getOutfit().lookBody or 0x00)
            msg:addByte(monster:getOutfit().lookLegs or 0x00)
            msg:addByte(monster:getOutfit().lookFeet or 0x00)
            msg:addByte(monster:getOutfit().lookAddons or 0x00)
            msg:addByte(self:getPreyBonusType(slot))
            msg:addU16(self:getPreyBonusValue(slot))
            msg:addByte(self:getPreyBonusGrade(slot))
            msg:addU16(self:getPreyTimeLeft(slot))
        else
            -- Reset slot as it got expired or bugged.
            return self:resetPreySlot(slot, Prey.StateTypes.SELECTION)
        end

    -- This slot is inactive and will not take any extra bytes
    elseif slotState == Prey.StateTypes.INACTIVE then


    elseif slotState == Prey.StateTypes.LOCKED then
        msg.addByte(Prey.UnlockTypes.PREMIUM_OR_STORE) -- Store unlock method
    end

    -- Resources and times are always sent
    msg:addU16(self:getMinutesUntilFreeReroll(slot)) -- next prey reroll here
    -- Client 11.9+ compat, feature unavailable.
    if self:getClient().version >= 1190 then
        msg:addByte(0x00) -- preyWildCards
    end
    msg:addByte(0xEC)
    self:sendResource("prey", self:getPreyBonusRerolls())
    self:sendResource("bank", self:getBankBalance())
    self:sendResource("inventory", self:getMoney())
    -- List reroll price
    msg:addByte(Prey.S_Packets.PreyRerollPrice)
    msg:addU32(self:getRerollPrice())
    -- Client 11.9+ compat, feature unavailable.
    if self:getClient().version >= 1190 then
        msg:addByte(0x00)
        msg:addByte(0x00)
    end
    -- Sending message to client
    msg:sendToPlayer(self)
end
 

Sem título.png

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo