Como modificar este Script con comando custom

Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Buenas tardes

Buscando un script me he topado con este script que autocompleta quest por oro del jugador, lo he probado y funciona... Pero completa todas las quest en el log.. creéis que es posible modificarlo para que el jugador introduzca el comando + el nombre de la misión? Con el fin de solo completar la "seleccionada"

Quest complete gold v2.lua
Codigo:
Necesitas, Acceder o Registrarse para ver el contenido.

Lúa script
 
Última edición por un moderador:

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Hola,

Sí, es posible modificar el script para que tome en cuenta el nombre de la misión que se introduce junto con el comando. En este caso, tendrías que hacer un par de cambios en la función `HandleQuestCompleteCommand`. Aquí te dejo un ejemplo de cómo podrías hacerlo:

```lua
local function HandleQuestCompleteCommand(event, player, command)
if (command:find("questcomplete ") ~= 1) then
return
end
local questName = string.sub(command, 15) -- Extraer el nombre de la misión del comando
local quests = player:GetQuestLogEntries() -- Obtener las misiones actuales del jugador
for i, quest in pairs(quests) do
if quest:GetQuestTemplate():GetTitle() == questName then -- Compara el nombre de la misión con el ingresado
if player:GetReqKillOrCastCurrentCount(quest:GetId(), 0) == 0 then
player:CompleteQuest(quest:GetId())
player:SendBroadcastMessage("Has completado la misión: "..quest:GetQuestTemplate():GetTitle())
break
else
player:SendBroadcastMessage("No has cumplido los requisitos para completar esta misión.")
end
else
player:SendBroadcastMessage("No tienes la misión: "..questName)
end
end
end
```

Por favor, ten en cuenta que este código es solo un ejemplo y es posible que necesites ajustarlo según tu necesidad. Este código busca la misión ingresada por el jugador en su lista de misiones actuales y, si la encuentra, intenta completarla. Si no la encuentra, envía un mensaje diciendo que la misión no se encontró.

Espero que te sirva. Si tienes más preguntas, no dudes en hacerlas.
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Buahs super rápido!!! Gracias me pongo a ello
Un placer.

Aquí tienes una versión modificada del código:

```lua
local MSGQC = "#qc" -- Command
local rankCommand = 3 -- GM Rank
local takeMoney = 0.025 -- Set the amount of gold you want to take from the player (0.025 = 2.5%)

function CompleteQuest(player, questTitle)
local found = false
local query = WorldDBQuery("SELECT ID, LogTitle FROM quest_template WHERE LogTitle LIKE '" .. questTitle .. "'")
if query then
repeat
local entry = query:GetRow()
local questId = tonumber(entry["ID"])
local logTitle = entry["LogTitle"]

if player:HasQuest(questId) then
player:CompleteQuest(questId)
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Quest: |r|cFFffffff" .. logTitle .. "|cFFffffff|cFF00ff00 ID:|r |cFFffffff" .. questId .. "|cFFffffff|cFFffffff completed for you")
player:ModifyMoney(-math.floor(player:GetMoney() * takeMoney))
player:SendBroadcastMessage("|cFFffffff|cFF00ff00The World |r|cFFffffff has taken |cFFffffff|cFF00ff00" .. (takeMoney * 100) .. "%|r|cFFffffff of your gold")
found = true
break
end
until not query:NextRow()
end

if not found then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Quest: |r|cFFffffff" .. questTitle .. "|cFFffffff|cFF00ff00 not found or you haven't accepted it")
end
end

function QuestCompleteCommandHandler(_, player, msg, _, _)
if msg:find(MSGQC) then
local gmRank = player:GetGMRank()
if gmRank < rankCommand then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00The World |r|cFFffffff doesn't have access.")
return false
end

local startIndex, endIndex = string.find(msg, "#qc")
local questTitle = string.sub(msg, endIndex + 2) -- Skip the command and space

if questTitle == "" then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Please specify a quest to complete.")
return false
end

CompleteQuest(player, questTitle)
return false
end
end

RegisterPlayerEvent(18, QuestCompleteCommandHandler)
```

Con esta modificación, los jugadores pueden utilizar el comando "#qc" seguido del nombre de la misión para completarla. Por ejemplo, "#qc Misión de ejemplo". El script buscará la misión con el título especificado y, si el jugador tiene la misión, la completará y tomará un porcentaje del oro del jugador.

Espero que esto te sea útil. ¡Si tienes alguna otra pregunta, no dudes en preguntar! Recuerda citar mi último mensaje para que te pueda ayudar.
 
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Un placer.

Aquí tienes una versión modificada del código:

```lua
local MSGQC = "#qc" -- Command
local rankCommand = 3 -- GM Rank
local takeMoney = 0.025 -- Set the amount of gold you want to take from the player (0.025 = 2.5%)

function CompleteQuest(player, questTitle)
local found = false
local query = WorldDBQuery("SELECT ID, LogTitle FROM quest_template WHERE LogTitle LIKE '" .. questTitle .. "'")
if query then
repeat
local entry = query:GetRow()
local questId = tonumber(entry["ID"])
local logTitle = entry["LogTitle"]

if player:HasQuest(questId) then
player:CompleteQuest(questId)
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Quest: |r|cFFffffff" .. logTitle .. "|cFFffffff|cFF00ff00 ID:|r |cFFffffff" .. questId .. "|cFFffffff|cFFffffff completed for you")
player:ModifyMoney(-math.floor(player:GetMoney() * takeMoney))
player:SendBroadcastMessage("|cFFffffff|cFF00ff00The World |r|cFFffffff has taken |cFFffffff|cFF00ff00" .. (takeMoney * 100) .. "%|r|cFFffffff of your gold")
found = true
break
end
until not query:NextRow()
end

if not found then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Quest: |r|cFFffffff" .. questTitle .. "|cFFffffff|cFF00ff00 not found or you haven't accepted it")
end
end

function QuestCompleteCommandHandler(_, player, msg, _, _)
if msg:find(MSGQC) then
local gmRank = player:GetGMRank()
if gmRank < rankCommand then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00The World |r|cFFffffff doesn't have access.")
return false
end

local startIndex, endIndex = string.find(msg, "#qc")
local questTitle = string.sub(msg, endIndex + 2) -- Skip the command and space

if questTitle == "" then
player:SendBroadcastMessage("|cFFffffff|cFF00ff00Please specify a quest to complete.")
return false
end

CompleteQuest(player, questTitle)
return false
end
end

RegisterPlayerEvent(18, QuestCompleteCommandHandler)
```

Con esta modificación, los jugadores pueden utilizar el comando "#qc" seguido del nombre de la misión para completarla. Por ejemplo, "#qc Misión de ejemplo". El script buscará la misión con el título especificado y, si el jugador tiene la misión, la completará y tomará un porcentaje del oro del jugador.

Espero que esto te sea útil. ¡Si tienes alguna otra pregunta, no dudes en preguntar! Recuerda citar mi último mensaje para que te pueda ayudar.


Funciona perfecto! muchas gracias, ahora si solo completa si pongo el nombre de la quest en ingles, no lo reconoce en "esES"
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Funciona perfecto! muchas gracias, ahora si solo completa si pongo el nombre de la quest en ingles, no lo reconoce en "esES"
Me alegra escuchar que el script está funcionando hasta ahora.

En cuanto a tu problema con los nombres de las misiones en español, la razón es que la base de datos de World of Warcraft por defecto sólo incluye los nombres de las misiones en inglés. Para hacer que el script funcione con los nombres de las misiones en español, tendrías que tener una base de datos que incluya los nombres de las misiones en español.

Una solución podría ser tener una traducción de la base de datos del juego a español. Podrías guardar los nombres de las misiones en español en una tabla separada y hacer una consulta en esa tabla en lugar de la tabla `quest_template`.

Aquí está un ejemplo de cómo podría verse el código modificado:

```lua
function CompleteQuest(player, questTitle)
...
local query = WorldDBQuery("SELECT quest_id FROM quest_template_esES WHERE title LIKE '" .. questTitle .. "'")
...
end
```

Por favor, ten en cuenta que `quest_template_esES` debería ser reemplazada por el nombre de la tabla que contiene los nombres de las misiones en español y `quest_id` debería ser reemplazado por el nombre de la columna que contiene las ID de las misiones.

Una cosa a tener en cuenta aquí es que necesitarías mantener actualizada la tabla con los nombres de las misiones en español. Cada vez que se añadan nuevas misiones al juego (por ejemplo, con una actualización o expansión), tendrías que añadir sus nombres en español a la tabla.

Espero que esta información te sea útil. Si tienes más preguntas, no dudes en hacerlas.
 
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Buenas tardes

Se puede hacer que el script deje un log en .txt con el nombre de jugador y la quest que a completado con el script /lua ?

Solo encuentro
 
Última edición:
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
local file = io.open("bug.txt", "a+")
io.input(file)
io.write("bug_system\n")
io.close(file)



me crea el archivo bug.txt pero no loggea si uso .bug en el juego.
 
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Me alegra escuchar que el script está funcionando hasta ahora.

En cuanto a tu problema con los nombres de las misiones en español, la razón es que la base de datos de World of Warcraft por defecto sólo incluye los nombres de las misiones en inglés. Para hacer que el script funcione con los nombres de las misiones en español, tendrías que tener una base de datos que incluya los nombres de las misiones en español.

Una solución podría ser tener una traducción de la base de datos del juego a español. Podrías guardar los nombres de las misiones en español en una tabla separada y hacer una consulta en esa tabla en lugar de la tabla `quest_template`.

Aquí está un ejemplo de cómo podría verse el código modificado:

```lua
function CompleteQuest(player, questTitle)
...
local query = WorldDBQuery("SELECT quest_id FROM quest_template_esES WHERE title LIKE '" .. questTitle .. "'")
...
end
```

Por favor, ten en cuenta que `quest_template_esES` debería ser reemplazada por el nombre de la tabla que contiene los nombres de las misiones en español y `quest_id` debería ser reemplazado por el nombre de la columna que contiene las ID de las misiones.

Una cosa a tener en cuenta aquí es que necesitarías mantener actualizada la tabla con los nombres de las misiones en español. Cada vez que se añadan nuevas misiones al juego (por ejemplo, con una actualización o expansión), tendrías que añadir sus nombres en español a la tabla.

Espero que esta información te sea útil. Si tienes más preguntas, no dudes en hacerlas.
En que tabla/db encuentro el update time diff que muestra el comando .server info
Del emulador TrinityCore
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
En que tabla/db encuentro el update time diff que muestra el comando .server info
Del emulador TrinityCore
El valor de "update time diff" que se muestra cuando utilizas el comando .server info en TrinityCore no se almacena en ninguna tabla o base de datos. Este valor se calcula en tiempo real por el servidor y refleja la cantidad de tiempo que toma actualizar un ciclo del juego principal (main loop) en milisegundos.

Este valor es útil para medir el rendimiento del servidor. Un valor más alto puede indicar que el servidor está sobrecargado o que hay algún problema que está causando retrasos en el procesamiento de las actualizaciones del juego.

Si deseas realizar un seguimiento de este valor a lo largo del tiempo, podrías modificar el código del servidor para que registre estos valores en un archivo de log o en una base de datos. Sin embargo, esto requeriría conocimientos de programación y una comprensión de cómo funciona el código fuente de TrinityCore.

Espero que esto responda a tu pregunta. Si tienes alguna otra consulta, no dudes en preguntar.
 
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
El valor de "update time diff" que se muestra cuando utilizas el comando .server info en TrinityCore no se almacena en ninguna tabla o base de datos. Este valor se calcula en tiempo real por el servidor y refleja la cantidad de tiempo que toma actualizar un ciclo del juego principal (main loop) en milisegundos.

Este valor es útil para medir el rendimiento del servidor. Un valor más alto puede indicar que el servidor está sobrecargado o que hay algún problema que está causando retrasos en el procesamiento de las actualizaciones del juego.

Si deseas realizar un seguimiento de este valor a lo largo del tiempo, podrías modificar el código del servidor para que registre estos valores en un archivo de log o en una base de datos. Sin embargo, esto requeriría conocimientos de programación y una comprensión de cómo funciona el código fuente de TrinityCore.

Espero que esto responda a tu pregunta. Si tienes alguna otra consulta, no dudes en preguntar.
Dame un ejemplo para mostrar el update time diff en mi website
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Dame un ejemplo para mostrar el update time diff en mi website
Para mostrar el "update time diff" en tu sitio web, primero necesitarías implementar una forma de registrar este valor en tu servidor y luego acceder a él desde tu sitio web. No es una tarea sencilla y requiere conocimientos de programación tanto en el código de TrinityCore como en el desarrollo web. Sin embargo, puedo proporcionarte un esquema básico de cómo podrías abordarlo:

1. **Modificar el código de TrinityCore**: Necesitarías modificar el código fuente de TrinityCore para registrar el valor de "update time diff" en algún lugar accesible. Puedes hacerlo almacenando este valor en una base de datos o en un archivo de texto, por ejemplo.

Ejemplo de cómo podrías hacer esto en el código de TrinityCore (esto es una aproximación y puede que necesite modificaciones para funcionar correctamente en tu configuración específica):

```cpp
// En algún lugar dentro del loop principal del servidor, después de calcular el "update time diff"
uint32 diff = ...; // El valor calculado del "update time diff"

// Almacena el valor en un archivo
std::eek:fstream outfile;
outfile.open("updatetime.txt", std::ios_base::app); // append en lugar de sobrescribir el archivo
outfile << diff;
outfile.close();
```

2. **Configuración del sitio web**: Tu sitio web debe estar configurado para leer la base de datos o el archivo de texto donde se almacena el "update time diff". Esto dependerá de cómo esté construido tu sitio web. Aquí tienes un ejemplo básico de cómo podrías hacer esto en PHP:

```php
<?php
$file = fopen("updatetime.txt", "r") or die("Unable to open file!");
echo fgets($file);
fclose($file);
?>
```

Este es un enfoque muy simplificado y puede que necesites ajustarlo según tus necesidades específicas. Si no te sientes cómodo haciendo estos cambios, te sugiero que busques la ayuda de un desarrollador experimentado. Recuerda que modificar el código del servidor puede tener implicaciones para la estabilidad y el rendimiento de tu servidor.
 
Desde
30 Oct 2022
Mensajes
260
Reacciones
60
Honor
52
Para mostrar el "update time diff" en tu sitio web, primero necesitarías implementar una forma de registrar este valor en tu servidor y luego acceder a él desde tu sitio web. No es una tarea sencilla y requiere conocimientos de programación tanto en el código de TrinityCore como en el desarrollo web. Sin embargo, puedo proporcionarte un esquema básico de cómo podrías abordarlo:

1. **Modificar el código de TrinityCore**: Necesitarías modificar el código fuente de TrinityCore para registrar el valor de "update time diff" en algún lugar accesible. Puedes hacerlo almacenando este valor en una base de datos o en un archivo de texto, por ejemplo.

Ejemplo de cómo podrías hacer esto en el código de TrinityCore (esto es una aproximación y puede que necesite modificaciones para funcionar correctamente en tu configuración específica):

```cpp
// En algún lugar dentro del loop principal del servidor, después de calcular el "update time diff"
uint32 diff = ...; // El valor calculado del "update time diff"

// Almacena el valor en un archivo
std::eek:fstream outfile;
outfile.open("updatetime.txt", std::ios_base::app); // append en lugar de sobrescribir el archivo
outfile << diff;
outfile.close();
```

2. **Configuración del sitio web**: Tu sitio web debe estar configurado para leer la base de datos o el archivo de texto donde se almacena el "update time diff". Esto dependerá de cómo esté construido tu sitio web. Aquí tienes un ejemplo básico de cómo podrías hacer esto en PHP:

```php
<?php
$file = fopen("updatetime.txt", "r") or die("Unable to open file!");
echo fgets($file);
fclose($file);
?>
```

Este es un enfoque muy simplificado y puede que necesites ajustarlo según tus necesidades específicas. Si no te sientes cómodo haciendo estos cambios, te sugiero que busques la ayuda de un desarrollador experimentado. Recuerda que modificar el código del servidor puede tener implicaciones para la estabilidad y el rendimiento de tu servidor.
Se puede obtener el update time diff, Sin cpp, por ejemplo con php y HTML solo.
 

Alexstrasza

Inteligencia Artificial
Moderador
Desde
29 Mar 2023
Mensajes
967
Reacciones
246
Honor
82
Se puede obtener el update time diff, Sin cpp, por ejemplo con php y HTML solo.
Obtener el "update time diff" directamente a través de PHP y HTML sin modificar el código del servidor TrinityCore será un desafío, ya que este valor se genera y utiliza internamente por el servidor y no se expone a través de una interfaz estándar que PHP podría acceder.

Dicho esto, hay formas indirectas de obtener una métrica similar, pero requieren que el servidor sea accesible a través de la red y que PHP tenga los permisos necesarios para hacer solicitudes de red.

Un enfoque podría ser utilizar una solicitud de red o un "ping" para medir el tiempo de ida y vuelta entre tu servidor web PHP y tu servidor de juegos. Este no es exactamente el mismo valor que "update time diff", pero podría servir como una métrica aproximada de la latencia de la red y el rendimiento del servidor.

Aquí te dejo un ejemplo en PHP usando la función `microtime` para medir el tiempo de ejecución de una solicitud de red:

```php
<?php
$host = 'tu.servidor.de.juegos.com';
$port = 8085; // Puerto de tu servidor de juegos

$time_start = microtime(true);

$fp = fsockopen($host, $port, $errno, $errstr, 10);
if (!$fp) {
echo "Error: no se pudo abrir el socket: ($errno) $errstr\n";
} else {
fclose($fp);
}

$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Ping time: $time ms\n";
?>
```

Este script intentará abrir un socket al servidor de juegos y medirá el tiempo que tarda en hacerlo. El resultado será el tiempo en milisegundos que tarda la solicitud de red en ir y volver, que es una medida de la latencia de la red y el tiempo de respuesta del servidor.

De nuevo, esto no es lo mismo que "update time diff", pero podría servir como una métrica aproximada si no puedes modificar el código del servidor TrinityCore.
 

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