Hi
i got this error, it happens when i cast spell.
i got this error, it happens when i cast spell.
LUA:
local experienceStages = {
{
minlevel = 1,
maxlevel = 8,
multiplier = 7
}, {
minlevel = 9,
maxlevel = 20,
multiplier = 6
}, {
minlevel = 21,
maxlevel = 50,
multiplier = 5
}, {
minlevel = 51,
maxlevel = 100,
multiplier = 4
}, {
minlevel = 101,
multiplier = 3
}
}
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: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: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
local vocs = {
[{1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35}] = {13385, 12746, 13434, 13435, 12747, 12744, 12748, 12736, 13444, 13443, 15667, 15712},
[{10, 11, 19, 23, 34}] = {12716, 12717, 12722, 12727, 12720, 12721, 12724, 12723, 12730, 12729, 14675, 14680, 14678, 14676, 14679, 14681, 14677, 14683, 14682, 14684, 13390, 14685, 14686, 14498, 12699, 12700, 12698, 12702,
12713, 12703, 12704, 12701, 12705, 12706, 12707, 12708, 12710, 12712, 12711, 12709, 12714, 13466, 15671, 15676, 15711, 15724}
}
function Player:onMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
if toPosition.x ~= CONTAINER_POSITION then
return true
end
if bit.band(toPosition.y, 0x40) == 0 then
for vocations, ids in pairs(vocs) do
if table.contains(vocations, self:getVocation():getId()) then
if table.contains(ids, item:getId()) then
return false
end
end
end
end
local itemType, moveItem = ItemType(item:getId())
if bit.band(itemType:getSlotPosition(), SLOTP_TWO_HAND) ~= 0 and toPosition.y == CONST_SLOT_LEFT then
moveItem = self:getSlotItem(CONST_SLOT_RIGHT)
elseif itemType:getWeaponType() == WEAPON_SHIELD and toPosition.y == CONST_SLOT_RIGHT then
moveItem = self:getSlotItem(CONST_SLOT_LEFT)
if moveItem and bit.band(ItemType(moveItem:getId()):getSlotPosition(), SLOTP_TWO_HAND) == 0 then
return true
end
if moveItem then
local parent = item:getParent()
if parent and parent:isItem() and parent:isContainer() then
if parent:getSize() == parent:getCapacity() then
self:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_CONTAINERNOTENOUGHROOM))
return false
else
return moveItem:moveTo(parent)
end
end
end
end
return true
end
function Player:onMoveCreature(creature, fromPosition, toPosition)
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
local function getExpRateFromTable(t, level, default)
for _, rate in ipairs(t) do
if level >= rate.minlevel and (not rate.maxlevel or level <= rate.maxlevel) then
return rate.multiplier
end
end
return default
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 * getExpRateFromTable(experienceStages, self:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
-- 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
local skillStages = {
[SKILL_MAGLEVEL] = {
{minLevel = 1, maxLevel = 30, multiplier = 6}
},
[SKILL_CLUB] = {
{minLevel = 1, maxLevel = 30, multiplier = 6}
},
[SKILL_SWORD] = {
{minLevel = 1, maxLevel = 30, multiplier = 4}
},
[SKILL_AXE] = {
{minLevel = 1, maxLevel = 30, multiplier = 6}
},
[SKILL_DISTANCE] = {
{minLevel = 1, maxLevel = 30, multiplier = 3}
},
[SKILL_SHIELD] = {
{minLevel = 1, maxLevel = 30, multiplier = 3}
},
[SKILL_FISHING] = {
{minLevel = 1, maxLevel = 30, multiplier = 3}
},
[SKILL_MAGLEVEL] = {
{minLevel = 1, maxLevel = 30, multiplier = 3}
}
}
function getRateFromTable(t, skill, level, default)
local rateTable = t[skill]
if rateTable then
for _, rate in ipairs(rateTable) do
local max = rate.maxLevel or math.huge
if level >= rate.minLevel and level <= max then
return rate.multiplier
end
end
end
return default
end
function Player:onGainSkillTries(skill, tries)
if APPLY_SKILL_MULTIPLIER == false then
return tries
end
local level = self:getSkillLevel(skill)
local multiplier = getRateFromTable(skillStages, skill, level, 1)
local key = (skill == SKILL_MAGLEVEL) and configKeys.RATE_MAGIC or configKeys.RATE_SKILL
tries = tries * configManager.getNumber(key) * multiplier
return tries
end