Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions data/creaturescripts/scripts/login.lua
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ function onLogin(player)
player:setVocation(vocation:getDemotion())
end

local trackedBestiary = player:getTrackedBestiary(true)
if #trackedBestiary > 0 then
player:sendBestiaryTracker()
end

-- Events
player:registerEvent("PlayerDeath")
player:registerEvent("DropLoot")
Expand Down
9 changes: 9 additions & 0 deletions data/global.lua
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,15 @@ table.contains = function(array, value)
return false
end

table.indexOf = function(array, value)
for i, targetColumn in pairs(array) do
if targetColumn == value then
return i
end
end
return nil
end

string.split = function(str, sep)
local res = {}
for v in str:gmatch("([^" .. sep .. "]+)") do
Expand Down
6 changes: 6 additions & 0 deletions data/lib/core/game.lua
Original file line number Diff line number Diff line change
Expand Up @@ -177,3 +177,9 @@ do
return false
end
end

do
local trackedBestiary = {}

function Game.getTrackedBestiary() return trackedBestiary end
end
76 changes: 76 additions & 0 deletions data/lib/core/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -534,3 +534,79 @@ function Player.sendBestiaryMilestoneReached(self, raceId)
msg:delete()
return true
end

function Player.getMaxTrackedBestiary(self)
return 50 -- client sided
end

function Player.setTrackedBestiary(self, raceId, checked)
local trackedBestiary = self:getTrackedBestiary()
if checked and #trackedBestiary >= self:getMaxTrackedBestiary() then
self:sendTextMessage(MESSAGE_STATUS_WARNING, "You have reached the maximum number of trackable creatures.\nYou have to remove one of your currently tracked creatures before you can add another one.")
return false
end

local index = table.indexOf(trackedBestiary, raceId)
if not checked then
if index ~= nil then table.remove(trackedBestiary, index) end
else
if index == nil then table.insert(trackedBestiary, raceId) end
end

for k = 1, self:getMaxTrackedBestiary() do
self:setStorageValue(PlayerStorageKeys.bestiaryTrackerBase + k, -1)
end

for k = 1, #trackedBestiary do
self:setStorageValue(PlayerStorageKeys.bestiaryTrackerBase + k, trackedBestiary[k])
end

Game.getTrackedBestiary()[self:getId()] = trackedBestiary

return true
end

function Player.getTrackedBestiary(self, isLogin)
if isLogin == nil then isLogin = false end
if not isLogin then
return Game.getTrackedBestiary()[self:getId()]
end

local trackedBestiary = {}
for k = 1, self:getMaxTrackedBestiary() do
local raceId = self:getStorageValue(PlayerStorageKeys.bestiaryTrackerBase + k)
if raceId > 0 then
table.insert(trackedBestiary, raceId)
end
end

Game.getTrackedBestiary()[self:getId()] = trackedBestiary

return trackedBestiary
end

function Player.sendBestiaryTracker(self)
local msg = NetworkMessage()
msg:addByte(0xB9)

local trackedBestiary = self:getTrackedBestiary()
msg:addByte(#trackedBestiary)

for _, raceId in ipairs(trackedBestiary) do
msg:addU16(raceId)

local kills = self:getBestiaryKills(raceId)
msg:addU32(kills)

local monsterType = MonsterType(raceId)
local info = monsterType and monsterType:getBestiaryInfo() or {prowess = 1, expertise = 2, mastery = 3}
msg:addU16(info.prowess)
msg:addU16(info.expertise)
msg:addU16(info.mastery)
msg:addByte(kills >= info.mastery and 0x01 or 0x00)
end

msg:sendToPlayer(self)
msg:delete()
return true
end
1 change: 1 addition & 0 deletions data/lib/core/storages.lua
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,5 @@ PlayerStorageKeys = {
achievementsCounter = 20000,

bestiaryKillsBase = 400000,
bestiaryTrackerBase = 500000,
}
4 changes: 4 additions & 0 deletions data/scripts/creaturescripts/bestiary_kills.lua
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ function creatureEvent.onKill(player, target)

for _, killer in pairs(getKillersForBestiary(monster)) do
killer:addBestiaryKills(raceId)
local trackedBestiary = killer:getTrackedBestiary()
if #trackedBestiary > 0 and table.contains(trackedBestiary, raceId) then
killer:sendBestiaryTracker()
end
end
return true
end
Expand Down
11 changes: 11 additions & 0 deletions data/scripts/network/bestiary_tracker.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
local handler = PacketHandler(0x2A)

function handler.onReceive(player, msg)
local raceId = msg:getU16()
local checked = msg:getByte() == 1
if player:setTrackedBestiary(raceId, checked) then
player:sendBestiaryTracker()
end
end

handler:register()