CipsoftStinks
www.relicaria.com
Hello I'm trying to add skill stages support for my ot tfs 1.3
i have edited the tables a bit and im having troubles with it im trying to handle more than 1 vocation per table so that way i don't have to add a new table for each vocacion that in this case would be include atleast eight different tables.
i have added the scripts to events/scripts/player.lua
as you can see in the script in some tables im using two or even for vocations per table. and that's the problem dunno why, i think a comma , should work . but it doesn't
and here is the whole player.lua
and i must add the i get the script from here
Skills Stages for tfs 1.x
ok solved it. doing it in the long long way. i got like eight long tables. does anybody has another way?
i have edited the tables a bit and im having troubles with it im trying to handle more than 1 vocation per table so that way i don't have to add a new table for each vocacion that in this case would be include atleast eight different tables.
i have added the scripts to events/scripts/player.lua
as you can see in the script in some tables im using two or even for vocations per table. and that's the problem dunno why, i think a comma , should work . but it doesn't
Lua:
--agregado
local config = {
-- base vocationId --knights
[4, 8] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 9, --10
[{6, 10}] = 5,
[{11, 15}] = 1
}
}
}
local config = {
-- base vocationId --Magues
[1, 2, 5, 6] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 25, --10
[{6, 10}] = 20,
[{11, 15}] = 15,
[{16, 20}] = 10,
[{21, 25}] = 8,
[{26, 30}] = 5,
[{31, 35}] = 3,
[{36, 40}] = 2,
[{41, 50}] = 1,
}
}
}
local config = {
-- base vocationId --Paladin
[3, 7] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 10, --10
[{6, 10}] = 6,
[{11, 15}] = 3,
[{16, 20}] = 1
}
}
}
function Vocation.getBase(self)
local demotion = self:getDemotion()
while demotion do
local tmp = demotion:getDemotion()
if not tmp then
return demotion
end
demotion = tmp
end
return self
end
local function getSkillRate(player, skillId)
local targetVocation = config[player:getVocation():getBase():getId()]
if targetVocation then
local targetSkillStage = targetVocation[skillId]
if targetSkillStage then
local skillLevel = player:getSkillLevel(skillId)
for level, rate in pairs(targetSkillStage) do
if skillLevel >= level[1] and skillLevel <= level[2] then
return rate
end
end
end
end
return skillId == SKILL_MAGLEVEL and configManager.getNumber(configKeys.RATE_MAGIC) or configManager.getNumber(configKeys.RATE_SKILL)
end
function Player:onGainSkillTries(skill, tries)
if not APPLY_SKILL_MULTIPLIER then
return tries
end
return tries * getSkillRate(self, skill)
end
and here is the whole player.lua
Code:
function Player:onLook(thing, position, distance)
local description = "You see " .. thing:getDescription(distance)
if self:getGroup():getAccess() then
if thing:isItem() then
description = string.format("%s\nItem ID: %d", description, thing:getId())
local actionId = thing:getActionId()
if actionId ~= 0 then
description = string.format("%s, Action ID: %d", description, actionId)
end
local uniqueId = thing:getAttribute(ITEM_ATTRIBUTE_UNIQUEID)
if uniqueId > 0 and uniqueId < 65536 then
description = string.format("%s, Unique ID: %d", description, uniqueId)
end
local itemType = thing:getType()
local transformEquipId = itemType:getTransformEquipId()
local transformDeEquipId = itemType:getTransformDeEquipId()
if transformEquipId ~= 0 then
description = string.format("%s\nTransforms to: %d (onEquip)", description, transformEquipId)
elseif transformDeEquipId ~= 0 then
description = string.format("%s\nTransforms to: %d (onDeEquip)", description, transformDeEquipId)
end
local decayId = itemType:getDecayId()
if decayId ~= -1 then
description = string.format("%s\nDecays to: %d", description, decayId)
end
elseif thing:isCreature() then
local str = "%s\nHealth: %d / %d"
if thing:isPlayer() and thing:getMaxMana() > 0 then
str = string.format("%s, Mana: %d / %d", str, thing:getMana(), thing:getMaxMana())
end
description = string.format(str, description, thing:getHealth(), thing:getMaxHealth()) .. "."
end
local position = thing:getPosition()
description = string.format(
"%s\nPosition: %d, %d, %d",
description, position.x, position.y, position.z
)
if thing:isCreature() then
if thing:isPlayer() then
description = string.format("%s\nIP: %s.", description, Game.convertIpToString(thing:getIp()))
end
end
end
self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end
function Player:onLookInBattleList(creature, distance)
local description = "You see " .. creature:getDescription(distance)
if self:getGroup():getAccess() then
local str = "%s\nHealth: %d / %d"
if creature:isPlayer() and creature:getMaxMana() > 0 then
str = string.format("%s, Mana: %d / %d", str, creature:getMana(), creature:getMaxMana())
end
description = string.format(str, description, creature:getHealth(), creature:getMaxHealth()) .. "."
local position = creature:getPosition()
description = string.format(
"%s\nPosition: %d, %d, %d",
description, position.x, position.y, position.z
)
if creature:isPlayer() then
description = string.format("%s\nIP: %s", description, Game.convertIpToString(creature:getIp()))
end
end
self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end
function Player:onLookInTrade(partner, item, distance)
self:sendTextMessage(MESSAGE_INFO_DESCR, "You see " .. item:getDescription(distance))
end
function Player:onLookInShop(itemType, count)
return true
end
function Player:onMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
return true
end
function Player:onItemMoved(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
end
function Player:onMoveCreature(creature, fromPosition, toPosition)
return true
end
local function hasPendingReport(name, targetName, reportType)
local f = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "r")
if f then
io.close(f)
return true
else
return false
end
end
function Player:onReportRuleViolation(targetName, reportType, reportReason, comment, translation)
local name = self:getName()
if hasPendingReport(name, targetName, reportType) then
self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your report is being processed.")
return
end
local file = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "a")
if not file then
self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "There was an error when processing your report, please contact a gamemaster.")
return
end
io.output(file)
io.write("------------------------------\n")
io.write("Reported by: " .. name .. "\n")
io.write("Target: " .. targetName .. "\n")
io.write("Type: " .. reportType .. "\n")
io.write("Reason: " .. reportReason .. "\n")
io.write("Comment: " .. comment .. "\n")
if reportType ~= REPORT_TYPE_BOT then
io.write("Translation: " .. translation .. "\n")
end
io.write("------------------------------\n")
io.close(file)
self:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Thank you for reporting %s. Your report will be processed by %s team as soon as possible.", targetName, configManager.getString(configKeys.SERVER_NAME)))
return
end
function Player:onReportBug(message, position, category)
if self:getAccountType() == ACCOUNT_TYPE_NORMAL then
return false
end
local name = self:getName()
local file = io.open("data/reports/bugs/" .. name .. " report.txt", "a")
if not file then
self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "There was an error when processing your report, please contact a gamemaster.")
return true
end
io.output(file)
io.write("------------------------------\n")
io.write("Name: " .. name)
if category == BUG_CATEGORY_MAP then
io.write(" [Map position: " .. position.x .. ", " .. position.y .. ", " .. position.z .. "]")
end
local playerPosition = self:getPosition()
io.write(" [Player Position: " .. playerPosition.x .. ", " .. playerPosition.y .. ", " .. playerPosition.z .. "]\n")
io.write("Comment: " .. message .. "\n")
io.close(file)
self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "Your report has been sent to " .. configManager.getString(configKeys.SERVER_NAME) .. ".")
return true
end
function Player:onTurn(direction)
return true
end
function Player:onTradeRequest(target, item)
return true
end
function Player:onTradeAccept(target, item, targetItem)
return true
end
local soulCondition = Condition(CONDITION_SOUL, CONDITIONID_DEFAULT)
soulCondition:setTicks(4 * 60 * 1000)
soulCondition:setParameter(CONDITION_PARAM_SOULGAIN, 1)
local function useStamina(player)
local staminaMinutes = player:getStamina()
if staminaMinutes == 0 then
return
end
local playerId = player:getId()
local currentTime = os.time()
local timePassed = currentTime - nextUseStaminaTime[playerId]
if timePassed <= 0 then
return
end
if timePassed > 60 then
if staminaMinutes > 2 then
staminaMinutes = staminaMinutes - 2
else
staminaMinutes = 0
end
nextUseStaminaTime[playerId] = currentTime + 120
else
staminaMinutes = staminaMinutes - 1
nextUseStaminaTime[playerId] = currentTime + 60
end
player:setStamina(staminaMinutes)
end
function Player:onGainExperience(source, exp, rawExp)
if not source or source:isPlayer() then
return exp
end
-- Soul regeneration
local vocation = self:getVocation()
if self:getSoul() < vocation:getMaxSoul() and exp >= self:getLevel() then
soulCondition:setParameter(CONDITION_PARAM_SOULTICKS, vocation:getSoulGainTicks() * 1000)
self:addCondition(soulCondition)
end
-- Apply experience stage multiplier
exp = exp * Game.getExperienceStage(self:getLevel())
-- Stamina modifier
if configManager.getBoolean(configKeys.STAMINA_SYSTEM) then
useStamina(self)
local staminaMinutes = self:getStamina()
if staminaMinutes > 2400 and self:isPremium() then
exp = exp * 1.5
elseif staminaMinutes <= 840 then
exp = exp * 0.5
end
end
return exp
end
function Player:onLoseExperience(exp)
return exp
end
--function Player:onGainSkillTries(skill, tries)
--if APPLY_SKILL_MULTIPLIER == false then
-- return tries
--end
--if skill == SKILL_MAGLEVEL then
--return tries * configManager.getNumber(configKeys.RATE_MAGIC)
-- end
--return tries * configManager.getNumber(configKeys.RATE_SKILL)
--end
--agregado
local config = {
-- base vocationId --knights
[4, 8] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 9, --10
[{6, 10}] = 5,
[{11, 15}] = 1
}
}
}
local config = {
-- base vocationId --Magues
[1, 2, 5, 6] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 20,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 5,
[{30, 39}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 25, --10
[{6, 10}] = 20,
[{11, 15}] = 15,
[{16, 20}] = 10,
[{21, 25}] = 8,
[{26, 30}] = 5,
[{31, 35}] = 3,
[{36, 40}] = 2,
[{41, 50}] = 1,
}
}
}
local config = {
-- base vocationId --Paladin
[3, 7] = {
-- skillId
[SKILL_FIST] = {
-- [{skillLevel}] = skillRate
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_CLUB] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_SWORD] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_AXE] = {
[{10, 19}] = 25,--10
[{20, 29}] = 15,
[{30, 39}] = 5,
[{40, 49}] = 5,
[{50, 59}] = 1
},
[SKILL_DISTANCE] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_SHIELD] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_FISHING] = {
[{10, 19}] = 30,--10
[{20, 29}] = 20,
[{30, 39}] = 10,
[{40, 49}] = 6,
[{50, 59}] = 4,
[{60, 69}] = 3,
[{70, 79}] = 2,
[{80, 89}] = 1
},
[SKILL_MAGLEVEL] = {
[{0, 5}] = 10, --10
[{6, 10}] = 6,
[{11, 15}] = 3,
[{16, 20}] = 1
}
}
}
function Vocation.getBase(self)
local demotion = self:getDemotion()
while demotion do
local tmp = demotion:getDemotion()
if not tmp then
return demotion
end
demotion = tmp
end
return self
end
local function getSkillRate(player, skillId)
local targetVocation = config[player:getVocation():getBase():getId()]
if targetVocation then
local targetSkillStage = targetVocation[skillId]
if targetSkillStage then
local skillLevel = player:getSkillLevel(skillId)
for level, rate in pairs(targetSkillStage) do
if skillLevel >= level[1] and skillLevel <= level[2] then
return rate
end
end
end
end
return skillId == SKILL_MAGLEVEL and configManager.getNumber(configKeys.RATE_MAGIC) or configManager.getNumber(configKeys.RATE_SKILL)
end
function Player:onGainSkillTries(skill, tries)
if not APPLY_SKILL_MULTIPLIER then
return tries
end
return tries * getSkillRate(self, skill)
end
and i must add the i get the script from here
Skills Stages for tfs 1.x
ok solved it. doing it in the long long way. i got like eight long tables. does anybody has another way?
Last edited: