LU

[System] Anti-Trap Low Level

Por lucas502, 24 de mai. de 2012 em Scripts

15
3.5k
lucas502L
24 de maio de 2012 às 00:06

aew galera, preciso de um sistema anti-trap low level sakam?

 

pra não acontecer de na war, os caras fazerem char low level (level menor que o pvp level) soh pra trapar os outros, uma coisa do tipo Swap Position ou sei la..

 

Qualquer coisa que evite esse "trap low level"... Vlw ;)

jhon992J
24 de maio de 2012 às 12:14

Vai em data/creaturescripts/scripts, duplica um arquivo e nomeia para "antitrap" sem as aspas e nele cole:

function onThink(cid, interval)

if getTilePzInfo(getCreaturePosition(cid)) then
   return true
end

local minuto = 1 -- quantos minuto para atravesar o player.
local protectionLevel = 100 -- protection level do server.
local position = getPlayerPosition(cid)

if getPlayerLookDir(cid) == 0 then
   position = {x=position.x, y=position.y-1, z=position.z}
elseif getPlayerLookDir(cid) == 1 then
   position = {x=position.x+1, y=position.y, z=position.z}
elseif getPlayerLookDir(cid) == 2 then
   position = {x=position.x, y=position.y+1, z=position.z}
elseif getPlayerLookDir(cid) == 3 then
   position = {x=position.x-1, y=position.y, z=position.z}
end

for i = 0, 255 do
local o = 0
   position.stackpos = i
   local tile = getTileThingByPos(position)
   if isPlayer(tile.uid) and getPlayerLevel(tile.uid) < protectionLevel then
local o = 1
       setPlayerStorageValue(cid, 56421, getPlayerStorageValue(cid,56421)+1)
       if getPlayerStorageValue(cid, 56421) >= 120*minuto then
           setPlayerStorageValue(cid, 56421, 0)
           doTeleportThing(cid, getPlayerPosition(tile.uid))
       end
break
   elseif i == 255 and o == 0 then
setPlayerStorageValue(cid, 56421, 0)
end
end

return true
end

 

Depois em data/creaturescripts/creaturescripts.xml cole a tag:

<event type="think" name="AntiTrap" event="script" value="antitrap.lua"/>

 

E por último no arquivo data/creaturescripts/scripts/login.lua, antes do último "return true" cole:

registerCreatureEvent(cid, "AntiTrap")

 

---------------------------------------------

Vai funcionar assim, se tu ficar virado na direção do player por 1 minuto e o level dele for mais baixo que o level de proteção do server, seu char vai ser teleportado para a posição do char low level. Isso vai funcionar apenas fora de protection zones.

Editado Maio 25 por Jhon992

waltinnW
24 de maio de 2012 às 14:12

aew Jhon aqui deu certo nao.

D:

Tenta ver o que deu de errado *-*

VodkartV
24 de maio de 2012 às 14:15

nas source vai em

 

player.ccp

 

bool Player::canWalkthrough(const Creature* creature) const
{
if(!creature)
return true;

if(creature == this)
return false;

const Player* player = creature->getPlayer();
if(!player)
return false;

if(g_game.getWorldType() == WORLD_TYPE_NO_PVP && player->getTile()->ground
&& player->getTile()->ground->getID() != ITEM_GLOWING_SWITCH)
return true;

uint32_t protectionLevel = g_config.getNumber(ConfigManager::PROTECTION_LEVEL);
   if(player->getLevel() < protectionLevel && player->getTile()->ground
&& player->getTile()->ground->getID() != ITEM_GLOWING_SWITCH)
return true;

return player->isGhost() && getGhostAccess() < player->getGhostAccess();
}

 

 

ou

 

bool Player::canWalkthrough(const Creature* creature) const
{
if(!creature)
return true;

if(creature == this)
return false;

const Player* player = creature->getPlayer();
if(!player)
return false;

if(g_game.getWorldType() == WORLD_TYPE_NO_PVP && player->getTile()->ground
&& player->getTile()->ground->getID() != ITEM_GLOWING_SWITCH)
return true;

return player->isGhost() && getGhostAccess() < player->getGhostAccess();
}

jhon992J
24 de maio de 2012 às 16:02

@waltinn, é mesmo não tava funfando, adicionei umas coisas no script depois de testar dae bugo e eu nem vi.

+ agora ta arrumadinho la em cima, pode testar.

LeoxtibiaL
24 de maio de 2012 às 18:32

Testei o sistema e funcionou aqui. Também estava precisando disso, vlw.

lucas502L
25 de maio de 2012 às 05:40

não funcionou aki, deu erro no script no distro:

 

(onthink)

antitrap.lua:25

Attempt to Compare boolean with number

Player not found when requesting player info #3

AdolfohrqA
25 de maio de 2012 às 16:33

Aqui também deu esse erro!

lucas502L
25 de maio de 2012 às 18:32

É..esperamos a solução então..

E vodkart, obrigado por postar o sistema em source, mas como eu não sei compilar .. =\

 

mesmo assim, muito obrigado ;)

jhon992J
25 de maio de 2012 às 21:46

Mudei la em cima, quem sabe funciona para os outros agora. Caso algum erro posta aqui.

AdolfohrqA
25 de maio de 2012 às 22:19

Obrigado Jhon, sistema está funcionando, não ocorreu erros aqui por enquanto.. Visto que você conseguiu arrumar e nos ajudar REP + pra você! Obrigado..

lucas502L
26 de maio de 2012 às 03:59

estranho...aki o script não deu nenhum erro no distro, mas eu fico virado pra frente do player low level e não é trocado as posições minha e dele..

 

(oq acontece, é que mesmo eu estando com skull ou pz locked, eu posso passar por dentro dele, como se fosse ghost de god)

 

estranho o.O

 

aah..mais um erro no distro (agora no 050-function) :

 

[error creaturescript interface]
<onthink>
<lua GetTile info> Tile Not Found

lib/050-function.lua:331   attempt to index a boolean value

stack traceback:
lib/050-function.lua:331  in function 'GetTilePZinfo'

jhon992J
26 de maio de 2012 às 07:20

@Lucas502, qual a versão do seu server? O script ta totalmente funcional aqui, o erro ae deve ser conflito de versão, esse script deve funcionar com todo otserv 8.54+.

lucas502L
26 de maio de 2012 às 17:17

eh 8.60 o meu..

 

distro 0.4 tfs

 

pelo oq eu entendi, parece q a função q vc usou para verificar o pz tile, eh diferente do 050-function..

jhon992J
26 de maio de 2012 às 17:38

Não sei, pode ser erro na tua lib. Última chance, tenta usar esse:

function getTilePzInfoz(pos)
   return getTileInfo(pos).protection
end

function onThink(cid, interval)

if getTilePzInfoz(getCreaturePosition(cid)) then
   return true
end

local minuto = 1 -- quantos minuto para atravesar o player.
local protectionLevel = 100 -- protection level do server.
local position = getPlayerPosition(cid)

if getPlayerLookDir(cid) == 0 then
   position = {x=position.x, y=position.y-1, z=position.z}
elseif getPlayerLookDir(cid) == 1 then
   position = {x=position.x+1, y=position.y, z=position.z}
elseif getPlayerLookDir(cid) == 2 then
   position = {x=position.x, y=position.y+1, z=position.z}
elseif getPlayerLookDir(cid) == 3 then
   position = {x=position.x-1, y=position.y, z=position.z}
end

for i = 0, 255 do
local o = 0
   position.stackpos = i
   local tile = getTileThingByPos(position)
   if isPlayer(tile.uid) and getPlayerLevel(tile.uid) < protectionLevel then
local o = 1
    setPlayerStorageValue(cid, 56421, getPlayerStorageValue(cid,56421)+1)
    if getPlayerStorageValue(cid, 56421) >= 120*minuto then
	    setPlayerStorageValue(cid, 56421, 0)
	    doTeleportThing(cid, getPlayerPosition(tile.uid))
    end
break
   elseif i == 255 and o == 0 then
setPlayerStorageValue(cid, 56421, 0)
end
end

return true
end