
Nie tylko o Tibii i OTS...

Zrobienie Magicznej Bariery trochę mi zajęło. Tak więc proszę o łagodne komentarze.
data\creaturescripts\scripts
function onStatsChange(cid, attacker, type, combat, value)
if getCreatureStorage(cid, STORAGE_ABSORB-1) == 1 then
doCreatureSetStorage(cid, STORAGE_ABSORB-1, -1)
return true
end
local combats =
{
[1] = {1},
[2] = {2},
[4] = {3},
[8] = {4},
[32] = {5},
[64] = {6},
[512] = {7},
[1024] = {8},
[2048] = {9}
}
local COMBATS = combats[combat]
if COMBATS then
if exhaustion.check(cid,COMBATS[1]+ STORAGE_ABSORB + 100) then
storage = getCreatureStorage(cid, STORAGE_ABSORB + COMBATS[1])
value = (value * (storage/100))
doCreatureSetStorage(cid, STORAGE_ABSORB-1, 1)
doTargetCombatHealth(attacker, cid, combat, -value, -value, INVISIBLE_EFFECT)
return false
end
end
return true
endDo login.lua:
registerCreatureEvent(cid, "absorb")
Dodaj do creaturescripts.xml:
<event type="statsChange" name="absorb" event="script" value="absorb.lua"/>
W folderze data\lib stwórz nowy plik o nazwie absorb.lua i dodaj ten kod:
INVISIBLE_EFFECT = 255
STORAGE_ABSORB = 30000
ABSORB_PHYSICAL = 1
ABSORB_ENERGY = 2
ABSORB_EARTH = 3
ABSORB_POISON = 3
ABSORB_FIRE = 4
ABSORB_LIFEDRAIN = 5
ABSORB_MANADRAIN = 6
ABSORB_ICE = 7
ABSORB_HOLY = 8
ABSORB_DEATH = 9
function absorbObject(cid, condition, time, percent)
doCreatureSetStorage(cid, condition+STORAGE_ABSORB, percent)
exhaustion.set(cid, condition+100+STORAGE_ABSORB, time)
return true
endPrzykładowy skrypt działania, runa dzięki której nasza postać dostaje mniejsze obrażenia o 50%:
function onUse(cid, item, pos, itemEx, topos)
local time = 20
local power = 50
absorbObject(cid, ABSORB_POISON, time, power)
doRemoveItem(item.uid)
return true
endtime = czas
power = siła (100 == 100%, im więcej tym większe obrażenia!)
=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=
Kolejną rzeczą, która musimy zrobić to:
Wklepujemy w data/spells/scripts nowy plik o nazwie nazwa.lua i wklejamy:
local config = {
storage = 1234, --storage zapisujace
dlugosc = 4, --w sekundach
--nie ruszac
k = {'ŚMIERĆ',COLOR_BLACK,'OGIEŃ',COLOR_ORANGE,'LÓD',COLOR_TEAL,'ZIEMIA',COLOR_LIGHTGREEN,'ŚWIATŁO',COLOR_DARKYELLOW,'ENERGIA',COLOR_DARKPURPLE,'FIZYCZNE',COLOR_GREY,'LIFEDRAIN',COLOR_DARKRED},
odpornosci = {ABSORB_DEATH,50,ABSORB_FIRE,25,ABSORB_ICE,20,ABSORB_EARTH,65,ABSORB_HOLY,90,ABSORB_ENERGY,10,ABSORB_PHYSICAL,25,ABSORB_LIFEDRAIN,90},
shoots = {CONST_ANI_SUDDENDEATH,CONST_ANI_FIRE,CONST_ANI_ICE,CONST_ANI_EARTH,CONST_ANI_HOLY,CONST_ANI_ENERGYBALL,CONST_ANI_LARGEROCK,CONST_ANI_EXPLOSION},
eff = {CONST_ME_MORTAREA,COMBAT_DEATHDAMAGE,CONST_ME_FIREAREA,COMBAT_FIREDAMAGE,CONST_ME_ICEATTACK,COMBAT_ICEDAMAGE,CONST_ME_CARNIPHILA,COMBAT_EARTHDAMAGE,CONST_ME_HOLYDAMAGE,COMBAT_HOLYDAMAGE,CONST_ME_ENERGYAREA,COMBAT_ENERGYDAMAGE,CONST_ME_GROUNDSHAKER,COMBAT_PHYSICALDAMAGE,CONST_ME_RED_SHIMMER,COMBAT_LIFEDRAIN}
}
function onCastSpell(cid, var)
if getPlayerStorageValue(cid, config.storage) >= os.time() then
return false
end
local v = math.random(#config.shoots)
doSendAnimatedText(getThingPos(cid), config.k[v*2-1], config.k[v*2])
absorbObject(cid, config.odpornosci[v*2-1], config.dlugosc, config.odpornosci[v*2])
doPlayerSetStorageValue(cid, config.storage, os.time() + config.dlugosc)
return shoot(cid, v) and false
end
function shoot(cid, v)
if getPlayerStorageValue(cid, config.storage) >= os.time() then
local pos = getThingPos(cid)
local h = getSpectators(pos, 1, 1)
if h ~= nil then
for _, t in ipairs(h) do
if isCreature(t) then
doTargetCombatHealth(cid, t, config.eff[v*2], 0, -config.odpornosci[v*2] * math.random(4), config.eff[v*2-1])
end
end
end
doSendDistanceShoot({x=pos.x-1,y=pos.y,z=pos.z}, {x=pos.x-1,y=pos.y+1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x-1,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x+1,y=pos.y+1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x+1,y=pos.y+1,z=pos.z}, {x=pos.x+1,y=pos.y,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x+1,y=pos.y,z=pos.z}, {x=pos.x+1,y=pos.y-1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x+1,y=pos.y-1,z=pos.z}, {x=pos.x,y=pos.y-1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x,y=pos.y-1,z=pos.z}, {x=pos.x-1,y=pos.y-1,z=pos.z}, config.shoots[v])
doSendDistanceShoot({x=pos.x-1,y=pos.y-1,z=pos.z}, {x=pos.x-1,y=pos.y,z=pos.z}, config.shoots[v])
return addEvent(shoot, 150, cid, v)
end
return true
endDo spells.xml wklejamy:
<instant name="Magic Barrer" words="magic barrer" lvl="20" mana="100" selftarget="1" event="script" value="test.lua"/>
Na koniec działanie, Magicznej Bariery na filmie
http://www.youtube.com/watch?v=i9n8mhp-Nqo
Ostatnio edytowany przez Sassin (2012-01-11 13:39:07)
Offline

ALEE KUFFFFNO
Offline

Cóż jak tobie się nie podoba, to trudno. Myślę, że wchodząc na ten temat chciałeś po prostu nabić sobie posta. Nie sprawdzając tej Bariery piszesz "ALEE KUFFFFNO", szczerze szkoda mi Cię trochę. Pozdrawiam Sassin !
Offline
Bardzo przydatny skrypcik, chetnie go wykorzystam.
Offline