• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Spell System

Miziak

New Member
Joined
Nov 3, 2009
Messages
62
Reaction score
1
Location
Okolice Płocka, Poland
Hi All,

Yesterday I wrote `lib`(functions) to tfs, that simplify write spells:

To data/lib/050-function.lua or in old engines to data/global.lua lub data/functions.lua paste:
Lua:
function createCombat(typea, effect, distEffect, area, mins, maxs)
	local combat = createCombatObject()
	setCombatParam(combat, COMBAT_PARAM_TYPE, typea)
	setCombatParam(combat, COMBAT_PARAM_EFFECT, effect)
	if(distEffect)then
		setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, distEffect)
	end
	if(type(mins) == "string" and type(maxs) == "string")then
		function getSpellDamage(cid, skill, att, attackStrength)
			local lvl, mlvl, minss, maxss = getPlayerLevel(cid), getPlayerMagLevel(cid), "", ""
			minss = "return " .. mins
			minss = minss:gsub("lvl", lvl)
			minss = minss:gsub("mlvl", mlvl)
			maxss = "return " .. maxs
			maxss = maxss:gsub("lvl", lvl)
			maxss = maxss:gsub("mlvl", mlvl)
			local min = -math.ceil(loadstring(minss)())
			local max = -math.ceil(loadstring(maxss)())
					
			return min, max
		end
		setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "getSpellDamage")
	end
	if(type(area) == "table")then
		local areaa = createCombatArea(area)
		setCombatArea(combat, areaa)
	end
	return combat
end

function createAnimatedCombat(visableTbl, areaTbl, attacksTbl)
	local combatsTbl = {}
	if(#visableTbl == #areaTbl and #visableTbl == #attacksTbl)then
		for i,_ in pairs(visableTbl) do
			local combat = createCombat(visableTbl[i][1], visableTbl[i][2], visableTbl[i][3], areaTbl[i], attacksTbl[i][1], attacksTbl[i][2])
			table.insert(combatsTbl, combat)
		end
	end
	return combatsTbl
end

function executeAnimatedCombat(cid, var, combat, delay)
	if(#combat == 0)then
		return false
	else
		for i,_ in pairs(combat) do
			if(i == 1)then
				addEvent(function() doCombat(cid, combat[i], var) end, i, nil)
			else
				addEvent(function() doCombat(cid, combat[i], var) end, (i-1)*(delay*1000), nil)
			end
		end
		return true
	end
return false
end

In old system "UE"(rage of the skies):
Lua:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS)
setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 5, 12)

local area = createCombatArea(AREA_CROSS6X6)
setCombatArea(combat, area)

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end[/HIGHLIGHT]

Now selfsame spell in [B]my system[/B]:
[code=lua]local combat = createCombat(COMBAT_ENERGYDAMAGE, CONST_ME_BIGCLOUDS, false, AREA_CROSS6X6, "lvl*10", "lvl*100")

function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Simply :D
Variables in createCombat:
Code:
createCombat(Damage type,
magic effect on map,
distance effect if not been write false,
area,
min damage,
max damage)

Animate spells:
Lua:
local arr = {
{0, 1, 0},
{1, 3, 1},
{0, 1, 0}
}

local arr1 = {
{1, 1, 1},
{1, 3, 1},
{1, 1, 1}
}

local arr2 = {
{1, 0, 1, 0, 1},
{0, 1, 1, 1, 0},
{1, 1, 3, 1, 1},
{0, 1, 1, 1, 0},
{1, 0, 1, 0, 1}
}

local v = {{COMBAT_EARTHDAMAGE, CONST_ME_PLANTATTACK}, {COMBAT_EARTHDAMAGE, CONST_ME_PLANTATTACK}, {COMBAT_EARTHDAMAGE, CONST_ME_PLANTATTACK}}
local a = {{"lvl*10", "lvl*100"}, {"lvl*10", "lvl*100"}, {"lvl*10", "lvl*100"}}
local combat = createAnimatedCombat(v, {arr, arr1, arr2}, a)

function onCastSpell(cid, var)
	return executeAnimatedCombat(cid, var, combat, 1--[[opóźnienie w sekundach]])
end

Variables in createAnimatedCombat:
Code:
createAnimatedCombat(table with tables with damage type, magic effect and distance effect,
table with areas,
table with tables with damage)

Damage patterns:
Example:
[HIGHLIGHT=lua]"lvl*100/mlvl"[/HIGHLIGHT]

Patterns is a text in quotes:
your level * 100 / your magic level

np you have 100 lvl i 10 mlvl if this patern is max damage:
Code:
100*100/10 = 1000
Your max hit is 1000.

Ofc in calculations you may use all mathematicks tokens:
+
-
*
/
%
^

Greets,
Miziak ;)

Sorry for my English.
 
Code:
[13/01/2011 03:29:28] [Error - Spell Interface] 
[13/01/2011 03:29:28] In a callback: data/spells/scripts/custom/ezzori mas.lua:getSpellDamage
[13/01/2011 03:29:28] (Unknown script file)
[13/01/2011 03:29:28] Description: 
[13/01/2011 03:29:28] [string "return m5000*7"]:1: attempt to perform arithmetic on global 'm5000' (a nil value)

In a script :
Lua:
local combat = createCombat(COMBAT_PHYSICALDAMAGE, CONST_ME_HITAREA, false, AREA_CIRCLE3X3, "mlvl*7", "mlvl*8")
 
function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

when in
Lua:
local combat = createCombat(COMBAT_PHYSICALDAMAGE, CONST_ME_HITAREA, false, AREA_CIRCLE3X3, "lvl*7", "lvl*8")
 
function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end
There are no bugs
 
HI,

change:
Lua:
			minss = minss:gsub("mlvl", mlvl)
			maxss = "return " .. maxs
			maxss = maxss:gsub("lvl", lvl)
			maxss = maxss:gsub("mlvl", mlvl)

to:
Lua:
			minss = minss:gsub("mlv", mlvl)
			maxss = "return " .. maxs
			maxss = maxss:gsub("lvl", lvl)
			maxss = maxss:gsub("mlv", mlvl)

and this:
Lua:
local combat = createCombat(COMBAT_PHYSICALDAMAGE, CONST_ME_HITAREA, false, AREA_CIRCLE3X3, "mlvl*7", "mlvl*8")
 
function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

to:
Lua:
local combat = createCombat(COMBAT_PHYSICALDAMAGE, CONST_ME_HITAREA, false, AREA_CIRCLE3X3, "mlv*7", "mlv*8")
 
function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

Greets,
Miziak ;)
 
Works great now!
I'm thinking about adding skill and weapon attack to formula.
 
Back
Top