Reklama
Pokazuje wyniki od 1 do 9 z 9

Temat: [8.4+] [XML / LUA] Trochę bardziej inteligentny boss

  1. #1
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny [8.4+] [XML / LUA] Trochę bardziej inteligentny boss

    Cześć,
    Na wstępie chciałem napisać, że nie wiem, czy to się zalicza do XML, czy LUA, bo jest tu jedno i drugie, oraz są równie ważne :)

    No, ale przejdźmy do rzeczy. Jak wiadomo, bossowie w Tibii nie różnią się niczym od zwykłych potworów poza super siłą, super atakami, super obronami, super żywotnością, no i super nagrodami.

    A co by było, gdyby stworzyć bossa, który potrafi coś więcej? Stworzyłem niedawno u siebie dla testów takiego bossa, więc umieszczę go i dla was.

    Boss, którego umieszczam ma następujące zdolności:
    - Teleportowanie się do losowej ofiary, o ile nie atakuje krytycznym ciosem.
    - Atakowanie magicznym bluszczem. Podczas, gdy na potworze pojawia się bluszcz, jest to znak, że trzeba uciekać, gdyż po chwili pojawiają się naokoło niego, w odstępie dwóch kratek w każdą stronę, magiczne iskry. Ten, kto znajdzie się na ich polu, ginie na miejscu niezależnie od swojego poziomu.
    - Atakowanie pociskiem. Potwór strzela w gracza pocisk, który zachowuje się identycznie, jak powyżej, lecz zasięg sprowadza się do tej samej kratki, na którą strzelił. Gracz musi odskoczyć ze swojego miejsca, bo zginie, jeśli pozostanie.
    - Niszczenie magic walli.

    Cóż, potwór jest zrobiony na szybko, więc mogą być błędy, może być to źle, tamto źle, tego za mało, albo tamtego za dużo.

    Ja mam cichą nadzieję, że ci, którzy zobaczą, co fajnego można wyciągnąć z OTSów, zaczną w końcu robić fajne serwery zamiast tych kolejnych kopii real map.

    A więc tak, w monsters.xml dodajemy:
    Kod:
    <monster name="Powolniak" file="powolniak.xml"/>
    W folderze z potworami tworzymy wyżej wymieniony pliczek, a do środka dodajemy:
    Kod HTML:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <monster name="POWOLNIAK" nameDescription="Powolniak" race="undead" experience="5500" speed="120" manacost="0">
    	<health now="100000" max="100000"/>
    	<look type="234" corpse="6331"/>
    	<targetchange interval="1000" chance="100"/>
    	<strategy attack="100" defense="0"/>
    	<flags>
    		<flag summonable="0"/>
    		<flag attackable="1"/>
    		<flag hostile="1"/>
    		<flag illusionable="1"/>
    		<flag convinceable="0"/>
    		<flag pushable="0"/>
    		<flag canpushitems="1"/>
    		<flag staticattack="50"/>
    		<flag lightlevel="0"/>
    		<flag lightcolor="0"/>
    		<flag targetdistance="1"/>
    		<flag runonhealth="2000"/>
    	</flags>
    	<script>
    		<event name="Powolniak"/>
    	</script>
    	<attacks>
    		<attack name="melee" interval="2000" min="-860" max="-2280"/>
    		<attack name="lifedrain" interval="1000" chance="30" range="1" min="-250" max="-660">
    			<attribute key="areaEffect" value="redspark"/>
    		</attack>
    		<attack name="manadrain" interval="1000" chance="20" radius="5" target="0" min="-250" max="-550">
    			<attribute key="areaEffect" value="poison"/>
    		</attack>
    		<attack name="energy" interval="1000" chance="15" length="5" spread="0" min="-500" max="-850">
    			<attribute key="areaEffect" value="energy"/>
    		</attack>
    		<attack name="poison" interval="2000" chance="40" radius="3" target="1" min="-550" max="-1250">
    			<attribute key="areaEffect" value="poison"/>
    		</attack>
    	</attacks>
    	<defenses armor="64" defense="72">
    		<defense name="speed" interval="1000" chance="10" speedchange="130" duration="5000">
    			<attribute key="areaEffect" value="redshimmer"/>
    		</defense>
    		<defense name="healing" interval="1000" chance="25" min="1500" max="2500">
    			<attribute key="areaEffect" value="blueshimmer"/>
    		</defense>
    	</defenses>
    	<immunities>
    		<immunity physical="0"/>
    		<immunity energy="1"/>
    		<immunity fire="1"/>
    		<immunity poison="1"/>
    		<immunity lifedrain="0"/>
    		<immunity paralyze="0"/>
    		<immunity outfit="0"/>
    		<immunity drunk="0"/>
    		<immunity invisible="1"/>
    	</immunities>
    	<loot>
    		<item id="1976" text="fajna książeczka" chance="100000"/>
    	</loot>
    </monster>
    (Loot sobie zmieńcie na własne upodobania)

    Następnie w creaturescripts.xml dodajemy taką linijkę:
    Kod:
    <event type="think" name="Powolniak" event="script" value="powolniak.lua"/>
    Po czym dalej tworzymy taki pliczek, a zawartość jego jest taka:
    Kod PHP:
    function onThink(cid)
    	if atakuje == nil then
    		atakuje = false
    	end
    
    	function zabijansko1(params)
    		local cid = params.cid
    		if isCreature(cid) then
    			doCreatureSay(cid, "GrimOTS!", TALKTYPE_ORANGE_1)
    			atakuje = false
    			for nx = (getCreaturePosition(cid).x - 2), (getCreaturePosition(cid).x + 2) do
    				for ny = (getCreaturePosition(cid).y - 2), (getCreaturePosition(cid).y + 2) do
    					doSendMagicEffect( { x = nx, y = ny, z = getCreaturePosition(cid).z }, CONST_ME_YELLOWENERGY)
    				
    					local creatureFound = getThingFromPos( { x = nx, y = ny, z = getCreaturePosition(cid).z, stackpos = 253 })
    				
    					if isCreature(creatureFound.uid) and creatureFound.uid ~= cid then
    						doCreatureAddHealth(cid, getCreatureHealth(creatureFound.uid))
    						doCreatureAddHealth(creatureFound.uid, -getCreatureHealth(creatureFound.uid))
    					end
    				end
    			end
    		end
    	end
    
    	function zabijansko2(params)
    		local cid = params.cid
    		local loc = params.loc
    		if isCreature(cid) then
    			doSendMagicEffect( loc, CONST_ME_YELLOWENERGY)
    		
    			local creatureFound = getThingFromPos( loc )
    		
    			if isCreature(creatureFound.uid) and creatureFound.uid ~= cid then
    				doCreatureAddHealth(creatureFound.uid, -getCreatureHealth(creatureFound.uid))
    			end
    		end
    	end
    
    	function efektyy(params)
    		local cid = params.cid
    	
    		if isCreature(cid) then
    			doSendMagicEffect(getCreaturePosition(cid), CONST_ME_SMALLPLANTS)
    		end
    	end
    	
    	if 1 == math.random(1, 35) then
    		doSendMagicEffect(getCreaturePosition(cid), CONST_ME_SMALLPLANTS)
    		
    		addEvent(zabijansko1, 3000, { cid = cid } )
    		
    		for v = 1, 5 do
    			addEvent(efektyy, 500 * v, { cid = cid } )
    		end
    		atakuje = true
    		doCreatureSay(cid, "GIŃCIE OD TEGO ATAKU, SZCZURY!!!", TALKTYPE_ORANGE_1)
    	end
    	
    	if 1 == math.random(1, 25) then
    		for nx = (getCreaturePosition(cid).x - 1), (getCreaturePosition(cid).x + 1) do
    			for ny = (getCreaturePosition(cid).y - 1), (getCreaturePosition(cid).y + 1) do
    				local fieldFound = getThingFromPos( { x = nx, y = ny, z = getCreaturePosition(cid).z, stackpos = 254 })
    				
    				if fieldFound.itemid == 1498 then
    					doSendMagicEffect(getThingPos(fieldFound.uid), CONST_ME_STUN)
    					doRemoveItem(fieldFound.uid)
    				end
    			end
    		end
    	end
    	
    	if 1 == math.random(1, 50) then
    		for nx = (getCreaturePosition(cid).x - 5), (getCreaturePosition(cid).x + 5) do
    			for ny = (getCreaturePosition(cid).y - 5), (getCreaturePosition(cid).y + 5) do
    				local creatureFound = getThingFromPos( { x = nx, y = ny, z = getCreaturePosition(cid).z, stackpos = 253 })
    				
    				if isPlayer(creatureFound.uid) and creatureFound.uid ~= cid then
    					if 1 == math.random(1, 5) then
    						if atakuje == false then
    							doTeleportThing(cid, getThingPos(creatureFound.uid))
    						end
    					end
    				end
    			end
    		end
    	end
    	
    	if 1 == math.random(1, 10) then
    		for nx = (getCreaturePosition(cid).x - 5), (getCreaturePosition(cid).x + 5) do
    			for ny = (getCreaturePosition(cid).y - 5), (getCreaturePosition(cid).y + 5) do
    				local creatureFound = getThingFromPos( { x = nx, y = ny, z = getCreaturePosition(cid).z, stackpos = 253 })
    				
    				if isPlayer(creatureFound.uid) and creatureFound.uid ~= cid then
    					if 1 == math.random(1, 5) then
    						local efekt = 50
    						doSendDistanceShoot(getCreaturePosition(cid), getCreaturePosition(creatureFound.uid), efekt)
    						local pos = getThingPos(creatureFound.uid)
    						doSendMagicEffect(pos, CONST_ME_SMALLPLANTS)
    						for n = 1, 5 do
    							addEvent(function()
    								doSendMagicEffect(pos, CONST_ME_SMALLPLANTS)
    							end, n*250)
    						end
    						addEvent(zabijansko2, 3000, { cid = cid, loc = getCreaturePosition(creatureFound.uid) } )
    					end
    				end
    			end
    		end
    	end
    	
    	return TRUE
    end
    (Skrypt pisany na szybko, nie testowałem dogłębnie, nie optymalizowałem, jedynie widziałem na OTSie, że działał, ludzie z nim walczyli, oraz robił to, co miał robić ze skryptu)

    Uwaga, jeśli masz jakieś błędy napisz, postaram się pomóc. Ja mam silnik z 8.42 i do tego baaardzo zmodyfikowany przeze mnie, więc możliwe, że w tym skrypcie mam coś, co zostało w nowych OTSach zmienione, przerobione, albo usunięte.

    Ja posłużyłem się funkcją onThink, która uruchamia się cyklicznie każdej kreaturze w mniej, niż sekundę, więc można dzięki niej zdziałać dużo - można przykładowo zrobić bossa, którego summony regenerują, który co jakiś czas atakuje jakimiś szpikulcami, zsyła meteoryty, zakopuje się, albo przy 30% życia leczy się, zmienia sobie outfit, znika, czy przesuwa graczy - opcji są miliardy, po listę funkcji odsyłam chociażby tu:

    http://otland.net/f55/lua-functions-list-14039/ :)

    W rzeczywistości jest ich 'trochę' więcej.

    Są i inne funkcje w creaturescripts prócz onThink, do zobaczenia ich wszystkich odsyłam do SVN Tibii, a konkretnie do pliku creatureevent.cpp, tam są wszystkie, powinny być i komentarze do nich dołączone. Z tego, co pamiętam, możliwe są do uruchomienia zdarzenia na przykład, gdy się zaatakuje bossa, gdy boss zaatakuje, gdy boss zabije, gdy się bossa zabije, gdy boss zobaczy kogoś, albo ktoś bossa, gdy boss wybierze kogoś na ofiarę, lub ktoś bossa, i wiele innych bla bla bla.

    Pozdrawiam.
    Ostatnio zmieniony przez Grim90 : 20-08-2010, 15:58
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  2. #2
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    first!

    Jestem dosłownie pod wrażeniem, oczywiście gratulacje dla Pana :)

    Zawsze można jeszcze dodać,że to potwór teleportuje gracza do siebie :)
    http://ots.tibiaserver.pl/tibiaserver.gif

  3. Reklama
  4. #3
    Avatar StaraJaga
    Data rejestracji
    2009
    Położenie
    Bydgoszcz
    Wiek
    30
    Posty
    141
    Siła reputacji
    16

    Domyślny

    No no Grim, szczeze mowiac odwaliles kawal dobrej roboty. Bardzo podoba mi sie atakowanie pociskiem, i to ze mozna tego uniknac, oraz niszczenie m-walli.

    Mozesz tylko powiedziec na ile sqm on sie do niej teleportuje i jak to ustawic (tzn. ze teleportuje sie do danej ofiary jezeli jest ona w zasiegu 5 sqm np.)?

  5. #4
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny

    Cytuj StaraJaga napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    No no Grim, szczeze mowiac odwaliles kawal dobrej roboty. Bardzo podoba mi sie atakowanie pociskiem, i to ze mozna tego uniknac, oraz niszczenie m-walli.

    Mozesz tylko powiedziec na ile sqm on sie do niej teleportuje i jak to ustawic (tzn. ze teleportuje sie do danej ofiary jezeli jest ona w zasiegu 5 sqm np.)?
    To jest w tym fragmencie:
    Kod:
    for nx = (getCreaturePosition(cid).x - 5), (getCreaturePosition(cid).x + 5) do 
                for ny = (getCreaturePosition(cid).y - 5), (getCreaturePosition(cid).y + 5) do
    Tak, poszukuje jakiegokolwiek gracza w zasięgu 5 kratek i teleportuje się do niego.

    Nie wiem, nie zrozumiałem czegoś, co napisałeś, czy jak? :P
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  6. #5

    Data rejestracji
    2010
    Posty
    9
    Siła reputacji
    0

    Domyślny

    Jeśli mam się przyczepić to proponowałbym dać warunek sprawdzający czy cid to potwór w funkcji efektyy, bo inaczej czekać będzie na nas niemiła niespodzianka.
    Poza tym znalazłem kilka drobnych błedów w kodzie, ale nie przeszkadzają one aż tak bardzo w grze.

  7. #6
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    hmm, nazwy funkcji i zmiennych gryzą, ale to mało istotne
    kilka rzeczy dałoby się poprawić

    zastanawiam się czemu deklarujesz funkcje wewnątrz onThink?
    poza tym
    Kod:
    for v = 1, 5 do
                addEvent(efektyy, 500 * v, { cid = cid } )
            end
    nie jest rozwiązaniem optymalnym, fakt, że w tej sytuacji(boss występujący rzadko blablabla) można sobie na to pozwolić, może zamienić to na
    Kod:
    dobra, zaraz pokombinuję, nie zauważyłem że był już koniec tamtej funkcji
    tak na szybko robione, najwyżej edytuje posta
    (celem takiego działania jest zmniejszenie eventów przechowywanych w pamięci)


    oczywiście nie oznacza to, że nie doceniam twojej pracy
    pisanie takich bossow może być dość upierdliwe, ale patrzenie jak gracze zastanawiają się co z nim zrobić dość zabawne chyba


    BTW: poradziliście sobie z tymi polskimi znakami w nazwach czy wszystko zostało upcase? można przy wczytywaniu monsterów walnąć całą nazwę lowcase i podnieść pierwsze litery, chyba by działało?)
    Ostatnio zmieniony przez zakius : 22-10-2010, 18:05
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  8. #7
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny

    Cytuj zakius napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    hmm, nazwy funkcji i zmiennych gryzą, ale to mało istotne
    kilka rzeczy dałoby się poprawić

    zastanawiam się czemu deklarujesz funkcje wewnątrz onThink?
    poza tym
    Kod:
    for v = 1, 5 do
                addEvent(efektyy, 500 * v, { cid = cid } )
            end
    nie jest rozwiązaniem optymalnym, fakt, że w tej sytuacji(boss występujący rzadko blablabla) można sobie na to pozwolić, może zamienić to na
    Kod:
    dobra, zaraz pokombinuję, nie zauważyłem że był już koniec tamtej funkcji
    tak na szybko robione, najwyżej edytuje posta
    (celem takiego działania jest zmniejszenie eventów przechowywanych w pamięci)


    oczywiście nie oznacza to, że nie doceniam twojej pracy
    pisanie takich bossow może być dość upierdliwe, ale patrzenie jak gracze zastanawiają się co z nim zrobić dość zabawne chyba


    BTW: poradziliście sobie z tymi polskimi znakami w nazwach czy wszystko zostało upcase? można przy wczytywaniu monsterów walnąć całą nazwę lowcase i podnieść pierwsze litery, chyba by działało?)
    Jeśli jesteś w stanie to zoptymalizować choć trochę, bardzo chętnie zaktualizuję skrypt i wspomnę o tobie.

    Nie poradziliśmy sobie z tymi znakami, dlatego nazwy potworów są z dużych liter. Mogę się mylić, ale najprawdopodobniej ten 'błąd' jest w kliencie Tibijskim, a do jego źródeł nie mam dostępu.

    Tak, uważam, że urozmaicenie w postaci inteligentnego bossa jest fajne. Szczególnie w przypadku, gdy następuje interakcja z otoczeniem, czyli oskryptowany jest teren. Dajmy na to chociażby, że żeby go pokonać, trzeba zniszczyć jakieś statuetki, albo regularnie je czymś oblewać, by móc zranić potwora i tak dalej...
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  9. #8
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    Kod:
    function isWall(pos)
        for i=1, 254 do
            pos.stackpos=i
            if(getThingFromPos(pos).uid > 0 ) then if not isCreature(getThingFromPos(pos).uid) then
                if hasProperty(getThingFromPos(pos).uid, 2) then 
                    return true 
                end 
            end end
        end
        return false
    end
    
    local mwallid=1497 --sa co najmniej 2 id mwalla
    local efekt=50
    local atakuje=false
    local aoeRange = 3
    local tpRange = 5
    local shootRange = 5
    local tpCheckWalls = true
    local tpEffect = 50
    local function ko1(p)
        if isCreature(p.cid) then
            doCreatureSay(p.cid, "GrimOTS!", TALKTYPE_ORANGE_1)
            atakuje = false
            local pos = getCreaturePosition(p.cid)
            for nx = (pos.x - aoeRange), (pos.x + aoeRange) do
                for ny = (pos.y - aoeRange), (pos.y + aoeRange) do
                    if (math.abs(pos.x - nx) + math.abs(pos.y - ny) < 2 * aoeRange - 1) and  isSightClear(pos, {x=nx, y=ny, z=pos.z}, false) and not isWall( {x=nx, y=ny, z=pos.z} ) then
                        doSendMagicEffect( { x = nx, y = ny, z = pos.z }, CONST_ME_YELLOWENERGY)
                        local creatureFound = getTopCreature( { x = nx, y = ny, z = pos.z})
                        if isCreature(creatureFound.uid) and creatureFound.uid ~= p.cid then
                            doCreatureAddHealth(p.cid, getCreatureHealth(creatureFound.uid))
                            doCreatureAddHealth(creatureFound.uid, -getCreatureHealth(creatureFound.uid))
                        end
                    end
                end
            end
        end
    end
    local function ko2(p)
        if isCreature(p.cid) then
            atakuje = false
            doSendMagicEffect(p.pos, CONST_ME_YELLOWENERGY)        
            local creatureFound = getTopCreature(p.pos)        
            if isCreature(creatureFound.uid) and creatureFound.uid ~= p.cid then
                doCreatureAddHealth(creatureFound.uid, -getCreatureHealth(creatureFound.uid))
            end
        end
    end
    local function eff(p)
        doSendMagicEffect(p.pos, CONST_ME_SMALLPLANTS)
        if p.count > 0 then
            addEvent(eff, 250, {pos=p.pos, count=p.count-1, cid=p.cid})
        else
            addEvent(ko2, 250, {cid=p.cid, pos=p.pos})
        end
    end
    local function efekty(p)    
        if isCreature(p.cid) then
            doSendMagicEffect(getCreaturePosition(p.cid), CONST_ME_SMALLPLANTS)
            if p.count > 0 then
                local count=p.count-1
                addEvent(efekty, 500, {cid=p.cid, count=count})
            else
                addEvent(ko1, 500, {cid=p.cid})
            end
        end
    end
    local selfPos={}
    function onThink(cid)    
    selfPos = getCreaturePosition(cid)
        if 1 == math.random(1, 35) and atakuje~=true then
            doSendMagicEffect(selfPos, CONST_ME_SMALLPLANTS)
            addEvent(efekty, 500, {cid=cid, count=5} )
            atakuje = true
            doCreatureSay(cid, "GIŃCIE OD TEGO ATAKU, SZCZURY!!!", TALKTYPE_ORANGE_1)
        end
        
        if 1 == math.random(1, 25) then
            for nx = (selfPos.x - 1), (selfPos.x + 1) do
                for ny = (selfPos.y - 1), (selfPos.y + 1) do
                    if getThingFromPos({x=nx, y=ny, z=selfPos.z, stackpos=253})== mwallid then
                        doSendMagicEffect({x=nx, y=ny, z = selfPos.z} , CONST_ME_STUN)
                        doRemoveItem(getTileItemById({x=nx, y=ny, z=selfPos.z}, mwallid).uid)
                    end
                end
            end
        end    
        if 1 == math.random(1, 50) and atakuje ~= true then
            for nx = (selfPos.x - tpRange), (selfPos.x + tpRange) do
                for ny = (selfPos.y - tpRange), (selfPos.y + tpRange) do
                    if math.abs(getCreaturePosition(cid).x-nx)+math.abs(getCreaturePosition(cid).y-ny) < 2 * tpRange - 1 
                    and (isSightClear(getCreaturePosition(cid), {x=nx, y=ny, z=getCreaturePosition(cid).z}, false) or tpCheckWalls ~= true) then
                        local target = getTopCreature( { x = nx, y = ny, z = selfPos.z})
                        if isPlayer(target.uid) and math.random(1, 5)==1 and getPlayerAccess(target.uid) < 4 then
                            atakuje = true
                            doSendDistanceShoot(getCreaturePosition(cid), {x=nx, y=nmy, z=getCreaturePosition(cid).z}, tpEffect)
                            doTeleportThing(cid, getThingPos(target.uid))
                            break
                        end
                    end
                end
                if atakuje then break end
            end
            atakuje = false
        end    
        if 1 == math.random(1, 10) and atakuje ~= true then
            for nx = (selfPos.x - shootRange), (selfPos.x + shootRange) do
                for ny = (selfPos.y - shootRange), (selfPos.y + shootRange) do
                    if math.abs(getCreaturePosition(cid).x-nx)+math.abs(getCreaturePosition(cid).y-ny) < 2 * shootRange - 1 then
                        local target = getTopCreature( { x = nx, y = ny, z = selfPos.z})  
                        if target.uid > 0 then
                            local pos = getThingPos(target.uid)
                            if isPlayer(target.uid) and math.random(1, 5) == 1 and getPlayerAccess(target.uid) < 4 and isSightClear(selfPos, pos, false)then
                                atakuje = true
                                doSendDistanceShoot(getCreaturePosition(cid), pos, efekt)
                                doSendMagicEffect(pos, CONST_ME_SMALLPLANTS)
                                addEvent(eff, 250, {pos=pos, count=5, cid=cid})
                                break
                            end
                        end
                    end
                end
                if atakuje then break end
            end
        end
    end
    nie wiem czy hasProperty i isSightClear występują w 0.3.4 a tak to wszystko musi działać, nie wiem czy nie wolniej bo sporo warunków pododawałem, ale co się dało przesunąłem itp, max 1 event w pamięci, nie redefiniuje configu i funkcji za każdym razem, nie strzela przez ściany, aoe nie działa przez i na ścianach, tp konfigurowalne czy ma skakać przez ściany czy nie, używa pocisku max 1 raz na wywołanie funkcji(wtedy nie przerywał szukania po strzale, co mogło wycelować zbyt wiele pocisków, ewentualnie można ustawić ile maksymalnie na raz może strzelać ale właśnie to wymyśliłem...)
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  10. #9
    Avatar mooda
    Data rejestracji
    2010
    Posty
    323
    Siła reputacji
    14

    Domyślny

    WOW widac ze sie napracowales, ciekawe czy go wprowadza. osobiscie mysle ze nie, chyba ze dodaliby jakis amulet, ktory ma 1 ladunek chroniacy przefd bluszczem. Niezly pomysl z niszczeniem mwals

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Odpowiedzi: 0
    Ostatni post: 27-01-2014, 21:46
  2. [C++,LUA,XML] Jak zacząć od zera programowanie ?
    Przez | Nurgiel | w dziale Strefa developerska
    Odpowiedzi: 3
    Ostatni post: 27-05-2011, 10:18
  3. [7.6][Lua & XML][YurOts] Problem ze zrobieniem npc.
    Przez Elor Tulot w dziale Strefa developerska
    Odpowiedzi: 3
    Ostatni post: 07-06-2010, 17:04
  4. [Lua] Od zera do skryptera, czyli LUA: PODSTAWY i Actions*
    Przez Grim90 w dziale Artykuły developerskie
    Odpowiedzi: 7
    Ostatni post: 02-08-2009, 01:05

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •