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 end
Do 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 end
Przykł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 end
time = 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 end
Do 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
Zbanowany
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