Odpowiedz 
Annihilator quest i jego pochodne
10-05-2013, 02:18 PM
Post: #1
Annihilator quest i jego pochodne
Chciałbym przedstawić moją interpretację misji Annihilator quest. Na początku krótki wstęp.

1. Wstęp.
Quest składa się z dwóch elementów - pokoju inicjującego quest oraz pokoju z potworami i nagrodami.

[Obrazek: tpTr0lm.png]
W pierwszej sali wyróżniamy dwa ważne elementy:
Pozycje graczy, na których mają się ustawić. (należy je spisać, przydadzą się do configu (w takim układzie jak przy wpisaniu !pos w grze)
Dźwignia po której użyciu gracze są teleportowani do final roomu. (należy spisać ID dźwigni przed i po użyciu oraz nadać jej Action ID w edytorze mapy).

[Obrazek: KdLgaPo.png]
Final room z potworami do pokonania oraz nagrodami. Tutaj wyróżniamy wiele elementów:
Pozycje graczy, na na które zostaną przeteleportowani. (należy je spisać, przydadzą się do configu (w takim układzie jak przy wpisaniu !pos w grze)
Kamien, który blokuje przejście. Po jego użyciu zostajemy przeniesieni 2 kratki do przodu (tak, aby nikt nie mógł dołączyć do questu z pokoju nagród)
Nagrody, każda ze skrznek musi mieć unikalny Action ID (skrypt nie zawiera wydawania nagród - można je skonfigurować w skrypcie z tego linku: http://forum.ronit.pl/thread-786.html)
* co prawda nie są zaznaczone, ale pozycje potworów (tutaj demonów) należy również sobie spisać, przyda się to do instalacji

Innowacją w tym skrypcie jest fakt, że quest można dowolnie skonfigurować na określoną ilość graczy - w misji może brać udział dowolna ilość osób zależna od upodobań osoby konfigurującej. W konfiguracji również można zmienić nazwę potworów summonowanych.

2. Instalacja.

2.1. W folderze "actions/scripts/" należy utworzyć nowy plik o nazwie "annihilator.lua" oraz wkleić do niego poniższy kod:
Kod PHP:
-- ###################################################
-- ## Created by: Piotr Nowak (Matem)                 ##
-- ## Date: 08.05.2013                               ##
-- ## Exclusive for RonIT.pl                         ##
-- ## Support for this script:                        ##
-- ## http://forum.ronit.pl/forumdisplay.php?fid=22 ##
-- ###################################################

function onUse(ciditemfrompositem2topos)

    -- 
##########################
    
-- ## KONFIGURACJA SKRYPTU ##
    
-- ##########################
    
    
local questLevel 100 -- minimalny poziom gracza aby dolaczyc do questu
    local questMonster 
"Demon" -- nazwa potworaktory jest summonowany na quescie
    
    local config 
= {leverAID 5102lever1 5663lever2 5664passAID 5101passID 1772passDIR 1}

    -- 
pozycjena ktorych gracze musza stanac przed rozpoczeciem misji
    local questPlayersInit 
= {    {x=1085y=148z=6stackpos=253},
                                {
x=1085y=149z=6stackpos=253},
                                {
x=1085y=150z=6stackpos=253},
                                {
x=1085y=151z=6stackpos=253}
                            }
                            
    -- 
pozycjena ktore gracze zostana teleportowani po uzyciu dzwigni
    local questPlayersDest 
= {    {x=1085y=134z=6},
                                {
x=1085y=135z=6},
                                {
x=1085y=136z=6},
                                {
x=1085y=137z=6}
                            }
                            
    -- 
pozycjena ktorych pojawia sie potwory w chwili wywolania misji
    local questMonstersPos 
= {    {x=1082y=137z=6},
                                {
x=1082y=134z=6},
                                {
x=1088y=137z=6},
                                {
x=1088y=134z=6},
                                {
x=1085y=133z=6},
                                {
x=1085y=132z=6}
                            }
                            
    -- 
centralna czesc pokoju z questem (sprawdzenieczy aktualnie nie ma w nim innej druzyny
    local questAreaCenter 
= {x=1085y=135z=6}
    
    -- 
wartosc storagew ktorej zapisywany jest stopien wykonania misji
    local questStorageValue 
SV_QUESTS["ANNIHILATOR"]

    -- 
###############################
    
-- ## NIE ZMIENIAC NIC PONIZEJ! ##
    
-- ###############################
    
    
if #questPlayersInit == #questPlayersDest then
        
-- lever odblokowany do questu
        
if item.actionid == config.leverAID then
            
if item.itemid == config.lever1 then    
                
if isPlayerInArea(questAreaCenter,4) ~= 1 then    
                    
                    local numberOfPlayers 
#questPlayersInit
                    
                    
local players = {}
                    
local countPx 0
                    
for _ppos in pairs(questPlayersInit) do
                        
local p getThingfromPos(ppos)
                        
table.insert(playersp)
                        if 
p.itemid 0 then countPx countPx 1 end
                    end
                    
                    
if countPx == numberOfPlayers then
                        local countPlvl 
0
                        
for _px in pairs(players) do
                            if 
getPlayerLevel(px.uid) >= questLevel then countPlvl countPlvl 1 end
                        end
                                            
                        
if countPlvl == numberOfPlayers then
                            local countPsv 
0
                            
for _px in pairs(players) do
                                if 
getPlayerStorageValue(px.uidquestStorageValue) == -1 then countPsv countPsv 1 end
                            end

                            
if countPsv == numberOfPlayers then
                                
-- czyszczenie questu przed poprzednikami oraz summonowanie "czystych" potworow
                                
for _pos in pairs(questMonstersPos) do
                                    if (
getCreatureName(getThingFromPos({x=pos.xy=pos.yz=pos.zstackpos=255}).cid) == questMonsterthen 
                                        doRemoveCreatureFromPos
({x=pos.xy=pos.yz=pos.zstackpos=255}) 
                                    
end
                                    doSummonCreature
(questMonsterpos)
                                
end                            
                                
                                
for _pos in pairs(questPlayersDest) do
                                    if (
getCreatureName(getThingFromPos({x=pos.xy=pos.yz=pos.zstackpos=255}).cid) == questMonsterthen 
                                        doRemoveCreatureFromPos
({x=pos.xy=pos.yz=pos.zstackpos=255}) 
                                    
end
                                end

                                
for _px in pairs(players) do
                                    
doTeleportThing(px.uid,questPlayersDest[_])
                                
end
                                
                                
-- "przeciagniecie" dzwigni
                                doTransformItem
(item.uid,config.lever2)
                                
                            else
                                
doPlayerSendTextMessage(cid22"Ktos juz wykonal ta misje!")
                            
end
                            
                        
else
                            
doPlayerSendTextMessage(cid22"Wszyscy gracze musza miec co najmniej "..questLevel.." poziom doswiadczenia!")
                        
end
                        
                    
else
                        
doPlayerSendTextMessage(cid22"Potrzebujesz 4 graczy, zeby wykonac ta misje!")
                    
end            
                
else
                    
doPlayerSendTextMessage(cid22"Inna druzyna jest w trakcie wykonywania misji. Musisz chwile zaczekac.")
                
end
            
-- lever zablokowany
            
elseif item.itemid == config.lever2 then
                
if isPlayerInArea(questAreaCenter,4) ~= 1 then
                    doTransformItem
(item.uid,config.lever1)
                else
                    
doPlayerSendTextMessage(cid22"Inna druzyna jest w trakcie wykonywania misji. Musisz chwile zaczekac.")
                
end
            end    
        
elseif item.actionid == config.passAID then
            
if item.itemid == config.passID then
                
if config.passDIR == 1 then
                    local player 
getThingfromPos({frompos.xyfrompos.y+1frompos.zstackpos 253})
                    if 
player.uid ~= nil and player.uid and isPlayer(player.uid) == 1 then
                        doTeleportThing
(player.uid, {frompos.xyfrompos.y-2frompos.z})
                    
end
                
else
                    
local player getThingfromPos({frompos.x-1yfrompos.yfrompos.zstackpos 253})
                    if 
player.uid ~= nil and player.uid and isPlayer(player.uid) == 1 then
                        doTeleportThing
(player.uid, {frompos.x+2yfrompos.yfrompos.z})
                    
end
                end
            end
        end
    
else
        print(
"<ANNIHILATOR.LUA> (Skrypt nie zostal poprawnie skonfigurowany - ilosc wartosci questPlayersInit, questPlayersDest powinna byc sobie rowna)")
    
end

end 

2.2. Do pliku "actions/actions.xml" należy dodać poniższe liniki:
Kod PHP:
        <action actionid="ACTION_ID_DZWIGNI" script="quests/annihilator.lua" />
        <
action actionid="ACTION_ID_KAMIENIA" script="quests/annihilator.lua" /> 
Należy zmienić ACTION_ID_DZWIGNI, ACTION_ID_KAMIENIA na faktyczne wartości Action ID z RME.

2.3. W pliku "lua/global.lua" należy wyszukać:
Kod PHP:
SV_QUESTS = { -- Głowne SV w postępie danego questu 

Oraz dokleić poniżej wartość:
Kod PHP:
    ["ANNIHILATOR"] = 5020
Pamiętając o zmianie wartości SV na wolną wartość!

3. Konfiguracja.
Konfiguracja odbywa się w samym skrypcie LUA:
Kod PHP:
    local questLevel 100-- minimalny poziom gracza aby dolaczyc do questu 
Nalezy tutaj wpisac wartosc liczbową przedstawiającą minimalny poziom gracza, aby dołączył do questu.
Kod PHP:
    local questMonster "Demon" -- nazwa potworaktory jest summonowany na quescie 
Nazwa potwora, który będzie summonowany na queście.
Kod PHP:
local config = {leverAID 5102lever1 5663lever2 5664passAID 5101passID 1772passDIR 1
Konfiguracja dźwigni oraz kamienia:
leverAID - action id dźwigni
lever1 - id dźwigni przed użyciem
lever2 - id dźwigni po użyciu
passAID - action id kamienia blokującego drogę
passID - id kamienia
passDIR - kierunek, w którym kamień ma teleportować (1 - południe->północ; 2 - zachód->wschód)

Kod PHP:
    -- pozycjena ktorych gracze musza stanac przed rozpoczeciem misji
    local questPlayersInit 
= {    {x=1085y=148z=6stackpos=253},
                                {
x=1085y=149z=6stackpos=253},
                                {
x=1085y=150z=6stackpos=253},
                                {
x=1085y=151z=6stackpos=253}
                            }
                            
    -- 
pozycjena ktore gracze zostana teleportowani po uzyciu dzwigni
    local questPlayersDest 
= {    {x=1085y=134z=6},
                                {
x=1085y=135z=6},
                                {
x=1085y=136z=6},
                                {
x=1085y=137z=6}
                            } 

Pozycje na których będą stali przed rozpoczęciem misji i po jej rozpoczęciu. Jedna linika = jeden gracz. Liczba linii w questPlayersInit i questPlayersDest muszą być sobie równe!

Kod PHP:
    -- pozycjena ktorych pojawia sie potwory w chwili wywolania misji
    local questMonstersPos 
= {    {x=1082y=137z=6},
                                {
x=1082y=134z=6},
                                {
x=1088y=137z=6},
                                {
x=1088y=134z=6},
                                {
x=1085y=133z=6},
                                {
x=1085y=132z=6}
                            } 
Pozycje, na których mają się pojawić potwory w zadaniu. Jedna linia - jeden potwór.
Kod PHP:
                                -- centralna czesc pokoju z questem (sprawdzenieczy aktualnie nie ma w nim innej druzyny
    local questAreaCenter 
= {x=1085y=135z=6
Centralna część questu - podczas rozpoczynania misji sprawdzane jest to pole i pola obok (sprawdzenie, czy aktualnie inna drużyna nie wykonuje misji). Zaleca się wpisać tutaj jedną z pozycji na którą teleportowany jest gracz.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości