• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

Lua Functions Maksymalnie uproszczony spell system

Status
Zamknięty.

Miziak

Advanced User
Dołączył
Wrzesień 16, 2008
Posty
175
Liczba reakcji
27
Witam,

Dzi? z nud?w napisa?em sobie taki `lib`(bibliotek? funkcji) do tfs maksymalnie upraszczaj?c? pisanie czar?w zaczynamy:

Do data/lib/050-function.lua lub w starszych silnikach do data/global.lua lub data/functions.lua wklejamy:
Kod:
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

Teraz obja?ni? jak tego u?ywa?:
Czary zwyk?e - te sk?adaj?ce si? z jednego uderzenia:
Przyk?ad w starym systemie Popularne "UE"(rage of the skies):
Kod:
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

A teraz ten sam czar tylko z innymi obra?aniami bo nie chcia?o mi si? przelicza? w moim systemie:
Kod:
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

Deko kr?cej i przyjemniej wygl?da nieprawda? :D
Teraz kr?tko powiem jakie zmienne zamieszczamy w funkcji createCombat:
Kolejno:
Kod:
createCombat(typ obra?e?,
efekt magiczny ma mapie,
efekt strza?u tj np w expri je?li nadamy mu cel je?li nie ma piszemy false,
obszar,
minimalne obra?enia,
maksymalne obra?enia)

Teraz animowane czary:
Od razu m?j system:
Kod:
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

To 3 "klatkowy" animowany spell prostsze ni? wcze?niej nieprawda? :D
Wprowadzane zmienne do funkcji createAnimatedCombat:
Kod:
createAnimatedCombat(tabela zawieraj?ca pod tabele z rodzajem ataku efektem magicznymi i efektem lotu,
tablica z obszarami,
tablica z pod tablicami w kt?rych znajduj? si? wzory na max i min obra?enia dla ka?dej "klatki")

Wzory na obra?enia:
Przyk?ad:
Kod:
"lvl*100/mlvl"

Wzory maj? form? zwyk?ego tekstu(w cudzys?owiach) co oznacza powy?szy przyk?ad nic prostszego ni?:
tw?j level * 100 / na tw?j level magiczny

np masz 100 lvl i 10 mlvl przypuszczaj?c ?e ten wz?r dotyczy max obra?en to:
Kod:
100*100/10 = 1000
Taki b?dzie tw?j maksymalny hit.

Oczywi?cie do obliczania mo?esz u?ywa? wszystkich znak?w matematycznych:
+ - dodawanie
- - odejmowanie
* - mno?enie
/ - dzielenie
% - dzielenie z reszt?
^ - pot?gowanie

To tyle mam nadzieje, ?e si? przyda,
Pozdrawiam,
Miziak ;)
 
Odp: Maksymalnie uproszczony spell system

Funkcja ?wietna. Nie sprawdza?em dog??bnie kodu, ale wierz? Ci na s?owo, ?e dzia?a jak nale?y. Ja osobi?cie nie robi? czar?w kilku efektowych, ale takim trollom na evo serwery jak najbardziej si? ?w funkcja przyda.
Wyt?umaczone dok?adnie, opisane maksymalnie zrozumiale. Czekam na wi?cej takich funkcji, ale niech nast?pne przydadz? si? tak?e i mnie ^^
 
Odp: Maksymalnie uproszczony spell system

tw?j level * 100 / na tw?j level magiczny

Wychodzi na to, ?e im wi?kszy mlvl tym mniejsze obra?enia? Bo przecie? im wi?kszy dzielnik tym wynik jest mniejszy.

Co do samego systemu. Jest ?wietny, mo?liwe nawet, ?e sam go wypr?buj?. Proste dzia?ania matematyczne i to jest to :)
 
Odp: Maksymalnie uproszczony spell system

A mnie ciekawi jak zachowa si? silnik w przypadku gdy kto? wbije 120~mlvl (przyk?ad, ale chodzi mi o +100) i przypuszczalnie b?dzie mia? haka, albo b?dzie mu si? nudzi? i zbije si? do lvl'a pierwszego, a b?dzie jaki? czar bez ogranicze? lvl'owich... outsect, temat kt?ry poruszy?e? te? powinien trafi? w centrum uwagi.
 
Odp: Maksymalnie uproszczony spell system

@outsect
To tylko g?upi przyk?ad Ty sobie mo?esz tam wpisa? co ci si? ?ywnie podoba,to ty ustalasz wz?r w kt?ry za lvl jest podstawiany tw?j aktualny level i za mlvl tw?j level magiczny wzory mog? by? r?wnie dobrze r?wne "0" wtedy czar nie zada obra?e?...

@Sassin
Kompletnie nie rozumiem o co Ci chodzi wyt?umacz ja?niej chetnie wtedy powiem jak zachowa si? skrypt.
 
Odp: Maksymalnie uproszczony spell system

Mi te? si? podoba, ale to czasem ju? nie czas na przerzucenia si? na klasy, obiekty i ten ca?y magiczny ?wiat? Skrypt na pewno dzia?a dobrze, widz?c po wy?szych komentarzach i na pewno u?atwia pisanie to skrypt?w. Ode mnie masz reputa, kt?ry ci si? na pewno nale?y.​
 
Odp: Maksymalnie uproszczony spell system

A je?li chc? u?y? w funckji min i max obra?e? mam u?y? "skill, ID skilla" czy jak ?

Pozdrawiam
 
Odp: Maksymalnie uproszczony spell system

@UP Z tego co zrozumia?em z twojego postu to to czy mo?na tam u?ywa? skilli, skillid?
Z tego co wyczyta?em to nie (mog? si? myli?) bo
Kod:
local lvl, mlvl, minss, maxss = getPlayerLevel(cid), getPlayerMagLevel(cid), "", ""
Zawiera lvl, mlvl a nie skille :) Musia?by? chyba doda?...
 
Odp: Maksymalnie uproszczony spell system

mam pytanie jak dodac czar z kilkoma atakami kt?ry atakuje jak exori vis ?e na przyk?ad 3 razy w cel leci?
A co do skryptu to na prawd? ?wietny!
Nawet ja ten.kt?ry nie ma zielonego poj?cia o robieniu czar?w dobrze sobie z nimi teraz radzi xD
 
Odp: Maksymalnie uproszczony spell system

mam pytanie jak dodac czar z kilkoma atakami kt?ry atakuje jak exori vis ?e na przyk?ad 3 razy w cel leci?
A co do skryptu to na prawd? ?wietny!
Nawet ja ten.kt?ry nie ma zielonego poj?cia o robieniu czar?w dobrze sobie z nimi teraz radzi xD
W spells dodajesz pod nazwa exori visx3
Kod:
local arr = {
{0, 0, 0},
{0, 3, 0},
{0, 0, 0}
}
local arr1 = {
{0, 0, 0},
{0, 3, 0},
{0, 0, 0}
}
local arr2 = {
{0, 0, 0},
{0, 3, 0},
{0, 0, 0}
}
local v = {{COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA}, {COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA}, {COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA}}
local a = {{"lvl*10", "lvl*30"}, {"lvl*10", "lvl*30"}, {"lvl*10", "lvl*30"}}
local combat = createAnimatedCombat(v, {arr, arr1, arr2}, a)
function onCastSpell(cid, var)
	return executeAnimatedCombat(cid, var, combat, 1)
end
a w spells.xml
Kod:
<instant name="Energy Strikex3" words="exori vis max" lvl="36" mana="60" prem="1" range="3" [COLOR="Red"]casterTargetOrDirection="1"[/COLOR] blockwalls="1" exhaustion="2000" needlearn="0" event="script" value="exori visx3.lua">
		<vocation id="1"/>
		<vocation id="2"/>
		<vocation id="5"/>
		<vocation id="6"/>
	</instant>
Dalej powiniene? wiedzie? jak to przekszta?ci? na w?asny u?ytek.
 
Odp: Maksymalnie uproszczony spell system

Mam male pytanie jak w takim systemie napisac czary leczace??
 
Odp: Maksymalnie uproszczony spell system

Ca?kiem fajny skrpcik powiem ci ze na pozomie zaawansowanym ten skrypt jest 9/10.
 
Odp: Maksymalnie uproszczony spell system

Dzi?ki wielkie :)
Teraz du?o lepiej mi si? b?dzie robi? animowane czary
 
Status
Zamknięty.
Do góry