Se puede hacer esto en lua script tele transporte

Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Buenas noches, estoy con este lua script que detecta si un jugador hace un tele transporte no legitimo en el juego, hasta este momento esta funcionado sin error, si se usa algún tele-port con programa externo o por comando GM devuelve a su posición anterior (portback) , también he conseguido que excluya el tele transporte del buscador de mazmorra, lo que me falta es que el jugador pueda usar objetos del juego sin que se detecte como "ilegitimo"

no me da resultado player:
IsUsingObject
IsUsingItem
IsChanneling

como puedo hacer que detecte el uso de un objeto y lo reconoza como legitimo.


Codigo:
Necesitas, Acceder o Registrarse para ver el contenido.
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Para que el sistema reconozca el uso de objetos como un teletransporte legítimo, necesitará una forma de rastrear cuándo un jugador está utilizando un objeto de teletransporte. El rastreo puede ser complicado ya que no hay un método incorporado para detectar el uso de un objeto en particular.

Podría intentar modificar su función `IsLegitimateTeleport` para que también verifique si el jugador ha utilizado recientemente un objeto de teletransporte.

Por ejemplo, podría agregar una tabla adicional para almacenar la última vez que cada jugador utilizó un objeto de teletransporte. Cuando detecta un teletransporte, podría comprobar si el jugador ha utilizado un objeto de teletransporte en los últimos segundos. Si es así, considera el teletransporte como legítimo.

El pseudocódigo podría verse así:

```lua
local playerLastUsedTeleportItem = {}

local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
local lastUsed = playerLastUsedTeleportItem[playerGUID]

-- Si el jugador ha utilizado un objeto de teletransporte en los últimos segundos, considerarlo legítimo
if (lastUsed and (GetGameTime() - lastUsed) < 10) then
return true
end

return false
end

-- Luego, necesitará una forma de actualizar `playerLastUsedTeleportItem` cada vez que un jugador utiliza un objeto de teletransporte. Como no existe tal evento en el núcleo de TrinityCore, podrías necesitar un parche personalizado o un módulo para hacerlo.
```
Tiene que tener en cuenta que este enfoque no es perfecto. Si un jugador utiliza un objeto de teletransporte y luego inmediatamente se teletransporta ilegalmente, el sistema lo considerará como un teletransporte legítimo. Para reducir la posibilidad de este escenario, podría intentar reducir el intervalo de tiempo en el que se considera legítimo el uso del objeto de teletransporte.
 
Upvote 0
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Para que el sistema reconozca el uso de objetos como un teletransporte legítimo, necesitará una forma de rastrear cuándo un jugador está utilizando un objeto de teletransporte. El rastreo puede ser complicado ya que no hay un método incorporado para detectar el uso de un objeto en particular.

Podría intentar modificar su función `IsLegitimateTeleport` para que también verifique si el jugador ha utilizado recientemente un objeto de teletransporte.

Por ejemplo, podría agregar una tabla adicional para almacenar la última vez que cada jugador utilizó un objeto de teletransporte. Cuando detecta un teletransporte, podría comprobar si el jugador ha utilizado un objeto de teletransporte en los últimos segundos. Si es así, considera el teletransporte como legítimo.

El pseudocódigo podría verse así:

```lua
local playerLastUsedTeleportItem = {}

local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
local lastUsed = playerLastUsedTeleportItem[playerGUID]

-- Si el jugador ha utilizado un objeto de teletransporte en los últimos segundos, considerarlo legítimo
if (lastUsed and (GetGameTime() - lastUsed) < 10) then
return true
end

return false
end

-- Luego, necesitará una forma de actualizar `playerLastUsedTeleportItem` cada vez que un jugador utiliza un objeto de teletransporte. Como no existe tal evento en el núcleo de TrinityCore, podrías necesitar un parche personalizado o un módulo para hacerlo.
```
Tiene que tener en cuenta que este enfoque no es perfecto. Si un jugador utiliza un objeto de teletransporte y luego inmediatamente se teletransporta ilegalmente, el sistema lo considerará como un teletransporte legítimo. Para reducir la posibilidad de este escenario, podría intentar reducir el intervalo de tiempo en el que se considera legítimo el uso del objeto de teletransporte.
Simplemente debe reconocer si el jugador esta usando un objeto o item para efectuar el tele tranporte, por ejemplo: portales, piedra de hogar etc
 
Upvote 0

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Simplemente debe reconocer si el jugador esta usando un objeto o item para efectuar el tele tranporte, por ejemplo: portales, piedra de hogar etc
Entiendo. En ese caso, necesitarás interceptar el evento de uso de objeto, y luego verificar si el objeto usado es un elemento de teletransporte permitido. El problema es que la API de Lua en WoW no proporciona un método específico para interceptar el uso de objeto o item.

Quizás puedas intentar con la API `OnUse` que se activa cuando un jugador usa un objeto. Sin embargo, esta API no está disponible en el contexto de scripts Lua en TrinityCore y requeriría un módulo de C++ personalizado para exponerla a Lua.

Aquí hay un pseudocódigo de cómo se vería esto:

```lua
-- La lista de ID de objetos de teletransporte permitidos
local allowedTeleportItems = { [6948] = true, -- Piedra de hogar
[110560] = true, -- Piedra de hogar de la ciudadela
-- Agregue más ID de objetos aquí
}

-- Función para verificar si el movimiento es legítimo
local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
-- Asumamos que playerLastUsedItem es una tabla que almacena el último objeto usado por cada jugador
local lastUsedItem = playerLastUsedItem[playerGUID]

-- Si el último objeto utilizado es un objeto de teletransporte permitido
if lastUsedItem and allowedTeleportItems[lastUsedItem] then
return true
end

return false
end

-- Necesitarías interceptar el evento "OnUse" (esto requeriría un módulo de C++ personalizado)
function OnUse(event, player, item, spell, skipCheck)
local playerGUID = player:GetGUIDLow()
-- Almacene el ID del objeto que el jugador acaba de usar
playerLastUsedItem[playerGUID] = item:GetEntry()
end
```

Lamentablemente, el manejo de eventos de uso de objeto no es tan simple en la API Lua de WoW y requeriría alguna personalización en el lado del servidor, o tal vez un enfoque completamente diferente. Es posible que desees considerar buscar la ayuda de un desarrollador de TrinityCore experimentado o preguntar en los foros de TrinityCore para obtener más ayuda.
 
Upvote 0
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Entiendo. En ese caso, necesitarás interceptar el evento de uso de objeto, y luego verificar si el objeto usado es un elemento de teletransporte permitido. El problema es que la API de Lua en WoW no proporciona un método específico para interceptar el uso de objeto o item.

Quizás puedas intentar con la API `OnUse` que se activa cuando un jugador usa un objeto. Sin embargo, esta API no está disponible en el contexto de scripts Lua en TrinityCore y requeriría un módulo de C++ personalizado para exponerla a Lua.

Aquí hay un pseudocódigo de cómo se vería esto:

```lua
-- La lista de ID de objetos de teletransporte permitidos
local allowedTeleportItems = { [6948] = true, -- Piedra de hogar
[110560] = true, -- Piedra de hogar de la ciudadela
-- Agregue más ID de objetos aquí
}

-- Función para verificar si el movimiento es legítimo
local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
-- Asumamos que playerLastUsedItem es una tabla que almacena el último objeto usado por cada jugador
local lastUsedItem = playerLastUsedItem[playerGUID]

-- Si el último objeto utilizado es un objeto de teletransporte permitido
if lastUsedItem and allowedTeleportItems[lastUsedItem] then
return true
end

return false
end

-- Necesitarías interceptar el evento "OnUse" (esto requeriría un módulo de C++ personalizado)
function OnUse(event, player, item, spell, skipCheck)
local playerGUID = player:GetGUIDLow()
-- Almacene el ID del objeto que el jugador acaba de usar
playerLastUsedItem[playerGUID] = item:GetEntry()
end
```

Lamentablemente, el manejo de eventos de uso de objeto no es tan simple en la API Lua de WoW y requeriría alguna personalización en el lado del servidor, o tal vez un enfoque completamente diferente. Es posible que desees considerar buscar la ayuda de un desarrollador de TrinityCore experimentado o preguntar en los foros de TrinityCore para obtener más ayuda.
no es viable, hay demasiadas ids de portales y objetos / items que puedes tele transportarte en el juego, simplemente permite el uso de cualquier objeto o item que utiliza el jugador
 
Upvote 0

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
no es viable, hay demasiadas ids de portales y objetos / items que puedes tele transportarte en el juego, simplemente permite el uso de cualquier objeto o item que utiliza el jugador
Entiendo tu punto, quieres que cualquier uso de objetos para teletransportarse sea considerado legítimo, no solo aquellos con ciertas IDs.

Desafortunadamente, TrinityCore y la API Lua no proporcionan un método directo para verificar si un objeto que se ha usado es un objeto de teletransporte. Sin embargo, como una solución alternativa, podrías intentar marcar a un jugador como 'legítimamente teletransportado' durante un corto período de tiempo después de que usa cualquier objeto o item.

Aquí un pseudocódigo de cómo se podría ver:

```lua
local playerUsedItem = {}

local function OnItemUsed(event, player, item, spell, skipCheck)
local playerGUID = player:GetGUIDLow()
-- Marca al jugador por un corto tiempo después de usar un objeto
playerUsedItem[playerGUID] = GetGameTime()
end

local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
local lastUsed = playerUsedItem[playerGUID]

-- Si el jugador usó un objeto hace menos de 5 segundos, considéralo legítimo
if (lastUsed and (GetGameTime() - lastUsed) < 5) then
return true
end

return false
end
```

Por favor, ten en cuenta que esto es solo un ejemplo y que, como mencioné antes, TrinityCore no proporciona una forma nativa de interceptar el uso de objetos en Lua, necesitarías un módulo C++ personalizado para exponer tal funcionalidad. Te recomendaría que consultes con los desarrolladores de TrinityCore para obtener más orientación sobre cómo implementar esto.
 
Upvote 0
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Entiendo tu punto, quieres que cualquier uso de objetos para teletransportarse sea considerado legítimo, no solo aquellos con ciertas IDs.

Desafortunadamente, TrinityCore y la API Lua no proporcionan un método directo para verificar si un objeto que se ha usado es un objeto de teletransporte. Sin embargo, como una solución alternativa, podrías intentar marcar a un jugador como 'legítimamente teletransportado' durante un corto período de tiempo después de que usa cualquier objeto o item.

Aquí un pseudocódigo de cómo se podría ver:

```lua
local playerUsedItem = {}

local function OnItemUsed(event, player, item, spell, skipCheck)
local playerGUID = player:GetGUIDLow()
-- Marca al jugador por un corto tiempo después de usar un objeto
playerUsedItem[playerGUID] = GetGameTime()
end

local function IsLegitimateTeleport(player)
local playerGUID = player:GetGUIDLow()
local lastUsed = playerUsedItem[playerGUID]

-- Si el jugador usó un objeto hace menos de 5 segundos, considéralo legítimo
if (lastUsed and (GetGameTime() - lastUsed) < 5) then
return true
end

return false
end
```

Por favor, ten en cuenta que esto es solo un ejemplo y que, como mencioné antes, TrinityCore no proporciona una forma nativa de interceptar el uso de objetos en Lua, necesitarías un módulo C++ personalizado para exponer tal funcionalidad. Te recomendaría que consultes con los desarrolladores de TrinityCore para obtener más orientación sobre cómo implementar esto.
no funciona.
 
Upvote 0

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
no funciona.
Lamento escuchar que la solución propuesta no funcione. La detección de uso de objetos y su identificación como un teletransporte legítimo es una funcionalidad compleja que puede no ser completamente soportada por la API de TrinityCore Lua.

Para lograr esto, probablemente necesites crear un módulo de extensión C++ para TrinityCore que agregue la funcionalidad necesaria. Esto podría incluir la exposición de eventos `OnUse` para el uso de objetos y la identificación de si un objeto causa un teletransporte.

Una vez que tienes esta funcionalidad en C++, podrías exponerla a Lua y utilizarla en tus scripts. Este trabajo podría requerir conocimientos de C++ y del código base de TrinityCore.

Alternativamente, si hay ciertos objetos de teletransporte que son particularmente problemáticos, podrías considerar deshabilitarlos o modificar su comportamiento en el servidor para que no interfieran con tu detección de teletransporte.

Lamentablemente, no puedo proporcionarte un código exacto para hacer esto ya que dependerá fuertemente de tu configuración específica y de cómo estés ejecutando tu servidor de WoW. Te recomendaría que busques la ayuda de desarrolladores de TrinityCore experimentados o que te comuniques en foros dedicados a TrinityCore para obtener un consejo más específico y detallado sobre tu situación.
 
Upvote 0
Desde
12 Sep 2021
Mensajes
109
Reacciones
131
Honor
67
Normalmente al un jugador teletransportarse por los medios comunes del juego se les pone en true unas variable booleanas privadas de la clase Player comúnmente llamadas mSemaphoreTeleport_Near para cuando es un teleport a distancias cortas como blinks y ese estilo de spells o mSemaphoreTeleport_Far para cuando es un teleport a largas distancias. Existe un método de Player generalmente llamado IsBeingTeleported() que devuelve true si alguna de ambas variables es verdadera (el jugador se está teletransportando). Es decir si esa función devuelve false y el jugador ha hecho alguna especie de teletransportación se podría considerar 'ilegal'.

Después de decir el funcionamiento y teniendo en cuenta que siempre que un teleport que sea por vías 'legales' el core le cambiará dichas variables, mis recomendaciones serían: Si prefieres hacerlo en LUA y no tienes acceso al método IsBeingTeleported() que le añadas el soporte en core y ya podrás tenerlo de ahora en adelante en LUA, o de lo contrario deberás hacerlo directo en core.

PD: Debes tener en cuenta cómo calculas que el jugador está siendo teletransportado ya que ciertos spell pueden mover el jugador distancias considerables sin necesariamente ser un teleport. Ejemplo los spells con los distintos efectos de "JUMP".
 
Última edición:
Upvote 0

Crea una cuenta o inicia sesión para comentar

Debes ser usuario para poder dejar un comentario.

¡Regístrate!

Crea una cuenta en nuestra comunidad. ¡Es fácil!

Acceder

¿Ya tienes una cuenta? Accede aquí

4,411Temas
29,500Mensajes
17,849Usuarios
mesias192000Último usuario
Top