What's new

Lua Functions doTeleportMassThings

Status
Not open for further replies.

Thorge D

Advanced User
Joined
Jul 24, 2014
Messages
300
Reaction score
29
1. Autor - Oskar.

2. Opis - Funkcja teleportuje wszystkie obiekty, w zale?no?ci od wybranego typu (players, NPCs, monsters) z jednego miejsca w drugie.
Budowa funkcji wygl?da nast?puj?co:
[CPP]doTeleportMassThings(leftTopCorner, rightBottomCorner, newPos, minPlayerCount, toSamenewPos, typeOfObjects)[/CPP]
leftTopCorner to lewy g?rny r?g prostok?ta, z kt?rego pobierane s? obiekty, kt?re maj? zosta? przeteleportowane.
rightBottomCorner jak wy?ej, tylko prawy dolny r?g.
newPos pozycja gdzie przeniesie wszystkie obiekty.
minPlayerCount je?li chcemy by do udanej teleportacji wymagana by?a odpowiednia ilo?? obiekt?w, to tutaj to ustawimy.
toSamenewPos za? tutaj mo?emy ustali? czy wszystkie obiekty zostan? przeteleportowane na jedn? i t? sam? pozycj? czy te? zostan? rozrzucone na kwadracie o boku 5qm.
typeOfObjects typ obiekt?w, kt?re zostan? przeteleportowane. Jako t? zmienn? podstawiamy:
[CPP]isCreature / isPlayer / isMonster / isNpc[/CPP]


3. Klient - Bazowo pisa?em go pod 8.54, silnik 0.3.6pl1, ale powinien dzia?a? na innych.

4. Skrypt

Funkcj? wklejamy do data/lib/050-functions.lua:
[lua]function getFreeTile(pos, rangeX, rangeY, ignoreCreature, ignoreProj)
local tablePositions = {}
for x = -rangeX, rangeX do
for y = -rangeY, rangeY do
local position = {x=pos.x,y=pos.y,z=pos.z}
position.x = pos.x + x
position.y = pos.y + y
if isWalkable(position, ignoreCreature, ignoreProj) then
tablePositions[#tablePositions+1] = position
end
end
end
return #tablePositions > 0 and tablePositions
end

function doTeleportMassThings(leftTopCorner, rightBottomCorner, newPos, minPlayerCount, toSamenewPos, typeOfObjects)
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 newPosSpectators = getFreeTile(newPos, 5, 5, true)
local newPos = (toSamenewPos and newPos or newPosSpectators[math.random(#newPosSpectators)])
if newPos and typeOfObjects(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[/lua]
 
Status
Not open for further replies.
Top