- Joined
- Mar 16, 2017
- Messages
- 1,408
- Solutions
- 154
- Reaction score
- 1,958
- Location
- London
- GitHub
- MillhioreBT
- Twitch
- millhiorebt
Tested TFS 0.4
Lua:
---@ Create by Sarah Wesker | Tested Version: TFS 0.4
---@ list of training dummies.
local dummies = {
[9653] = { skillRate = 0.8, skillSpeed = 2 },
[1476] = { skillRate = 0.7, skillSpeed = 3 },
[1477] = { skillRate = 0.7, skillSpeed = 3 },
[1478] = { skillRate = 0.7, skillSpeed = 3 },
[1442] = { skillRate = 0.7, skillSpeed = 3 },
[5787] = { skillRate = 0.5, skillSpeed = 3 }
}
---@ Global training parameters of the system.
local staminaTries = 1 --# on minutes
local skillTries = 1 --# tries by blow
local skillSpent = function() return math.random(425, 575) end --# mana consumed by blow
local slotForUse = CONST_SLOT_LEFT
---@ list of weapons to train.
local weapons = {
[7754] = { shootDistEffect = CONST_ANI_FIRE, skillType = SKILL_MAGLEVEL }, -- magicLevel Sor
[2426] = { shootDistEffect = CONST_ANI_SPEAR, skillType = SKILL_DISTANCE }, -- distance
[7744] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_SWORD }, -- sword
[7750] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_AXE }, -- axe
[7758] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_CLUB }, -- club
[7879] = { shootDistEffect = CONST_ANI_ENERGY, skillType = SKILL_MAGLEVEL }, -- magicLevel Sor
[2404] = { shootDistEffect = CONST_ANI_THROWINGKNIFE, skillType = SKILL_DISTANCE }, -- distance
[7869] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_SWORD }, -- sword
[7875] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_AXE }, -- axe
[7883] = { shootEffect = CONST_ME_BLOCKHIT, skillType = SKILL_CLUB } -- club
}
local DPOSS = {}
---@ local training function.
local function exerciseDummyTrainEvent(params)
if isPlayer(params.cid) then
local dummyThing = getTileItemById(params.dummyPos, params.dummyId)
if dummyThing.uid == 0 then
doPlayerSendTextMessage(params.cid, MESSAGE_EVENT_ADVANCE, "You have finished your training.")
DPOSS[params.cid] = nil
return false
end
local dummy = dummies[params.dummyId]
local weapon = weapons[params.itemid]
local item = getPlayerSlotItem(params.cid, slotForUse)
local playerPosition = getCreaturePosition(params.cid)
if getDistanceBetween(playerPosition, params.currentPos) == 0 and item.itemid == params.itemid then
local weaponCharges = getItemAttribute(item.uid, "charges") or getItemInfo(params.itemid).charges
local reloadMs = getVocationInfo(getPlayerVocation(params.cid)).attackSpeed * dummy.skillSpeed
if weaponCharges >= 1 then
doItemSetAttribute(item.uid, "charges", weaponCharges -1)
if weapon.shootDistEffect then doSendDistanceShoot(playerPosition, params.dummyPos, weapon.shootDistEffect) end
if weapon.shootEffect then doSendMagicEffect(params.dummyPos, weapon.shootEffect) end
if weapon.skillType == SKILL_MAGLEVEL then
doPlayerAddSpentMana(params.cid, (skillSpent() * dummy.skillRate) * getConfigValue("rateMagic"))
else
doPlayerAddSkillTry(params.cid, weapon.skillType, (skillTries * dummy.skillRate) * getConfigValue("rateSkill"))
end
doPlayerSetStamina(params.cid, getPlayerStamina(params.cid) + staminaTries)
params.eventId = addEvent(exerciseDummyTrainEvent, reloadMs, params)
return true
else
doRemoveItem(item.uid)
doPlayerSendTextMessage(params.cid, MESSAGE_EVENT_ADVANCE, "Your exercise weapon has expired, therefore your training too.")
end
else
doPlayerSendTextMessage(params.cid, MESSAGE_EVENT_ADVANCE, "You have finished your training.")
end
end
DPOSS[params.cid] = nil
return false
end
function onUse(cid, item, fromPos, target, toPos, isHotkey)
local ammo = getPlayerSlotItem(cid, slotForUse)
if ammo.uid ~= item.uid then
return doPlayerSendCancel(cid, "The weapon must be located in your left hand.")
end
if not target then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE)
end
local playerPosition = getCreaturePosition(cid)
if not getTileInfo(playerPosition).protection then
return doPlayerSendCancel(cid, "You can only train in protection zone.")
end
local dummy = dummies[target.itemid]
local weapon = weapons[item.itemid]
if not weapon or not dummy then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_CANNOTUSETHISOBJECT)
end
local dummyPosition = getThingPosition(target.uid)
if getDistanceBetween(playerPosition, dummyPosition) > 6 then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_THEREISNOWAY)
end
if not DPOSS[cid] then
local params = {
cid = cid,
itemid = item.itemid,
dummyPos = dummyPosition,
currentPos = playerPosition,
dummyId = target.itemid
}
DPOSS[cid] = params
exerciseDummyTrainEvent(params)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have started training with dummy.")
else
doPlayerSendCancel(cid, "You can not train")
end
return true
end
Last edited: