Sassin - 2012-01-11 13:38:25

Zrobienie Magicznej Bariery trochę mi zajęło. Tak więc proszę o łagodne komentarze. ;)

data\creaturescripts\scripts tworzymy nowy plik o nazwie absorb.lua, do niego wklej cały kod:

Kod:

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:

Kod:

registerCreatureEvent(cid, "absorb")

Dodaj do creaturescripts.xml:

Kod:

 <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:

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%:

Kod:

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:

Kod:

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:

Kod:

<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

Mokre Cycuszki - 2012-01-12 21:22:05

ALEE KUFFFFNO

Sassin - 2012-01-14 07:50:16

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 !

KamaShoot - 2012-02-20 16:38:09

Bardzo przydatny skrypcik, chetnie go wykorzystam.

przegrywanie kaset vhs warszawa UbytovĂĄnĂ­ Side