Ir para conteúdo
  • Cadastre-se

(Resolvido)System Catapult + erro


Ir para solução Resolvido por zipter98,

Posts Recomendados

Olá galera tudo bom com vcs?

 

Estou aqui a procura de um sistema de catapulta que jogue o player posições acima e caia em uma outra posição ex:

O personagem esta do lado esquerdo do murro e precisa pular para o lado direito sacaram ?

 

O erro que digo é em um script de onDeath segue o erro: attempt to index local 'lastHitKiller' (a number value)

 

tentei arrumar mas nada funciona espero a ajuda beijinhos <3

Link para o post
Compartilhar em outros sites

data/actions/scripts:

local config = {
    lookDirection = "sul",          --Direção que a catapulta está olhando.
    distance = 6,                   --Quantas posições o jogador vai "pular" (só funciona com números pares). Distância máxima: 14.
    directions = {
        ["norte"] = 0,
        ["leste"] = 1,
        ["sul"] = 2,
        ["oeste"] = 3,
    },
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.distance % 2 ~= 0 then
        return doPlayerSendCancel(cid, "Sorry, the catapult isn't available right now.") and print("Trade catapult distance for a odd number.")
    end
    local direction = config.directions[config.lookDirection]
    for i = 1, config.distance do
        addEvent(function()
            if getPlayerLookDir(cid) ~= direction then
                doCreatureSetLookDirection(cid, direction)
            end
            local newPos = getPosByDir(i ~= 1 and getThingPos(cid) or toPosition, direction)
            newPos.z = i <= config.distance / 2 and newPos.z - 1 or newPos.z + 1
            if i < config.distance then
                doAreaCombatHealth(0, 0, newPos, 0, 0, 0, 255)
                doCreateItem(460, 1, newPos)
            end
            doTeleportThing(cid, newPos)
        end, i * 120)
    end
    return true
end
data/movements/scripts:
local area = createCombatArea{
    {1, 1, 1}, 
    {1, 2, 1}, 
    {1, 1, 1}, 
}
function onStepIn(cid, item, position, fromPosition)
    doAreaCombatHealth(cid, 3080, getThingPos(cid), area, 0, 0, 255)
    return true
end
function onStepOut(cid, item, position, fromPosition)
    local oldtpos = fromPosition
    oldtpos.stackpos = STACKPOS_GROUND
    if getTileThingByPos(oldtpos).itemid >= 1 then
        doRemoveItem(getTileThingByPos(oldtpos).uid, 1)
    end
    return true
end
Tags do movement:
<movevent type="StepOut" itemid="460" event="script" value="nome_do_arquivo.lua"/>
<movevent type="StepIn" itemid="460" event="script" value="nome_do_arquivo.lua"/>
Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Poste o script onDeath.

 

Amanhã vejo o de catapulta pra você.

 

Boa sorte.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Script com erro

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)
 
local killer = lastHitKiller[1]
 
if isPlayer(killer) and (getCreatureName(cid) == "Gran Tower") then
 
if (getGlobalStorageValue(GRANTOWER.FINALWINNER) ~= getCreatureName(killer)) then
if getPlayerGuildId(killer) >= 1 then
for index, creature in ipairs(getGranTowerPlayers()) do
if getPlayerGuildId(creature) ~= getPlayerGuildId(killer) then
doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)), true)
end
end
else
for index, creature in ipairs(getGranTowerPlayers()) do
if getPlayerStorageValue(creature, GRANTOWER.AURA) ~= -1 then
doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)), true)
end              
end
end
if (getPlayerGuildId(killer) >= 1) then
setGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID, getPlayerGuildId(killer))
for index, creature in ipairs(getGranTowerGuild(getPlayerGuildId(killer))) do
setPlayerStorageValue(creature, GRANTOWER.AURA, 1)
end
end
setPlayerStorageValue(killer, GRANTOWER.AURA, 1)
addEvent(changeOutfit, 0, killer)
setGlobalStorageValue(GRANTOWER.SAVELASTWINNER, getCreatureName(killer))
addEvent(doCreateMonster, 2 * 1000, "Gran Tower", GRANTOWER.TOWERPOSITION)
setGlobalStorageValue(GRANTOWER.FINALWINNER, getCreatureName(killer))
setGlobalStorageValue(GRANTOWER.DESTROYCOUNT, (getGlobalStorageValue(GRANTOWER.DESTROYCOUNT) + 1))
doBroadcastMessage("[Gran Tower] The Gran Aura is with "..getCreatureName(killer)..", run to destroy the Grand Tower and take it.")
    end
end
return TRUE
end

 
@zipter98
adicionei a tag no actions também não sei se era para fazer isso e também adicionei action na catapulta usada 460 mas deu alguns erros

[01/03/2015 03:58:40] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:40] in a timer event called from: 
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:40] stack traceback:
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:40] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:40] in a timer event called from: 
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:40] stack traceback:
[01/03/2015 03:58:40] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>
 
[01/03/2015 03:58:41] Lua Script Error: [Action Interface] 
[01/03/2015 03:58:41] in a timer event called from: 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:onUse
 
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: attempt to call global 'getCreatureLookDirection' (a nil value)
[01/03/2015 03:58:41] stack traceback:
[01/03/2015 03:58:41] data/actions/scripts/Fox/catapulta.lua:18: in function <data/actions/scripts/Fox/catapulta.lua:17>

Editado por Komic (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

O erro é exatamente este?

Não tem mais algumas linhas com informações?

 

Porque olhando assim, mesmo não entendendo a base do "lastHitKiller" só parece que deveria remover o "[1]" dele..

Enfim, poste o erro por completo.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

Se você tiver as sources do seu servidor, vá em luascript.cpp e procure por alguma função relacionada a "lookdir" (obviamente você deverá usar CTRL+F).

Se não, na pasta do seu servidor, vá em doc, abra o arquivo LUA_FUNCTIONS e procure por algo relacionado a "lookdir".

Se encontrar algo, informe aqui.

Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

@zipter98 no LUA_FUNCTIONS

getPlayerLookDir(cid)
Info
This function will check player direction.
 
Returns
Player direction.
For example:
0 - player is looking up (north) (/\)
1 - player is looking right (east) (>)
2 - player is looking down (south) (\/)
3 - player is looking left (west) (<)

 
na source

//getPlayerLookDir(cid)
lua_register(m_luaState, "getPlayerLookDir", LuaScriptInterface::luaGetPlayerLookDir);
//doCreatureSetLookDir(cid, dir)
lua_register(m_luaState, "doCreatureSetLookDirection", LuaScriptInterface::luaDoCreatureSetLookDir);
case PlayerInfoLookDirection:
value = player->getDirection();
break;
int32_t LuaScriptInterface::luaGetPlayerLookDir(lua_State* L)
{
return internalGetPlayerInfo(L, PlayerInfoLookDirection);
}
int32_t LuaScriptInterface::luaDoCreatureSetLookDir(lua_State* L)
{
//doCreatureSetLookDir(cid, dir)
Direction dir = (Direction)popNumber(L);
 
ScriptEnviroment* env = getScriptEnv();
if(Creature* creature = env->getCreatureByUID(popNumber(L)))
{
g_game.internalCreatureTurn(creature, dir);
if(Player* player = creature->getPlayer())
player->resetIdleTime();
 
lua_pushnumber(L, LUA_NO_ERROR);
}
else
{
reportErrorFunc(getErrorDesc(LUA_ERROR_CREATURE_NOT_FOUND));
lua_pushnumber(L, LUA_ERROR);
}
return 1;
}

Peguei tudo que tinha em luascript.cpp

 

@Adriano

Consegui arrumar o script da gran tower o erro era nos true e nos false apenas mudei para TRUE e FALSE

nas lib que funcionou  :)

mas quando o player desloga aparece isso

 

[01/03/2015 17:35:13] Lua Script Error: [CreatureScript Interface] 
[01/03/2015 17:35:13] in a timer event called from: 
[01/03/2015 17:35:13] data/creaturescripts/scripts/Gran Tower.lua:onDeath
 
[01/03/2015 17:35:13] luaGetCreatureOutfit(). Creature not found
Editado por Komic (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

local config = {
    lookDirection = "sul",          --Direção que a catapulta está olhando.
    distance = 6,                   --Quantas posições o jogador vai "pular" (só funciona com números pares). Distância máxima: 14.
    directions = {
        ["norte"] = 0,
        ["leste"] = 1,
        ["sul"] = 2,
        ["oeste"] = 3,
    },
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.distance % 2 ~= 0 then
        return doPlayerSendCancel(cid, "Sorry, the catapult isn't available right now.") and print("Trade catapult distance for a odd number.")
    end
    local direction = config.directions[config.lookDirection]
    for i = 1, config.distance do
        addEvent(function()
            if getPlayerLookDir(cid) ~= direction then
                doCreatureSetLookDirection(cid, direction)
            end
            local newPos = getPosByDir(i ~= 1 and getThingPos(cid) or toPosition, direction)
            newPos.z = i <= config.distance / 2 and newPos.z - 1 or newPos.z + 1
            if i < config.distance then
                doAreaCombatHealth(0, 0, newPos, 0, 0, 0, 255)
                doCreateItem(460, 1, newPos)
            end
            doTeleportThing(cid, newPos)
        end, i * 120)
    end
    return true
end

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

@zipter98

script funcionou certinho mas a posição que o player tava ela some o sqm (fica preto sem chão) quando o player é jogado é posivel uma modificação para deixar todas as direções por exemplo sul, norte, leste?

Link para o post
Compartilhar em outros sites

O piso arrumei apenas removi a linha doCreateItem(460, 1, newPos) ai não cria o sqm

 

tag no movements

<movevent type="StepOut" itemid="460" event="script" value="catapulta.lua"/>

 

A modificação é tipo assim tem varias catapultas

 

exemplo

    1\/

2>     <3

    4/\

 

@Edit

isso mesmo uma direção para cada

Editado por Komic (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Você quer uma direção para cada catapulta? É isso?

Sobre o erro, já vi o que é. Logo edito meu comentário com a correção.

Mude o movement para este:

local area = createCombatArea{
    {1, 1, 1}, 
    {1, 2, 1}, 
    {1, 1, 1}, 
}
function onStepIn(cid, item, position, fromPosition)
    doAreaCombatHealth(cid, 3080, getThingPos(cid), area, 0, 0, 255)
    return true
end
function onStepOut(cid, item, position, fromPosition)
    local oldtpos = fromPosition
    oldtpos.stackpos = STACKPOS_GROUND
    if getTileThingByPos(oldtpos).itemid >= 1 then
        doRemoveItem(getTileThingByPos(oldtpos).uid, 1)
    end
    return true
end
Tags:
<movevent type="StepOut" itemid="460" event="script" value="nome_do_arquivo.lua"/>
<movevent type="StepIn" itemid="460" event="script" value="nome_do_arquivo.lua"/>

Action com múltiplas catapultas:

local config = {
    catapults = {
        --[actionid] = "direção",
        [6801] = "sul",
        [6802] = "norte",
    },
    distance = 6,                   --Quantas posições o jogador vai "pular" (só funciona com números pares). Distância máxima: 14.
    directions = {
        ["norte"] = 0,
        ["leste"] = 1,
        ["sul"] = 2,
        ["oeste"] = 3,
    },
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.distance % 2 ~= 0 then
        return doPlayerSendCancel(cid, "Sorry, the catapult isn't available right now.") and print("Trade catapult distance for a odd number.")
    elseif not config.catapults[item.actionid] then
        return doPlayerSendCancel(cid, "Sorry, this catapult isn't available right now.") and print("Catapult without actionid or it isn't configured in table.")
    end
    local direction = config.directions[config.catapults[item.actionid]]
    for i = 1, config.distance do
        addEvent(function()
            if getPlayerLookDir(cid) ~= direction then
                doCreatureSetLookDirection(cid, direction)
            end
            local newPos = getPosByDir(i ~= 1 and getThingPos(cid) or toPosition, direction)
            newPos.z = i <= config.distance / 2 and newPos.z - 1 or newPos.z + 1
            if i < config.distance then
                doAreaCombatHealth(0, 0, newPos, 0, 0, 0, 255)
                doCreateItem(460, 1, newPos)
            end
            doTeleportThing(cid, newPos)
        end, i * 120)
    end
    return true
end
PS: Não se esqueça de registrar os action IDs na tag.
Ex.:
<action actionid="6801;6802" event="script" value="nome_do_arquivo.lua"/>
Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Está certo o script mas elas não está mandando para cada direção apontada

 

@Edit

 

A catapulta agora joga o player para cima e cai no mesmo lugar

Editado por Komic (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

Falta de atenção minha...

Agora sim eu testei. Se não funcionar, bem, você configurou algo errado.

local config = {
    catapults = {
        --[actionid] = "direção",
        [6801] = "sul",
        [6802] = "norte",
    },
    distance = 6,                   --Quantas posições o jogador vai "pular" (só funciona com números pares). Distância máxima: 14.
    directions = {
        ["norte"] = 0,
        ["leste"] = 1,
        ["sul"] = 2,
        ["oeste"] = 3,
    },
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.distance % 2 ~= 0 then
        return doPlayerSendCancel(cid, "Sorry, the catapult isn't available right now.") and print("Trade catapult distance for a odd number.")
    elseif not config.catapults[item.actionid] then
        return doPlayerSendCancel(cid, "Sorry, this catapult isn't available right now.") and print("Catapult without actionid or it isn't configured in table.")
    end
    local direction = config.directions[config.catapults[item.actionid]]
    for i = 1, config.distance do
        addEvent(function()
            if getPlayerLookDir(cid) ~= direction then
                doCreatureSetLookDirection(cid, direction)
            end
            local newPos = getPosByDir(i ~= 1 and getThingPos(cid) or toPosition, direction)
            newPos.z = i <= config.distance / 2 and newPos.z - 1 or newPos.z + 1
            if i < config.distance then
                doAreaCombatHealth(0, 0, newPos, 0, 0, 0, 255)
                doCreateItem(460, 1, newPos)
            end
            doTeleportThing(cid, newPos)
        end, i * 120)
    end
    return true
end

EDIT: Vi acima que você comentou ter removido a linha que cria o void. NÃO remova-a, por favor.

doCreateItem(460, 1, newPos)
Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Na verdade, quando um pedido é resolvido, o tópico não é fechado. Você deve clicar em "melhor resposta" para selecionar qual o comentário que mais lhe ajudou.

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Li seu edit agora

se não remover ele continua criando um sqm preto...

---

foi instalado tudo certo vou deixar sem ele mesmo com um comentário no script.

Editado por Komic (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Você instalou corretamente o movement? Se o void não é removido, provavelmente o sistema foi instalado erroneamente. Além de mim, outras pessoas testaram os códigos e disseram funcionar perfeitamente.

Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites
  • 1 year later...

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo