• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

Lua Functions Skrypt masowej teleportacji

Status
Zamknięty.

Oskar

Forum friend
Dołączył
Styczeń 24, 2009
Posty
2256
Liczba reakcji
331
Pomys? narodzi? si? w tym temacie:
Link do tematu z pomys?em

Szukamy pliku 050-function.lua w data/lib i na samym ko?cu wklejamy:
PHP:
function isWalkable(pos, creature, proj, pz) 
if getTileThingByPos({x=pos.x,y=pos.y,z=pos.z,stackpos=0}).itemid == 0 then return false end 
if getTopCreature(pos).uid > 0 and creature then return false end 
if getTileInfo(pos).protection and pz then return false, true end 
local n = not proj and 3 or 2 
for i = 0, 255 do 
    pos.stackpos = i 
    local tile = getTileThingByPos(pos) 
    if tile.itemid ~= 0 and not isCreature(tile.uid) then 
        if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then 
            return false 
        end 
    end 
end 
return true 
end 

local _f = doTeleportThing 
function doTeleportThing(cid, newpos, pushmove, ignoreBlocking) 
    return (ignoreBlocking or isWalkable(newpos, false, true, false) or false) and _f(cid, newpos, pushmove) 
end 

function getFreeTile(pos, rangeX, rangeY, ignoreCreature) 
for x = 0, rangeX * 2 do 
    for y = 0, rangeY * 2 do 
        pos.x = pos.x + (x > rangeX and -x + rangeX or x) 
        pos.y = pos.y + (y > rangeY and -y + rangeX or y) 
        if isWalkable(pos, ignoreCreature, true, false) then 
            return pos 
        end 
    end 
end 
return false 
end 

function doTeleportMassThings(leftTopCorner, rightBottomCorner, newPos, minPlayerCount, toSameNewPos, teleportOnlyPlayer) 
local rangeX, rangeY = math.abs(rightBottomCorner.x - leftTopCorner.x)/2, math.abs(rightBottomCorner.y - leftTopCorner.y)/2 
local center, player = {x=leftTopCorner.x+rangeX,y=rightBottomCorner.y-rangeY}, {} 
for z = math.min(leftTopCorner.z, rightBottomCorner.z), math.max(leftTopCorner.z, rightBottomCorner.z) do 
    center.z = z 
    if getSpectators(center, rangeX, rangeY) then 
        for _, cid in pairs(getSpectators(center, rangeX, rangeY)) do 
            table.insert(player, cid) 
        end 
    end 
end 
if #player >= minPlayerCount then 
    for _, cid in pairs(player) do 
        local newPos = (toSameNewPos and newPos or getFreeTile(newPos, 5, 5, true)) 
        if newPos and (teleportOnlyPlayer and isPlayer(cid) or isCreature(cid)) then 
            doTeleportThing(cid, newPos, true, true) 
        else 
            print('ERROR: [newPos value is false or some object is not a creature].') 
        end 
    end 
end 
return true 
end

Od teraz mo?emy si? cieszy? now? funkcj? masowej teleportacji.
Jak to dzia?a? Ju? t?umacz?:
PHP:
doTeleportMassThings(leftTopCorner, rightBottomCorner, newPos, minPlayerCount, toSameNewPos, teleportOnlyPlayer)
leftTopCorner to lewy g?rny r?g kwadratu, z kt?rego ma pobiera? wszystkie obiekty, na pozycji 'z' mo?ecie wpisa? od lub do kt?rego pi?tra ma wy?apywa? obiekty.
rightBottomCorner jak wy?ej tylko jest to prawy dolny r?g kwadratu, tutaj tak samo z pozycj? 'z' jak w powy?szej zmiennej.
newPos pozycja, na kt?r? b?dzie teleportowa? wszystkie obiekty znalezione wcze?niej.
minPlayerCount opcjonalne, minimalna ilo?? obiekt?w by teleportacja si? powiod?a.
toSameNewPos czy ma wszystkich teleportowa? na jedn? kratk? czy w okre?lonej przestrzeni.
teleportOnlyPlayer czy ma teleportowa? tylko graczy czy NPCty i potwory tak?e
 
Odp: Skrypt masowej teleportacji

Ciekawa funkcja, takie rzeczy zawsze s? mile widziane. Mo?e mie? wiele zastosowa? w grze w questach i nie tylko. Z pewno?ci? si? przyda. :)
 
Odp: Skrypt masowej teleportacji

Od?wie?am. Mo?e ma kto? pomys?y jak to udoskonali??
 
Odp: Skrypt masowej teleportacji

;D Widze przez te pol roku co mnie nie bylo nie wiele sie zmienilo ;D Juz nie ma developerow? ;DD btw Wrocilem i umiem troche [duzo] wiecej niz ostatnio ;p ew msg na gg
//Topic: ciekawe i pomyslowe ale nie widze ludzi ktorzy chcieli by to wykorzystac ;D teraz serwy to dno i wodorosty i 'prawie' nikt madry w to nie idzie juz ;/
 
Odp: Skrypt masowej teleportacji

Zamiast rightBottomCorner mo?e szeroko?? i wysoko?? prostok?ta.
Mo?na te? zrobi? "funkcj? wy?szego rz?du". Czyli w miejsce teleportOnlyPlayer przekazujemy funkcj?.

Kod:
if newPos and teleportOnlyPlayer(cid) then

Przyk?ady u?ycia:

Kod:
doTeleportMassThings(leftTopCorner, width, height, newPos, minPlayerCount, toSameNewPos, isCreature)
doTeleportMassThings(leftTopCorner, width, height, newPos, minPlayerCount, toSameNewPos, isPlayer)
doTeleportMassThings(leftTopCorner, width, height, newPos, minPlayerCount, toSameNewPos, function(cid) return getPlayerLevel(cid) > 100 end)
 
Status
Zamknięty.
Do góry