Oskar
Forum friend
- Joined
- Jan 24, 2009
- Messages
- 2,256
- Reaction score
- 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:
Od teraz mo?emy si? cieszy? now? funkcj? masowej teleportacji.
Jak to dzia?a? Ju? t?umacz?:
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
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)
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