Hey, so Im using zbizu's modal skillpoint system and Im trying to change it so that depending on your vocation, you can only increase certain skills. Here's the full script
Zbizu was kind enough to show what functions to add but I honestly dont have any clue where to put them, I tried some stuff but nope .
If any kind soul out there would help with this I would be extremely glad!
Code:
-- config
--promoted vocations included in function
local gainVoc = {
[0] = {health = 0, mana = 0, magic = 0, skill = 0, cap = 0},
[1] = {health = 0, mana = 10, magic = 1, skill = 0, cap = 0},
[2] = {health = 0, mana = 10, magic = 1, skill = 0, cap = 0},
[3] = {health = 6, mana = 6, magic = 0, skill = 1, cap = 5},
[4] = {health = 10, mana = 0, magic = 0, skill = 1, cap = 10}
}
local skillStorage = 62490
local modalId = 4869
local TextModalId = 4870 -- so player may return to skill window
local skillPointsPerLevel = 1 -- points per level
local skillPointsAdvanceStorage = 62491 -- storage to avoid giving points twice for same level
local skillPointsTalkaction = "skillbook" -- so player knows command when he gets level up
local skills = {
-- name, get value, set value
[1] = {'Health', function(player) return player:getMaxHealth() end, function(player) local gain = gainVoc[player:getBaseVocId()].health player:setMaxHealth(player:getMaxHealth() + gain) return gain end, 1},
[2] = {'Mana', function(player) return player:getMaxMana() end, function(player) local gain = gainVoc[player:getBaseVocId()].mana player:setMaxMana(player:getMaxMana() + gain) return gain end, 1},
[3] = {'Magic', function(player) return player:getBaseMagicLevel() end, function(player) local gain = gainVoc[player:getBaseVocId()].magic player:addSkillLevels(SKILL_MAGLEVEL, gain) return gain end, 2},
[4] = {'Club', function(player) return player:getSkillLevel(SKILL_CLUB) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_CLUB, gain) return gain end, 2},
[5] = {'Sword', function(player) return player:getSkillLevel(SKILL_SWORD) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_SWORD, gain) return gain end, 2},
[6] = {'Axe', function(player) return player:getSkillLevel(SKILL_AXE) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_AXE, gain) return gain end, 2},
[7] = {'Distance', function(player) return player:getSkillLevel(SKILL_DISTANCE) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_DISTANCE, gain) return gain end, 2},
[8] = {'Shielding', function(player) return player:getSkillLevel(SKILL_SHIELD) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_SHIELD, gain) return gain end, 2}
}
function Player.getBaseVocId(self)
local basevoc = self:getVocation():getDemotion()
if basevoc then
return basevoc:getId()
end
return self:getVocation():getId()
end
function getExpForLevel(level)
level = level - 1
return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end
function Player.addSkillLevels(self, skill, count)
count = math.max(1, count or 1)
if isInArray({SKILL_FIST, SKILL_CLUB, SKILL_SWORD, SKILL_AXE, SKILL_DISTANCE, SKILL_SHIELD, SKILL_FISHING}, skill) then
for i = 1, count do
local xp = math.ceil(self:getVocation():getRequiredSkillTries(skill, self:getSkillLevel(skill) + 1) / configManager.getNumber(configKeys.RATE_SKILL))
self:addSkillTries(skill, xp)
end
return true
end
if skill == SKILL_MAGLEVEL then
for i = 1, count do
local xp = math.ceil(self:getVocation():getRequiredManaSpent(self:getBaseMagicLevel() + 1) / configManager.getNumber(configKeys.RATE_MAGIC))
self:addManaSpent(xp)
end
return true
end
if skill == SKILL_LEVEL then
for i = 1, count do
local lv = self:getLevel()
local xp = getExpForLevel(lv + 1) - getExpForLevel(lv)
self:addExperience(xp, false)
end
return true
end
return false
end
function Player.sendSkillPointsWindow(self)
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
local window = ModalWindow(modalId, "Skillbook", "Available skillpoints: [" .. pts .. "]")
window:addButton(1, "Assign")
window:addButton(2, "Exit")
for i = 1, #skills do
window:addChoice(i, skills[i][1] .. ": [" .. skills[i][2](self) .. "] [cost: " .. skills[i][4] .. "]")
end
window:setDefaultEnterButton(1)
window:setDefaultEscapeButton(2)
window:sendToPlayer(self)
return true
end
function Player.skillWindowChoice(self, windowId, buttonId, choiceId)
if windowId == modalId then
if buttonId == 1 then
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, pts - skills[i][4])
pts = 0
end
if pts - skills[choiceId][4] >= 0 then
local textWindow = ModalWindow(TextModalId, "skill point assigned.", skills[choiceId][1] .. " +" .. skills[choiceId][3](self))
textWindow:addButton(1, "Ok")
textWindow:setDefaultEnterButton(1)
textWindow:setDefaultEscapeButton(1)
textWindow:sendToPlayer(self)
self:setStorageValue(skillStorage, pts - skills[choiceId][4])
return true
end
local textWindow = ModalWindow(TextModalId, "Error", "Not enough points")
textWindow:addButton(1, "Ok")
textWindow:setDefaultEnterButton(1)
textWindow:setDefaultEscapeButton(1)
textWindow:sendToPlayer(self)
return true
end
return false
end
if not (windowId == TextModalId) then
return false
end
self:sendSkillPointsWindow()
return false
end
function Player.addSkillPoints(self, count)
count = math.max(1, count or 1)
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
return self:setStorageValue(skillStorage, pts + count)
end
function Player.skillPointsAdvance(self, nlevel)
if self:getStorageValue(skillPointsAdvanceStorage) < nlevel then
self:addSkillPoints(skillPointsPerLevel)
self:setStorageValue(skillPointsAdvanceStorage, nlevel)
self:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "New skill points available. Open your" .. skillPointsTalkaction .. " to asign your new skill point.")
end
return true
end
Zbizu was kind enough to show what functions to add but I honestly dont have any clue where to put them, I tried some stuff but nope .
Find this:
Code:for i = 1, #skills do window:addChoice(i, skills[i][1] .. ": [" .. skills[i][2](self) .. "]") end
Above addChoice put if isIArray(table, i) then
-- addChoice
end
Funcions you will need:
isInArray(table[voc], i)
player:getVocation():getId()
table = {
[vocid] = {statid1, statid2}
}
If any kind soul out there would help with this I would be extremely glad!