Annihilator quest i jego pochodne - czarnowidz - 10-05-2013
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.
![[Image: tpTr0lm.png]](http://i.imgur.com/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).
![[Image: KdLgaPo.png]](http://i.imgur.com/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:
PHP Code: -- ################################################### -- ## 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(cid, item, frompos, item2, topos)
-- ########################## -- ## KONFIGURACJA SKRYPTU ## -- ########################## local questLevel = 100 -- minimalny poziom gracza aby dolaczyc do questu local questMonster = "Demon" -- nazwa potwora, ktory jest summonowany na quescie local config = {leverAID = 5102, lever1 = 5663, lever2 = 5664, passAID = 5101, passID = 1772, passDIR = 1}
-- pozycje, na ktorych gracze musza stanac przed rozpoczeciem misji local questPlayersInit = { {x=1085, y=148, z=6, stackpos=253}, {x=1085, y=149, z=6, stackpos=253}, {x=1085, y=150, z=6, stackpos=253}, {x=1085, y=151, z=6, stackpos=253} } -- pozycje, na ktore gracze zostana teleportowani po uzyciu dzwigni local questPlayersDest = { {x=1085, y=134, z=6}, {x=1085, y=135, z=6}, {x=1085, y=136, z=6}, {x=1085, y=137, z=6} } -- pozycje, na ktorych pojawia sie potwory w chwili wywolania misji local questMonstersPos = { {x=1082, y=137, z=6}, {x=1082, y=134, z=6}, {x=1088, y=137, z=6}, {x=1088, y=134, z=6}, {x=1085, y=133, z=6}, {x=1085, y=132, z=6} } -- centralna czesc pokoju z questem (sprawdzenie, czy aktualnie nie ma w nim innej druzyny local questAreaCenter = {x=1085, y=135, z=6} -- wartosc storage, w 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(players, p) 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.uid, questStorageValue) == -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.x, y=pos.y, z=pos.z, stackpos=255}).cid) == questMonster) then doRemoveCreatureFromPos({x=pos.x, y=pos.y, z=pos.z, stackpos=255}) end doSummonCreature(questMonster, pos) end for _, pos in pairs(questPlayersDest) do if (getCreatureName(getThingFromPos({x=pos.x, y=pos.y, z=pos.z, stackpos=255}).cid) == questMonster) then doRemoveCreatureFromPos({x=pos.x, y=pos.y, z=pos.z, stackpos=255}) end end
for _, px in pairs(players) do doTeleportThing(px.uid,questPlayersDest[_]) end -- "przeciagniecie" dzwigni doTransformItem(item.uid,config.lever2) else doPlayerSendTextMessage(cid, 22, "Ktos juz wykonal ta misje!") end else doPlayerSendTextMessage(cid, 22, "Wszyscy gracze musza miec co najmniej "..questLevel.." poziom doswiadczenia!") end else doPlayerSendTextMessage(cid, 22, "Potrzebujesz 4 graczy, zeby wykonac ta misje!") end else doPlayerSendTextMessage(cid, 22, "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(cid, 22, "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({x = frompos.x, y= frompos.y+1, z = frompos.z, stackpos = 253}) if player.uid ~= nil and player.uid > 0 and isPlayer(player.uid) == 1 then doTeleportThing(player.uid, {x = frompos.x, y= frompos.y-2, z = frompos.z}) end else local player = getThingfromPos({x = frompos.x-1, y= frompos.y, z = frompos.z, stackpos = 253}) if player.uid ~= nil and player.uid > 0 and isPlayer(player.uid) == 1 then doTeleportThing(player.uid, {x = frompos.x+2, y= frompos.y, z = frompos.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:
PHP Code: <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ć:
PHP Code: SV_QUESTS = { -- Głowne SV w postępie danego questu
Oraz dokleić poniżej wartość:
Pamiętając o zmianie wartości SV na wolną wartość!
3. Konfiguracja.
Konfiguracja odbywa się w samym skrypcie LUA:
PHP Code: 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.
PHP Code: local questMonster = "Demon" -- nazwa potwora, ktory jest summonowany na quescie
Nazwa potwora, który będzie summonowany na queście.
PHP Code: local config = {leverAID = 5102, lever1 = 5663, lever2 = 5664, passAID = 5101, passID = 1772, passDIR = 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)
PHP Code: -- pozycje, na ktorych gracze musza stanac przed rozpoczeciem misji local questPlayersInit = { {x=1085, y=148, z=6, stackpos=253}, {x=1085, y=149, z=6, stackpos=253}, {x=1085, y=150, z=6, stackpos=253}, {x=1085, y=151, z=6, stackpos=253} } -- pozycje, na ktore gracze zostana teleportowani po uzyciu dzwigni local questPlayersDest = { {x=1085, y=134, z=6}, {x=1085, y=135, z=6}, {x=1085, y=136, z=6}, {x=1085, y=137, z=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!
PHP Code: -- pozycje, na ktorych pojawia sie potwory w chwili wywolania misji local questMonstersPos = { {x=1082, y=137, z=6}, {x=1082, y=134, z=6}, {x=1088, y=137, z=6}, {x=1088, y=134, z=6}, {x=1085, y=133, z=6}, {x=1085, y=132, z=6} }
Pozycje, na których mają się pojawić potwory w zadaniu. Jedna linia - jeden potwór.
PHP Code: -- centralna czesc pokoju z questem (sprawdzenie, czy aktualnie nie ma w nim innej druzyny local questAreaCenter = {x=1085, y=135, z=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.
|