Hello, how are you? So I am using this script for every lvl that upa earns "Skills Points" I am with 2 doubt.
1st I wanted that when the upa character appeared a message on the screen something like "+1 Skill Points!" I saw that in Script there is a message area, but it is not working.
(self:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "New skill points available. Type " .. skillPointsTalkaction .. " to open character mastery window."))
2 ° I wanted to create another "Reset" button that would need an ITEM, then when I clicked the button the player would gain all the points spent again and reset the status of it. keeping lvl gain to upar, wanted to only rested the Skills that he distributed. Type if the player put 5 points in life, the player has 100 of life, with those 5 points, got 150, then using the reset button he would get the 5 points would lose those 50 extra life and would return with 100 normal life. Follow the script below. THANK YOU THANK YOU FOR HELPING ME.
( CreatureEvent - [TFS 1.1] Skill Points, modalwindow (https://otland.net/threads/tfs-1-1-skill-points-modalwindow.229280/) )
1st I wanted that when the upa character appeared a message on the screen something like "+1 Skill Points!" I saw that in Script there is a message area, but it is not working.
(self:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "New skill points available. Type " .. skillPointsTalkaction .. " to open character mastery window."))
2 ° I wanted to create another "Reset" button that would need an ITEM, then when I clicked the button the player would gain all the points spent again and reset the status of it. keeping lvl gain to upar, wanted to only rested the Skills that he distributed. Type if the player put 5 points in life, the player has 100 of life, with those 5 points, got 150, then using the reset button he would get the 5 points would lose those 50 extra life and would return with 100 normal life. Follow the script below. THANK YOU THANK YOU FOR HELPING ME.
<event type="modalwindow" name="skillPoints_modal" script="sp.lua"/>
<event type="advance" name="skillPoints_advance" script="sp.lua"/>
<event type="login" name="skillPoints_register" script="sp.lua"/>
<event type="advance" name="skillPoints_advance" script="sp.lua"/>
<event type="login" name="skillPoints_register" script="sp.lua"/>
function onModalWindow(player, modalWindowId, buttonId, choiceId)
player:skillWindowChoice(modalWindowId, buttonId, choiceId)
return true
end
function onAdvance(player, skill, oldLevel, newLevel)
if skill == SKILL_LEVEL then
player:skillPointsAdvance(newLevel)
end
return true
end
function onLogin(player)
player:registerEvent("skillPoints_advance")
player:registerEvent("skillPoints_modal")
return true
end
player:skillWindowChoice(modalWindowId, buttonId, choiceId)
return true
end
function onAdvance(player, skill, oldLevel, newLevel)
if skill == SKILL_LEVEL then
player:skillPointsAdvance(newLevel)
end
return true
end
function onLogin(player)
player:registerEvent("skillPoints_advance")
player:registerEvent("skillPoints_modal")
return true
end
<talkaction words="!points" script="sp.lua"/>
function onSay(player, words, param)
player:sendSkillPointsWindow()
return false
end
player:sendSkillPointsWindow()
return false
end
-- config
--promoted vocations included in function
local gainVoc = {
[0] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[1] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[2] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[3] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[4] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10}
}
local skillStorage = 62490
local modalId = 4869
local TextModalId = 4870 -- so player may return to skill window
local skillPointsPerLevel = 3 -- points per level
local skillPointsAdvanceStorage = 62491 -- storage to avoid giving points twice for same level
local skillPointsTalkaction = "!points" -- 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, 10},
[2] = {'Mana', function(player) return player:getMaxMana() end, function(player) local gain = gainVoc[player:getBaseVocId()].mana player:setMaxMana(player:getMaxMana() + gain) return gain end, 10},
[3] = {'Capacity', function(player) return player:getCapacity() / 100 end, function(player) local gain = gainVoc[player:getBaseVocId()].cap player:setCapacity(player:getCapacity() + (gain * 100)) return gain end, 10},
[4] = {'Magic', function(player) return player:getBaseMagicLevel() end, function(player) local gain = gainVoc[player:getBaseVocId()].magic player:addSkillLevels(SKILL_MAGLEVEL, gain) return gain end, 10},
[5] = {'Fist', function(player) return player:getSkillLevel(SKILL_FIST) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_FIST, gain) return gain end, 10},
[6] = {'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, 10},
[7] = {'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, 10},
[8] = {'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, 10},
[9] = {'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, 10},
[10] = {'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, 10},
[11] = {'Fishing', function(player) return player:getSkillLevel(SKILL_FISHING) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_FISHING, gain) return gain end, 10}
}
local skillForVoc = {
[1] = {1, 2, 3, 4, 10, 11}, -- sorcerer
[2] = {1, 2, 3, 4, 10, 11}, -- druid
[3] = {1, 2, 3, 4, 9, 10, 11}, -- paladin
[4] = {1, 2, 3, 5, 6, 7, 8, 10, 11}, -- knight
}
function Player:getBaseVocId()
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(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()
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
local window = ModalWindow(modalId, "Character Mastery", "Available points: [" .. pts .. "]")
window:addButton(1, "Assign")
window:addButton(2, "Exit")
for i = 1, #skills do
if isInArray(skillForVoc[self:getBaseVocId()], i) then
window:addChoice(i, skills[1] .. ": [" .. skills[2](self) .. "][cost: " .. skills[4] .. "]")
end
end
window:setDefaultEnterButton(1)
window:setDefaultEscapeButton(2)
window:sendToPlayer(self)
return true
end
function Player:skillWindowChoice(windowId, buttonId, choiceId)
if windowId == modalId then
if buttonId == 1 then
if not skills[choiceId] then
local textWindow = ModalWindow(TextModalId, "Error", "No skill selected.")
textWindow:addButton(1, "Ok")
textWindow:setDefaultEnterButton(1)
textWindow:setDefaultEscapeButton(1)
textWindow:sendToPlayer(self)
return true
end
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
if pts - skills[choiceId][4] >= 0 then
local textWindow = ModalWindow(TextModalId, "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(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(nlevel)
if self:getStorageValue(skillPointsAdvanceStorage) < nlevel then
self:addSkillPoints(skillPointsPerLevel)
self:setStorageValue(skillPointsAdvanceStorage, nlevel)
self:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "New skill points available. Type " .. skillPointsTalkaction .. " to open character mastery window.")
end
return true
end
--promoted vocations included in function
local gainVoc = {
[0] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[1] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[2] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[3] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10},
[4] = {health = 10, mana = 10, magic = 1, skill = 1, cap = 10}
}
local skillStorage = 62490
local modalId = 4869
local TextModalId = 4870 -- so player may return to skill window
local skillPointsPerLevel = 3 -- points per level
local skillPointsAdvanceStorage = 62491 -- storage to avoid giving points twice for same level
local skillPointsTalkaction = "!points" -- 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, 10},
[2] = {'Mana', function(player) return player:getMaxMana() end, function(player) local gain = gainVoc[player:getBaseVocId()].mana player:setMaxMana(player:getMaxMana() + gain) return gain end, 10},
[3] = {'Capacity', function(player) return player:getCapacity() / 100 end, function(player) local gain = gainVoc[player:getBaseVocId()].cap player:setCapacity(player:getCapacity() + (gain * 100)) return gain end, 10},
[4] = {'Magic', function(player) return player:getBaseMagicLevel() end, function(player) local gain = gainVoc[player:getBaseVocId()].magic player:addSkillLevels(SKILL_MAGLEVEL, gain) return gain end, 10},
[5] = {'Fist', function(player) return player:getSkillLevel(SKILL_FIST) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_FIST, gain) return gain end, 10},
[6] = {'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, 10},
[7] = {'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, 10},
[8] = {'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, 10},
[9] = {'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, 10},
[10] = {'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, 10},
[11] = {'Fishing', function(player) return player:getSkillLevel(SKILL_FISHING) end, function(player) local gain = gainVoc[player:getBaseVocId()].skill player:addSkillLevels(SKILL_FISHING, gain) return gain end, 10}
}
local skillForVoc = {
[1] = {1, 2, 3, 4, 10, 11}, -- sorcerer
[2] = {1, 2, 3, 4, 10, 11}, -- druid
[3] = {1, 2, 3, 4, 9, 10, 11}, -- paladin
[4] = {1, 2, 3, 5, 6, 7, 8, 10, 11}, -- knight
}
function Player:getBaseVocId()
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(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()
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
local window = ModalWindow(modalId, "Character Mastery", "Available points: [" .. pts .. "]")
window:addButton(1, "Assign")
window:addButton(2, "Exit")
for i = 1, #skills do
if isInArray(skillForVoc[self:getBaseVocId()], i) then
window:addChoice(i, skills[1] .. ": [" .. skills[2](self) .. "][cost: " .. skills[4] .. "]")
end
end
window:setDefaultEnterButton(1)
window:setDefaultEscapeButton(2)
window:sendToPlayer(self)
return true
end
function Player:skillWindowChoice(windowId, buttonId, choiceId)
if windowId == modalId then
if buttonId == 1 then
if not skills[choiceId] then
local textWindow = ModalWindow(TextModalId, "Error", "No skill selected.")
textWindow:addButton(1, "Ok")
textWindow:setDefaultEnterButton(1)
textWindow:setDefaultEscapeButton(1)
textWindow:sendToPlayer(self)
return true
end
local pts = self:getStorageValue(skillStorage)
if pts < 0 then
self:setStorageValue(skillStorage, 0)
pts = 0
end
if pts - skills[choiceId][4] >= 0 then
local textWindow = ModalWindow(TextModalId, "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(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(nlevel)
if self:getStorageValue(skillPointsAdvanceStorage) < nlevel then
self:addSkillPoints(skillPointsPerLevel)
self:setStorageValue(skillPointsAdvanceStorage, nlevel)
self:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "New skill points available. Type " .. skillPointsTalkaction .. " to open character mastery window.")
end
return true
end
( CreatureEvent - [TFS 1.1] Skill Points, modalwindow (https://otland.net/threads/tfs-1-1-skill-points-modalwindow.229280/) )