Gandhi
Active User
- Joined
- Aug 7, 2013
- Messages
- 80
- Reaction score
- 19
Cze??!
Odpowiadaj?c na temat Madajaszka pomy?la?em, ?e podziel? si? swoim ma?ym systemikiem, kt?ry z powodzeniem wykorzystuj? na swoim projekcie.
G??wnym jego zastosowaniem s? przede wszystkim bramki levelowe, kt?re teleportuj? na drug? stron? drzwi bez ich otwierania. Posiada mo?liwo?? ustawienia minimalnego i maksymalnego levelu gracza, kt?rego przepu?ci, tak?e dodatkow? funkcj? sprawdzania, czy gracz ma czaszk? (je?li ma czaszk? bia??, czerwon? lub czarn?, to nie przepuszcza gracza - przepuszcza za to graczy z party i zielon? czaszk?, na czym niekt?re skrypty si? zaginaj?), tak?e ma wbudowane sprawdzanie, czy w danym terenie jest potw?r (przydatne do quest?w - je?li skrypt znajdzie w danym zasi?gu ?ywego potwora, kt?ry nie jest summonem, to drzwi nie przepuszcz? nikogo, dop?ki potw?r nie zostanie zabity - UWAGA: skrypt sprawdza niezale?nie od kierunku, tak wi?c je?li tymi samymi drzwiami idziesz gdzie? i wracasz, a potw?r si? zrespi, to utkniesz! Mi nie by?a potrzebna taka mo?liwo??).
Mo?na ustawi? drzwi na unique id oraz action id.
do data/actions/scripts/doorlevel.lua
[lua]
local config = {
uid = {
-- [2505] = {maxlv = 900},
-- [55509] = {minlv = 35000},
-- [55510] = {minlv = 35000},
},
aid = {
-- [1110] = {minlv = 25000},
-- [55400] = {minlv = 35000, pzBlock = true},
-- [55401] = {minlv = 35000, killAll = {{-4, -8}, {1, -1}}}
}
}
function onUse(cid, item, frompos, item2, topos)
local door = config.uid[item.uid]
if(not door) then
door = config.aid[item.actionid]
if(not door) then
return false
end
end
local level, pos = getPlayerLevel(cid), getCreaturePosition(cid)
if(door.maxlv and level > door.maxlv) then
doCreatureSay(cid, "You have too big level to pass this doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.minlv and door.minlv > level) then
doCreatureSay(cid, "You need "..door.minlv.." level to pass this doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.pzBlock and isInArray({SKULL_WHITE, SKULL_RED, SKULL_BLACK}, getCreatureSkull(cid))) then
doCreatureSay(cid, "You can't go though this doors with skull.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.killAll ~= nil) then
if(type(door.killAll[1]) == 'table') then
for x = topos.x + door.killAll[1][1], topos.x + door.killAll[2][1] do
for y = topos.y + door.killAll[1][2], topos.y + door.killAll[2][2] do
local tempos = {x=x, y=y, z=topos.z,stackpos=253}
local thing = getThingfromPos(tempos)
if(thing.uid > 0 and isMonster(thing.uid) and not getCreatureMaster(thing.uid)) then
doCreatureSay(cid, "You must kill all monsters in this room!", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
end
end
--else -- je?li nie tabela z topLeft, bottomRight, to mo?e by? zasi?g jako liczba, kt?r? mo?na wykorzysta? do getSpectators
-- nie mia?em potrzeby pisa? takiego kodu, dlatego tutaj jest puste miejsce, aczkolwiek jest mo?liwo?? doda?
end
end
if(pos.x == topos.x) then
if(pos.y < topos.y) then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end
elseif(pos.y == topos.y) then
if(pos.x < topos.x) then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doCreatureSay(cid, "Stand opposite to the doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
doTeleportThing(cid, pos)
doSendMagicEffect(topos, CONST_ME_MAGIC_BLUE)
return true
end
[/lua]
do actions.xml dodajesz odpowiedni? linijk?, je?li twoje drzwi maj? unique id, to:
[xml]<action uid="2505" event="script" value="doorlevel.lua"/>[/xml]
a je?li actionid to:
[xml]<action actionid="55400" event="script" value="doorlevel.lua"/>[/xml]
gdzie w dw?ch powy?szych przyk?adasz liczby s? przyk?adowe, i musisz poda? odpowiednio w?asne.
A teraz konfiguracja: Drzwi z uniqueid dodajesz do tabeli config.uid, a z actionid dodajesz do config.aid.
Reszta konfiguracji: [lua]
[action/unique id] = {
minlv = minimalny_level, -- jesli ustawisz, jako liczbe i gracz ma mniejszy niz podany level to nie zostanie przepuszczony przez drzwi. Je?li ustawisz jako false lub nil, to sprawdzanie minimalnego levelu b?dzie ignorowane
maxlv = maksymalny_level, -- jesli ustawisz, jako liczbe i gracz ma wiekszy niz podany level to nie zostanie przepuszczony przez drzwi. Je?li ustawisz jako false lub nil, to sprawdzanie maksymalnego levelu b?dzie ignorowane
pzBlock = czy_sprawdzac_czaszke, -- jesli ustawisz jako warto?? logiczn? true, a gracz b?dzie posiada? bia??, czarn? lub czerwon? czaszk?, nie zostanie przepuszczony
killAll = { -- sprawdzanie potwor?w w danym zasi?gu - je?li w tym zasi?gu znajdzie si? jaki? potw?r, kt?ry nie b?dzie summonem, wtedy gracz nie zostanie przepuszczony. Ustaw false / nil / w og?le nie ustawiaj, aby nie sprawdza? ?ywych potwor?w
{gornyLewyRogX, gornyLewyRogY}, -- wszystkie te 4 liczby to wzgledne pozycje zalezne od pozycji drzwi
{dolnyPrawyRogX, dolnyPrawyRogY} -- czyli gornyPrawyRog = {x=pozycja_drzwi.x + gornyLewyRogX, y=pozycja_drzwi.y + gornyLewyRogY, z=pozycja_drzwi.z}, a dolnyPrawyRog = {x=pozycja_drzwi.x + dolnyPrawyRogX, y=pozycja_drzwi.y + dolnyPrawyRogY, z=pozycja_drzwi.z}. Ten kwadrat jest przeszukiwany. Wiecej info na obrazku
}
}[/lua]
Obrazek, kt?ry powinien u?atwi? zrozumienie, jak dzia?a sprawdzanie potwork?w.
Pozwoli?em sobie na taki opis, poniewa? prawdopodobnie w przysz?o?ci wrzuc? ulepszon? wersj? tego skryptu.
Mam nadziej?, ?e wszystko jasne. Mi?ego u?ytkowania.
Odpowiadaj?c na temat Madajaszka pomy?la?em, ?e podziel? si? swoim ma?ym systemikiem, kt?ry z powodzeniem wykorzystuj? na swoim projekcie.
G??wnym jego zastosowaniem s? przede wszystkim bramki levelowe, kt?re teleportuj? na drug? stron? drzwi bez ich otwierania. Posiada mo?liwo?? ustawienia minimalnego i maksymalnego levelu gracza, kt?rego przepu?ci, tak?e dodatkow? funkcj? sprawdzania, czy gracz ma czaszk? (je?li ma czaszk? bia??, czerwon? lub czarn?, to nie przepuszcza gracza - przepuszcza za to graczy z party i zielon? czaszk?, na czym niekt?re skrypty si? zaginaj?), tak?e ma wbudowane sprawdzanie, czy w danym terenie jest potw?r (przydatne do quest?w - je?li skrypt znajdzie w danym zasi?gu ?ywego potwora, kt?ry nie jest summonem, to drzwi nie przepuszcz? nikogo, dop?ki potw?r nie zostanie zabity - UWAGA: skrypt sprawdza niezale?nie od kierunku, tak wi?c je?li tymi samymi drzwiami idziesz gdzie? i wracasz, a potw?r si? zrespi, to utkniesz! Mi nie by?a potrzebna taka mo?liwo??).
Mo?na ustawi? drzwi na unique id oraz action id.
do data/actions/scripts/doorlevel.lua
[lua]
local config = {
uid = {
-- [2505] = {maxlv = 900},
-- [55509] = {minlv = 35000},
-- [55510] = {minlv = 35000},
},
aid = {
-- [1110] = {minlv = 25000},
-- [55400] = {minlv = 35000, pzBlock = true},
-- [55401] = {minlv = 35000, killAll = {{-4, -8}, {1, -1}}}
}
}
function onUse(cid, item, frompos, item2, topos)
local door = config.uid[item.uid]
if(not door) then
door = config.aid[item.actionid]
if(not door) then
return false
end
end
local level, pos = getPlayerLevel(cid), getCreaturePosition(cid)
if(door.maxlv and level > door.maxlv) then
doCreatureSay(cid, "You have too big level to pass this doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.minlv and door.minlv > level) then
doCreatureSay(cid, "You need "..door.minlv.." level to pass this doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.pzBlock and isInArray({SKULL_WHITE, SKULL_RED, SKULL_BLACK}, getCreatureSkull(cid))) then
doCreatureSay(cid, "You can't go though this doors with skull.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
if(door.killAll ~= nil) then
if(type(door.killAll[1]) == 'table') then
for x = topos.x + door.killAll[1][1], topos.x + door.killAll[2][1] do
for y = topos.y + door.killAll[1][2], topos.y + door.killAll[2][2] do
local tempos = {x=x, y=y, z=topos.z,stackpos=253}
local thing = getThingfromPos(tempos)
if(thing.uid > 0 and isMonster(thing.uid) and not getCreatureMaster(thing.uid)) then
doCreatureSay(cid, "You must kill all monsters in this room!", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
end
end
--else -- je?li nie tabela z topLeft, bottomRight, to mo?e by? zasi?g jako liczba, kt?r? mo?na wykorzysta? do getSpectators
-- nie mia?em potrzeby pisa? takiego kodu, dlatego tutaj jest puste miejsce, aczkolwiek jest mo?liwo?? doda?
end
end
if(pos.x == topos.x) then
if(pos.y < topos.y) then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end
elseif(pos.y == topos.y) then
if(pos.x < topos.x) then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doCreatureSay(cid, "Stand opposite to the doors.", TALKTYPE_ORANGE_1)
doSendMagicEffect(pos, CONST_ME_POFF)
return true
end
doTeleportThing(cid, pos)
doSendMagicEffect(topos, CONST_ME_MAGIC_BLUE)
return true
end
[/lua]
do actions.xml dodajesz odpowiedni? linijk?, je?li twoje drzwi maj? unique id, to:
[xml]<action uid="2505" event="script" value="doorlevel.lua"/>[/xml]
a je?li actionid to:
[xml]<action actionid="55400" event="script" value="doorlevel.lua"/>[/xml]
gdzie w dw?ch powy?szych przyk?adasz liczby s? przyk?adowe, i musisz poda? odpowiednio w?asne.
A teraz konfiguracja: Drzwi z uniqueid dodajesz do tabeli config.uid, a z actionid dodajesz do config.aid.
Reszta konfiguracji: [lua]
[action/unique id] = {
minlv = minimalny_level, -- jesli ustawisz, jako liczbe i gracz ma mniejszy niz podany level to nie zostanie przepuszczony przez drzwi. Je?li ustawisz jako false lub nil, to sprawdzanie minimalnego levelu b?dzie ignorowane
maxlv = maksymalny_level, -- jesli ustawisz, jako liczbe i gracz ma wiekszy niz podany level to nie zostanie przepuszczony przez drzwi. Je?li ustawisz jako false lub nil, to sprawdzanie maksymalnego levelu b?dzie ignorowane
pzBlock = czy_sprawdzac_czaszke, -- jesli ustawisz jako warto?? logiczn? true, a gracz b?dzie posiada? bia??, czarn? lub czerwon? czaszk?, nie zostanie przepuszczony
killAll = { -- sprawdzanie potwor?w w danym zasi?gu - je?li w tym zasi?gu znajdzie si? jaki? potw?r, kt?ry nie b?dzie summonem, wtedy gracz nie zostanie przepuszczony. Ustaw false / nil / w og?le nie ustawiaj, aby nie sprawdza? ?ywych potwor?w
{gornyLewyRogX, gornyLewyRogY}, -- wszystkie te 4 liczby to wzgledne pozycje zalezne od pozycji drzwi
{dolnyPrawyRogX, dolnyPrawyRogY} -- czyli gornyPrawyRog = {x=pozycja_drzwi.x + gornyLewyRogX, y=pozycja_drzwi.y + gornyLewyRogY, z=pozycja_drzwi.z}, a dolnyPrawyRog = {x=pozycja_drzwi.x + dolnyPrawyRogX, y=pozycja_drzwi.y + dolnyPrawyRogY, z=pozycja_drzwi.z}. Ten kwadrat jest przeszukiwany. Wiecej info na obrazku
}
}[/lua]
Obrazek, kt?ry powinien u?atwi? zrozumienie, jak dzia?a sprawdzanie potwork?w.

Pozwoli?em sobie na taki opis, poniewa? prawdopodobnie w przysz?o?ci wrzuc? ulepszon? wersj? tego skryptu.
Mam nadziej?, ?e wszystko jasne. Mi?ego u?ytkowania.