Oh, I didn't know that >.<
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BURSTARROW)
setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0)
local area = createCombatArea( { {1, 1, 1}, {1, 3, 1}, {1, 1, 1} } )
setCombatArea(combat, area)
function addCombat(cid, combat, var)
local player = Player(cid)
if not player then
return false
end
if player:getTarget() == nil then
return false
end
doCombat(player, combat, var)
end
function onUseWeapon(player, var)
addEvent(addCombat, 1000, player, combat, var)
return doCombat(player, combat, var)
end
@Breed
You need to set, not get. Without editing the sources, you cannot set any attack speed anywhere.
There is however, a workaround. It's gonna be a bit more complex though, well maybe not, but in terms of formulas.
onUseWeapon is a script environment that you can use, which resides in the weapons folder.
onUseWeapon is called when a player uses a weapon during attack mode.
So, what you can do is put in addEvents() to execute combats in between the main intervals of attack speed.
Here is an example script of burst arrows:
Code:local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BURSTARROW) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local area = createCombatArea( { {1, 1, 1}, {1, 3, 1}, {1, 1, 1} } ) setCombatArea(combat, area) function addCombat(cid, combat, var) local player = Player(cid) if not player then return false end if player:getTarget() == nil then return false end doCombat(player, combat, var) end function onUseWeapon(player, var) addEvent(addCombat, 1000, player, combat, var) return doCombat(player, combat, var) end
You can see, I added the addCombat() function, which checks to see if the player still exists, checks to see if the player has not stopped attacking, then after all that, it will execute the combat. addCombat() was called in my addEvent() 1 second after the original attack. So, if my default attack speed is 2000 (2 seconds), with this, I can now attack every 1000 ms (1 second).
<melee id="2392" level="30" unproperly="1" script="weapon.lua"/>
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0)
function addCombat(cid, combat, var)
local player = Player(cid)
if not player then
return false
end
if player:getTarget() == nil then
return false
end
doCombat(player, combat, var)
end
function onUseWeapon(player, var)
addEvent(addCombat, 1000, player, combat, var)
return doCombat(player, combat, var)
end
Yeah, I'm assuming you can just add script tags to all the weapons in weapons.xml and make them use a single script.
For example, fire sword:
Code:<melee id="2392" level="30" unproperly="1" script="weapon.lua"/>
There, I'm making the fire sword to use a script (like the one below).
I've tested it, it all works fine. It will do 1000 ms intervals of damage, instead of the default 2000.
Code:local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) function addCombat(cid, combat, var) local player = Player(cid) if not player then return false end if player:getTarget() == nil then return false end doCombat(player, combat, var) end function onUseWeapon(player, var) addEvent(addCombat, 1000, player, combat, var) return doCombat(player, combat, var) end
All good
addEvent(addCombat, 1000, player, combat, var)
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0)
function onUseWeapon(player, var)
local PLAYER_HIT_TIME_LAST = 24000
local speedInSeconds = 6
if os.time() >= player:getStorageValue(PLAYER_HIT_TIME_LAST) + speedInSeconds then
player:setStorageValue(PLAYER_HIT_TIME_LAST, os.time())
return doCombat(player, combat, var)
end
return false
end
Code:local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) function onUseWeapon(player, var) local PLAYER_HIT_TIME_LAST = 24000 local speedInSeconds = 6 if os.time() >= player:getStorageValue(PLAYER_HIT_TIME_LAST) + speedInSeconds then player:setStorageValue(PLAYER_HIT_TIME_LAST, os.time()) return doCombat(player, combat, var) end return false end
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1)
setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1)
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0)
function addCombat(cid, combat, var, interval, i)
if i <= 0 then
return false
end
local player = Player(cid)
if not player then
return false
end
if player:getTarget() == nil then
return false
end
doCombat(player, combat, var)
addEvent(addCombat, interval, player:getId(), interval, i - 1)
end
function onUseWeapon(player, var)
local hitsInBetween = 2 -- You can just change this
local interval = math.floor(2000 / hitsInBetween + 1)
addEvent(addCombat, interval, player, combat, var, interval, hitsInBetween)
return doCombat(player, combat, var)
end