Ir para conteúdo

Magnus Challenger


Posts Recomendados

  • Administrador

Pra quem não conhece é um sistema de Tasks baseado no Zezenia onde você pode escolher entre tasks de matar monstros ou de coletar certos items para o npc Magnus, um guerreiro famoso da cidade que está atolado de tarefas e precisa da sua ajuda!

Peguei os aspectos que eu julguei serem os principais do modelo do Zezenia e editei com algumas coisas que eu achei que ficariam melhores.
Quem quiser pode ver um vídeo comentado de como o sistema funciona:

 

Dito isso vou ensinar vocês como instalar isso no server:
Pra começar vá em data\creaturescripts\scripts e procure login.lua, agora vá até o final do arquivo e antes do último return true coloque essas linhas abaixo

-------------- TASK SYSTEM --------------
	registerCreatureEvent(cid,"tasksystem")
	if getPlayerStorageValue(cid, 95673) < 0 then
        setPlayerStorageValue(cid, 95673, 0) 
	end
	if getPlayerStorageValue(cid, 95674) < 0 then
        setPlayerStorageValue(cid, 95674, 0) 
	end
	-----------------------------------

Ainda em creaturescripts procure creaturescripts.xml e adicione essa linha junto com as outras que já estão lá (seguindo o padrão)

<!-- TASK SYSTEM -->
<event type="kill" name="tasksystem" script="tasksystem.lua"/>

Agora crie um arquivo em creaturescripts\scripts com o nome de tasksystem.lua e adicione o seguinte à ele:

local storages = {
name = 95672,
count = 95673,
maxcount = 95674,
}

local config = {
partycount = true, --- true ou false pra ativar/desativar que os kills dos membros da party contem pra voce
killdistance = 7 --- distancia que conta os kills
}


function onKill(cid, target, lastHit)
    if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and getCreatureMaster(target) == target and (not(isInParty(cid)) or config.partycount ~= true) then
        if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(cid, storages.name)) then
            setPlayerStorageValue(cid, storages.count, getPlayerStorageValue(cid, storages.count) + 1)
            if getPlayerStorageValue(cid, storages.count) == getPlayerStorageValue(cid, storages.maxcount) then
                doPlayerSendTextMessage(cid, 19, "You finished your task.")
            elseif getPlayerStorageValue(cid, storages.count) < getPlayerStorageValue(cid, storages.maxcount) then
                doPlayerSendTextMessage(cid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(cid, storages.count) .."/".. getPlayerStorageValue(cid, storages.maxcount) .."].")
            end
        end
    elseif isMonster(target) and getCreatureMaster(target) == target and isInParty(cid) and config.partycount == true then
    leader = getPartyLeader(cid)    
    party = getPartyMembers(leader)
        for i = 1, #party do
        pid = party[i]
        if getDistanceBetween(getThingPos(target), getThingPos(pid)) < config.killdistance then
            if getPlayerStorageValue(pid, storages.maxcount) > 3 then
                if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(pid, storages.name)) then
                    setPlayerStorageValue(pid, storages.count, getPlayerStorageValue(pid, storages.count) + 1)
                    if getPlayerStorageValue(pid, storages.count) == getPlayerStorageValue(pid, storages.maxcount) then
                        doPlayerSendTextMessage(pid, 19, "You finished your task.")
                    elseif getPlayerStorageValue(pid, storages.count) < getPlayerStorageValue(pid, storages.maxcount) then
                        doPlayerSendTextMessage(pid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(pid, storages.count) .."/".. getPlayerStorageValue(pid, storages.maxcount) .."].")
                    end
                end
            end    
        end    
        end
    end
return true
end

Terminada a parte da contagem de kill vamos ao NPC em si.
Crie um arquivo chamado Magnus.xml em data\npc e coloque isso dentro dele:

<npc name="Magnus" script="data/npc/scripts/zezeniaa.lua" access="5" lookdir="1">
<health now="1000" max="1000"/>
<look type="134" head="39" body="113" legs="38" feet="0" addons="3"/>
    <parameters>
        <parameter key="message_greet" value="Hello |PLAYERNAME|.I've been wondering if you would never appear.. Are you interested in a {challenge} or you're just looking for your {reward}?" />
    </parameters>
</npc>

Agora em data\npc\scripts crie um arquivo chamado zezeniaa.lua e adicione esse conteúdo dentro do arquivo:

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

-- OTServ event handling functions start
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
-- OTServ event handling functions end

function creatureSayCallback(cid, type, msg)
-- Place all your code in here. Remember that hi, bye and all that stuff is already handled by the npcsystem, so you do not have to take care of that yourself.
if (not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid

-------------------------------- ALL CONFIG CAN BE DONE HERE --------------------------
local short = 100 + (math.random(0,6) * 50) -- quantidade de monstros no curto
local median = 500 + (math.random(0,6) * 50) -- quantidade de monstros no mediano
local long = 1000 + (math.random(0,10) * 100) -- quantidade de monstros no longo

local config = {
levelcollect = 30, --- level pra poder fazer tasks do tipo collect
time = 8 * 60 * 60, --- tempo que vc vai ficar sem poder falar com ele caso abandone uma task (em segundos)
bonus = 1.2, --- bonus de exp/gold caso a task escolhida seja random
multiplicator = 1 --- multiplicador de exp/gold (coloque de acordo com a necessidade do seu server)
}

local easy = {
[1] = "Goblin",
[2] = "Troll",
[3] = "Rotworm",
[4] = "Dwarf",
[5] = "Amazon",
[6] = "Elf",
[7] = "Wolf",
[8] = "Orc",
[9] = "Minotaur"
}

local eacollect = {
[1] = {id = 5880, count = 20}, -- iron ore
[2] = {id = 5902, count = 15}, -- honeycomb
[3] = {id = 5878, count = 10}, -- minotaur leather
[4] = {id = 5890, count = 20}, -- chicken feather
[5] = {id = 5894, count = 15}, -- bat wing
[6] = {id = 5896, count = 10}, -- bear pawn
[7] = {id = 5897, count = 20}, -- wolf pawn
[8] = {id = 5921, count = 15}, -- heaven blossom
[9] = {id = 3956, count = 10} -- elephant tusk
}


local medium = {
[1] = "Cyclops",
[2] = "Ghoul",
[3] = "Dragon",
[4] = "Mammoth",
[5] = "Vampire",
[6] = "Fire Devil",
[7] = "Fire Elemental",
[8] = "Valkyrie",
[9] = "Monk"
}

local medcollect = {
[1] = {id = 5876, count = 35}, -- lizard leather
[2] = {id = 5678, count = 30}, -- tortoise egg
[3] = {id = 5898, count = 25}, -- beholder eye
[4] = {id = 5899, count = 35}, -- turtle shell
[5] = {id = 2229, count = 30}, -- skull
[6] = {id = 5877, count = 25}, -- dragon leather
[7] = {id = 5920, count = 30} -- dragon scale
}

local hard = {
[1] = "Giant Spider",
[2] = "Dragon Lord",
[3] = "Grim Reaper",
[4] = "Demon",
[5] = "Crystal Spider",
[6] = "Demon Skeleton",
[7] = "Juggernaut",
[8] = "Destroyer",
[9] = "Hand of Cursed Fate"
}

local hardcollect = {
[1] = {id = 5882, count = 50}, -- red dragon scale
[2] = {id = 5948, count = 45}, -- red dragon leather
[3] = {id = 5930, count = 40}, -- behemoth claw
[4] = {id = 5879, count = 50}, -- giant spider silk
[5] = {id = 5954, count = 45}, -- demon horn
[6] = {id = 6500, count = 40}, -- demoniac essence
[7] = {id = 5944, count = 45}, -- soul orb
}

local storages = {
name = 95672,
count = 95673,
maxcount = 95674,
difficult = 95675,
length = 95676,
delay = 95677,
type = 95678,
}

local gold = 1000 * ((getPlayerStorageValue(cid, storages.length)) + (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator

local experience = ((getExperienceForLevel(getPlayerLevel(cid) + 1) - getExperienceForLevel(getPlayerLevel(cid))) / 100) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator
-------------------------------- END OF ALL CONFIG --------------------------

local type = getPlayerStorageValue(cid, storages.type)
if (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) <= 0 then

if getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 1 then
talkState[talkUser] = 6
selfSay('Your task is to kill {'..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s}. Hurry with this or you want to {give up}?!', cid)
elseif getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 2 then
talkState[talkUser] = 6
selfSay('Your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Hurry with this or you want to {give up}?!', cid)
else
talkState[talkUser] = 1
selfSay('I have two types of tasks, you want to {kill} monsters or to {collect} some items for me? You can also let me choose a {random} one for you, garanting a final bonus in your reward.', cid)
end
elseif (msgcontains(msg, 'kill') and talkState[talkUser] == 1) then
talkState[talkUser] = 2
setPlayerStorageValue(cid, storages.type, 1)
selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid)
elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) >= config.levelcollect) then
talkState[talkUser] = 2
setPlayerStorageValue(cid, storages.type, 2)
selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid)
elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) < config.levelcollect) then
talkState[talkUser] = 1
selfSay('You can only do collect tasks once you reach level '..config.levelcollect..'.', cid)
------- difficult ---------
elseif (msgcontains(msg, 'random') and talkState[talkUser] == 1) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.type, math.random(1,2))
setPlayerStorageValue(cid, storages.difficult, math.random(2,4) * config.bonus)
setPlayerStorageValue(cid, storages.length, math.random(2,4) * config.bonus)
elseif (msgcontains(msg, 'hard') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 4)
elseif (msgcontains(msg, 'medium') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 3)
elseif (msgcontains(msg, 'easy') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 2)
------- bye ---------
elseif (msgcontains(msg, 'no')) and isInArray({1, 6, 7}, talkState[talkUser]) then
talkState[talkUser] = 0
selfSay('Clearly you are not ready. We can talk later...', cid)
------- length ---------
elseif (msgcontains(msg, 'short') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 2)
elseif (msgcontains(msg, 'median') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 3)
elseif (msgcontains(msg, 'long') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 4)
----------- give up option -----------
elseif (msgcontains(msg, 'give up') and talkState[talkUser] == 6) then
    selfSay('Are you saying that you want to give up this task? I will not give you any other task in the next '.. (config.time/3600) ..' hour(s).', cid)
    talkState[talkUser] = 7
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 7) then
    selfSay('Since you will not help me, get out of here.', cid)
    setPlayerStorageValue(cid, storages.maxcount, 0)
    setPlayerStorageValue(cid, storages.delay, os.time() + config.time)
    talkState[talkUser] = 0
-----------------------
------- checking ---------
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then
local length = getPlayerStorageValue(cid, storages.length)
local difficult = getPlayerStorageValue(cid, storages.difficult)

    if type == 1 then
        if length == 2 then
            setPlayerStorageValue(cid, storages.maxcount, short)
        elseif length == 3 then
            setPlayerStorageValue(cid, storages.maxcount, median)
        else
            setPlayerStorageValue(cid, storages.maxcount, long)
        end

        if difficult == 2 then
            setPlayerStorageValue(cid, storages.name, easy[math.random(1, #easy)])
        elseif difficult == 3 then
            setPlayerStorageValue(cid, storages.name, medium[math.random(1, #medium)])
        else
            setPlayerStorageValue(cid, storages.name, hard[math.random(1, #hard)])
        end

        setPlayerStorageValue(cid, storages.count, 0)    
        talkState[talkUser] = 0
        selfSay('OK then.. your task is to kill '..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s. Do not spare any monster!', cid)
    elseif type == 2 then
        if length == 2 then
            setPlayerStorageValue(cid, storages.maxcount, eacollect[math.random(1, #eacollect)].count)
        elseif length == 3 then
            setPlayerStorageValue(cid, storages.maxcount, medcollect[math.random(1, #medcollect)].count)
        else
            setPlayerStorageValue(cid, storages.maxcount, hardcollect[math.random(1, #hardcollect)].count)
        end

        if difficult == 2 then
            setPlayerStorageValue(cid, storages.name, eacollect[math.random(1, #eacollect)].id)
        elseif difficult == 3 then
            setPlayerStorageValue(cid, storages.name, medcollect[math.random(1, #medcollect)].id)
        else
            setPlayerStorageValue(cid, storages.name, hardcollect[math.random(1, #hardcollect)].id)
        end

        setPlayerStorageValue(cid, storages.count, 0)    
        talkState[talkUser] = 0
        selfSay('OK then.. your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Bring me the proof that you made it!', cid)
    end
        elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then
talkState[talkUser] = 0
selfSay('Ok, come back when you have the guts.', cid)
------- reward ---------
elseif msgcontains(msg, 'reward') then
    if type == 1 then
            if getPlayerStorageValue(cid, storages.count) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then
                selfSay('You finished the quest, now you want to receive your reward in {gold} or in {experience}?', cid)
                talkState[talkUser] = 5
            else
                selfSay('There is no reward for those who did not complete a challenge.', cid)
                talkState[talkUser] = 0
            end
    end
    if type == 2 then
            if getPlayerItemCount(cid, getPlayerStorageValue(cid, storages.name)) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then
                selfSay('You finished the quest, now you want to receive your reward in {gold} or in {experience}?', cid)
                talkState[talkUser] = 5
            else
                selfSay('There is no reward for those who did not complete a challenge.', cid)
                talkState[talkUser] = 0
            end
    elseif (type < 1) then
        selfSay('There is no reward for those who did not complete a challenge.', cid)
        talkState[talkUser] = 0
    end
    ---------- checking rewards ---------------
        elseif (msgcontains(msg, 'gold') and talkState[talkUser] == 5 ) then
            if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then
                for k, v in pairs(storages) do
                    setPlayerStorageValue(cid, v, 0)
                end
                doPlayerAddMoney(cid, gold)
                talkState[talkUser] = 0
                selfSay('Thanks for your help, here is your prize..', cid)
            else
            selfSay('Something went wrong..', cid)
            end
        elseif (msgcontains(msg, 'experience') and talkState[talkUser] == 5) then
            if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then
                for k, v in pairs(storages) do
                    setPlayerStorageValue(cid, v, 0)
                end
                doPlayerAddExperience(cid, experience)
                talkState[talkUser] = 0    
                selfSay('Thanks for your help, here is your prize..', cid)
            else
            selfSay('Something went wrong..', cid)
            end
        ----------------------- msg when blockek --------------
elseif (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) > 0 then
    talkState[talkUser] = 0    
selfSay('I can not trust you since you failed in the last job. You will have to wait until I feel that I can trust you again..', cid)
end
return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
FEITO ISSO ESTÁ TERMINADO

Agora aprendendo a configurar:

 

No tasksystem vc pode editar isso daqui:

Citar

Eu fiz um sistema onde se vc estiver em party com alguém e a pessoa matar os bixos conta como se você tivesse matado; Assim incentiva o pessoal a ir numa cave de Dragon e ao invés de matar quem está lá pra ficar sozinho na cave, eles vão chamar party pra fazerem a task juntos.. assim fazer amigos fica mais fácil e com maiores laços é maior a chance do povo não abandonar o seu server.

Apenas digite "true" ou "false" pra ativar/desativar esse sistema e em baixo temos a distancia máxima pro monstro estar do cara que está fazendo a task pra contar o kill. Se a distancia entre o monstro e a pessoa for maior que 7 não vai contar pra ele a kill.


No zezeniaa.lua as coisas que dão pra configurar são maiores mas são igualmente simples:partycount = true, --- true ou false pra ativar/desativar que os kills dos membros da party contem pra voce
killdistance = 7 --- distancia que conta os kills

 

Citar

Toda vez que vc pedir uma task short (curta) vc vai ter de 100 a 400 monstros pra matar, ele gera um número de 0 a 6 e multiplica por 5 e soma com os 100 iniciais.. o mesmo vale pra todos os outros valores.

Citar

levelcollect é o level mínimo pra fazer tasks do tipo collect.
time é o tempo em segundos que você vai ficar sem poder falar com o npc caso desista de alguma task, o padrão é 8 * 60 * 60 (8 horas)
bonus é por quanto vai multiplicar caso vc permita que o npc escolha aleatoriamente entre todas as opções.. o padrão é 20% de bonus (1.2)
multiplicador é uma coisa que eu adicionei pra ficar mais fácil mexer na fórmula sem cometer cagadas, se vc tá ganhando 10% de exp e quer ganhar 80% é só colocar 8 no multiplicador.

Citar

local easy = {
[1] = "Goblin",
[2] = "Troll",
[3] = "Rotworm",
[4] = "Dwarf",
[5] = "Amazon",
[6] = "Elf",
[7] = "Wolf",
[8] = "Orc",
[9] = "Minotaur"
}

local medium = {
[1] = "Cyclops",
[2] = "Ghoul",
[3] = "Dragon",
[4] = "Mammoth",
[5] = "Vampire",
[6] = "Fire Devil",
[7] = "Fire Elemental",
[8] = "Valkyrie",
[9] = "Monk"
}

local hard = {
[1] = "Giant Spider",
[2] = "Dragon Lord",
[3] = "Grim Reaper",
[4] = "Demon",
[5] = "Crystal Spider",
[6] = "Demon Skeleton",
[7] = "Juggernaut",
[8] = "Destroyer",
[9] = "Hand of Cursed Fate"
}

 

 

local short = 100 + (math.random(0,6) * 50) -- quantidade de monstros no curto
local median = 500 + (math.random(0,6) * 50) -- quantidade de monstros no mediano
local long = 1000 + (math.random(0,10) * 100) -- quantidade de monstros no longo

 

Isso daqui é o banco de dados principal do sistema de kill, toda vez que vc escolher uma task do tipo fácil, médio, dificil ele vai acessar essas tabelas contendo o nome das criaturas.. vc pode facilmente adicionar novos nomes, o npc já está programado pra lidar com isso, apenas siga o padrão e mantenha sempre o último sem vírgula!

Ex: adicionando Morgaroth na tabela de hard

local hard = {
[1] = "Giant Spider",
[2] = "Dragon Lord",
[3] = "Grim Reaper",
[4] = "Demon",
[5] = "Crystal Spider",
[6] = "Demon Skeleton",
[7] = "Juggernaut",
[8] = "Destroyer",
[9] = "Hand of Cursed Fate",
[10] = "Morgaroth"
}

atente-se também pra não repetir o número no index.. se o anterior era [9] use [10].

O restante das tabelas são separadas para o banco de dados das tasks de collect:

Citar

 

 

local eacollect = {
[1] = {id = 5880, count = 20}, -- iron ore
[2] = {id = 5902, count = 15}, -- honeycomb
[3] = {id = 5878, count = 10}, -- minotaur leather
[4] = {id = 5890, count = 20}, -- chicken feather
[5] = {id = 5894, count = 15}, -- bat wing
[6] = {id = 5896, count = 10}, -- bear pawn
[7] = {id = 5897, count = 20}, -- wolf pawn
[8] = {id = 5921, count = 15}, -- heaven blossom
[9] = {id = 3956, count = 10} -- elephant tusk
}

segue a mesma lógica da de kill só que aqui você tem o id dos itens que serão usados... aquela count não tem nada a ver com o item pois ele vai gerar tanto o item aleatoriamente quanto à count;
Ex:

[1] = {id = 5880, count = 20}, -- iron ore

isso não significa que se cair iron ore (id 5880) irá cair sempre 20.. até porque eu poderia escolher uma task long e easy e pegar a task de trazer até 50 iron ores, apenas tente manter os padrões que são os intervalos definidos.
No easy ele varia de 10 a 20, no medium ele varia de 20 a 35 e no hard de 40 a 50.

PS: Pra sumonar o npc digite com o GOD: /n Magnus ou coloque ele pelo map editor.

Créditos: xWhiteWolf

Link para o comentário
Compartilhar em outros sites

  • 6 months later...
  • 5 years later...

Excelente Script Fico Inconformado Como Ninguém Comenta Nada Sobre O Script Só Faltou A Talkaction Falando Quantos Monstros Faltam Rep+

 

Erro Pela Falta Da TalkAction

[23:27:50.129] [Error - TalkAction Interface]
[23:27:50.132] data/talkactions/scripts/creature.lua:onSay
[23:27:50.136] Description:
[23:27:50.139] (LuaInterface::luaDoCreateMonster)

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...