Histórico de Curtidas
-
Guilherme. recebeu reputação de DennyOwnz em Adicionando novas Sprites no TibiaOlá Kingtibianos,
Galera eu vi que tinha muita gente querendo saber como colocar novos sprites no servidor, até achei alguns tutoriais mas não tinham imagens e eram muito vagos, então resolvi montar esse bem explicado e com imagens para facilitar o entendimento de vocês.
Inicio:
- Neste tutorial, você irá aprender como extrair, modificar e comilar o arquivo Tibia.spr.
• Vamos trocar esse sprite -
• Por esse -
1º Passo - Donwload e Instalação;
- Após baixar o SprEditor extraia ele para uma pasta a sua escolha .
- Após extrair vá na pasta do seu Tibia e copie o arquivo Tibia.spr para a mesma pasta onde esta o SprEditor.
2º Passo - Conhecendo o programa;
- Para extrair as imagens do arquivo Tibia.spr clique em "Extract" e para compilar as imagens *.Bmp para *.Spr clique em "Compile";
3º Passo - Extraindo;
- No programa clique em "Extract"
- Agora note q foi criada uma pasta chamada "Sprites" contendo todas as imagens.
4º Passo - Imagens e suas Propriedades;
- Para mudar as imagens abra a pasta "Sprites" e note que as imagens são todas 32x32 e tem extenção *.Bmp.
- A cor rosa nas imagens indica transparência.
- Agora mude a imagen sem ultrapassar o limite de tamanho (32x32).
- Depois de mudar e salvar as imagens que voce quiser vamos para o quinto passo;
5º Passo - Compilando;
- Agora va no programa e clique em "Compile" e espere o processo terminar.
- Perceba que ja esta sendo criado um arquivo chamado "MyTibia.spr"
Pronto agora voce ja tem seu Tibia.spr editado e compilado pronto para usar!
:great:
PS: Comentem e digam o que acharam!
-
Guilherme. recebeu reputação de Mathias Silva em [CreatureEvent] Rank MilitarOlá galerinha do Tibia King !
Hoje vim trazer para vocês um MOD que achei muito foda.
O script atribui um 'rank' militar ao player que tem certa quantidade de frags, é parecido com o REP System, bom agora vamos aos 'finalmente' !
Primeiro entre em /mods/ e crie um arquivo com o nome de ranks.xml agora coloque o código abaixo, salve e feche o arquivo.
Você pode editar facilmente o nome do Rank e a quantidade de Frags necessários para obtelo seguindo o padrão:
[1] - Quantidade de Frags
"Private First Class" - Nome do Rank
<?xml version = "1.0" encoding = "UTF-8"?> <mod name = "Military Ranks" version = "1.0" author = "Teckman" enabled = "yes"> <config name = "ranks"><![CDATA[ titles = { [5] = "Private First Class", [10] = "Specialist", [15] = "Corporal", [20] = "Sergeant", [25] = "Staff Sergeant", [30] = "Sergeant First Class", [35] = "Master Sergeant", [40] = "First Sergeant", [45] = "Sergeant Major", [50] = "Command Sergeant Major", [55] = "Sergeant Major of the Army", [60] = "Second Lieutenant", [65] = "First Lieutenant", [70] = "Captain", [75] = "Major", [80] = "Lieutenant Colonel", [90] = "Colonel", [100] = "Brigadier General", [110] = "Major General", [120] = "Lieutenant General", [140] = "General", [170] = "General of the Army" } fragsStorage = 600 ]]></config> <event type = "look" name = "ranksLook" event = "script"><![CDATA[ domodlib("ranks") function onLook(cid, thing, position, lookDistance) if(isPlayer(thing.uid)) then local rank = {rank = "Private", frags = 0} for k, v in pairs(titles) do if(math.max(0, getPlayerStorageValue(thing.uid, fragsStorage)) > k - 1) then if(k - 1 > rank.frags) then rank.rank, rank.frags = v, k - 1 end end end doPlayerSetSpecialDescription(thing.uid, "\n Military rank: " .. rank.rank) end return true end ]]></event> <event type = "kill" name = "ranksKill" event = "script"><![CDATA[ domodlib("ranks") function onKill(cid, target) if(isPlayer(target)) then setPlayerStorageValue(cid, fragsStorage, math.max(0, getPlayerStorageValue(cid, fragsStorage) + 1)) if(titles[getPlayerStorageValue(cid, fragsStorage)]) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You advanced to military rank: " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. ". Congratulations " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. "!") end end return true end ]]></event> <event type = "login" name = "ranksLogin" event = "script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "ranksKill") registerCreatureEvent(cid, "ranksLook") return true end ]]></event> </mod>
Os créditos do script vão para Teckman;
-
Guilherme. recebeu reputação de poko360 em [GlobalEvent] Estações do AnoOlá galera, vim trazer mais um maravilhoso e criativo script do Teckman.
*OBS; O Script não contém todos os items para todas as estações.
Funciona assim: Quando você abrir o server ele irá substituir os items de acordo com as estações do ano, por exemplo, vai substituir as árvores por árvores de neve, pedras por pedras de neve, e assim por diante.
O Script vai ser executado logo que o server ligar pois ocupa muito do CPU e da memória RAM, mas apenas para grandes mapas e por pouco tempo.
Entre em /globalevents/scripts/ e então crie o arquivo seasons.lua, coloque o código abaixo no arquivo, salve e feche.
local config = { areas = { [1] = { {x = 954, y = 1001, z = 7}, {x = 992, y = 1026, z = 7} } }, items = { ["winter"] = { [2700] = 2698, -- fir tree [2705] = 8139, -- pear tree [2703] = 2697, -- plum tree [2704] = 7020, -- red maple [2706] = 7071, -- yellow maple [2701] = 2698, -- sycamore [2707] = 7022, -- beech [2708] = 7020, -- poplar [2711] = 7021, -- dwarf tree [2712] = 7023, -- pine [4526] = 6580, -- grass [4527] = 6581, -- grass [4528] = 6582, -- grass [4529] = 6583, -- grass [4530] = 6584, -- grass [4531] = 6585, -- grass [4532] = 6586, -- grass [4533] = 6587, -- grass [4534] = 6588, -- grass [4535] = 6589, -- grass [4536] = 6590, -- grass [4537] = 6591, -- grass [4538] = 6592, -- grass [4539] = 6593, -- grass [4540] = 6580, -- grass [4541] = 6580, -- grass [6216] = 6715, -- grass tuffs [6217] = 6716, -- grass tuffs [6218] = 6717, -- grass tuffs [6219] = 6718, -- grass tuffs [387] = 6966, -- stalagmite [3610] = 6611, -- stones [3614] = 6610, -- stones [3666] = 6713, -- stone [3667] = 6714, -- stone [3668] = 6715, -- stone [468] = 483, -- hole [469] = 484, -- hole [3310] = 485, -- hole [3607] = 6999, -- medium stone [3609] = 7003, -- medium stone [3616] = 7002, -- medium stone [3663] = 7016, -- big stone [3664] = 7017, -- big stone [3615] = 7000, -- medium stone [3608] = 7001, -- medium stone [3659] = 7018, -- medium stone [3660] = 7019, -- medium stone [3617] = 7004, -- big stone [3618] = 7005, -- big stone [3619] = 7006, -- big stone [3620] = 7007, -- big stone [3624] = 7008, -- big stone [3625] = 7009, -- big stone [3626] = 7010, -- big stone [3627] = 7011, -- big stone [3628] = 7012, -- big stone [3629] = 7013, -- big stone [3630] = 7014, -- big stone [3631] = 7015, -- big stone [4470] = 6768, -- mountain [4471] = 6720, -- mountain [4472] = 6719, -- mountain [4476] = 6724, -- mountain [4477] = 6725, -- mountain [4478] = 6726, -- mountain [4479] = 6727, -- mountain [4473] = 6721, -- mountain [4474] = 6722, -- mountain [4475] = 6723, -- mountain [4468] = 6762, -- mountain [4469] = 6761, -- mountain [4542] = 4737, -- grass border [4543] = 4738, -- grass border [4544] = 4739, -- grass border [4545] = 4740, -- grass border [4546] = 4741, -- grass border [4547] = 4742, -- grass border [4548] = 4743, -- grass border [4549] = 4744, -- grass border [4550] = 4745, -- grass border [4551] = 4746, -- grass border [4552] = 4747, -- grass border [4553] = 4748, -- grass border } }, seasons = { ["monday"] = "winter", ["tuesday"] = "winter", ["wednesday"] = "autumn", ["thursday"] = "autumn", ["friday"] = "spring", ["saturday"] = "summer", ["sunday"] = "summer" } } function onStartup () doSetGameState(GAMESTATE_CLOSED) addEvent(doSetGameState, 1000 * 15, GAMESTATE_NORMAL) for i = 1, table.maxn(config.areas) do for x = ((config.areas)[i][1]).x, ((config.areas)[i][2]).x do for y = ((config.areas)[i][1]).y, ((config.areas)[i][2]).y do for z = ((config.areas)[i][1]).z, ((config.areas)[i][2]).z do for k, v in pairs(config.items[config.seasons[string.lower(os.date("%A"))]]) do pos = {x = x, y = y, z = z} if(getTileItemById(pos, k).uid > 0) then doTransformItem(getTileItemById(pos, k).uid, v) end end end end end end return true end Agora entre em /globalevents/globalevents.xml adicione a TAG abaixo, salve e feche. <globalevent name="seasons" type="start" event="script" value="seasons.lua"/>
E é isso galera, vocês estão livres para editar o código e adicionar/retirar items, para fazer isso use o map editor ou então o arquivo items.xml para verificar o ID dos items.
-
Guilherme. recebeu reputação de zinfinitez em [Ajuda] Bug no rme 8.60http://www.tibiaking.com/forum/topic/22469-remeres-map-editor/
Baixa esse, extrai e abre por ele que funciona...
-
Guilherme. recebeu reputação de gabirucola em [CreatureEvent] Rank MilitarOlá galerinha do Tibia King !
Hoje vim trazer para vocês um MOD que achei muito foda.
O script atribui um 'rank' militar ao player que tem certa quantidade de frags, é parecido com o REP System, bom agora vamos aos 'finalmente' !
Primeiro entre em /mods/ e crie um arquivo com o nome de ranks.xml agora coloque o código abaixo, salve e feche o arquivo.
Você pode editar facilmente o nome do Rank e a quantidade de Frags necessários para obtelo seguindo o padrão:
[1] - Quantidade de Frags
"Private First Class" - Nome do Rank
<?xml version = "1.0" encoding = "UTF-8"?> <mod name = "Military Ranks" version = "1.0" author = "Teckman" enabled = "yes"> <config name = "ranks"><![CDATA[ titles = { [5] = "Private First Class", [10] = "Specialist", [15] = "Corporal", [20] = "Sergeant", [25] = "Staff Sergeant", [30] = "Sergeant First Class", [35] = "Master Sergeant", [40] = "First Sergeant", [45] = "Sergeant Major", [50] = "Command Sergeant Major", [55] = "Sergeant Major of the Army", [60] = "Second Lieutenant", [65] = "First Lieutenant", [70] = "Captain", [75] = "Major", [80] = "Lieutenant Colonel", [90] = "Colonel", [100] = "Brigadier General", [110] = "Major General", [120] = "Lieutenant General", [140] = "General", [170] = "General of the Army" } fragsStorage = 600 ]]></config> <event type = "look" name = "ranksLook" event = "script"><![CDATA[ domodlib("ranks") function onLook(cid, thing, position, lookDistance) if(isPlayer(thing.uid)) then local rank = {rank = "Private", frags = 0} for k, v in pairs(titles) do if(math.max(0, getPlayerStorageValue(thing.uid, fragsStorage)) > k - 1) then if(k - 1 > rank.frags) then rank.rank, rank.frags = v, k - 1 end end end doPlayerSetSpecialDescription(thing.uid, "\n Military rank: " .. rank.rank) end return true end ]]></event> <event type = "kill" name = "ranksKill" event = "script"><![CDATA[ domodlib("ranks") function onKill(cid, target) if(isPlayer(target)) then setPlayerStorageValue(cid, fragsStorage, math.max(0, getPlayerStorageValue(cid, fragsStorage) + 1)) if(titles[getPlayerStorageValue(cid, fragsStorage)]) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You advanced to military rank: " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. ". Congratulations " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. "!") end end return true end ]]></event> <event type = "login" name = "ranksLogin" event = "script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "ranksKill") registerCreatureEvent(cid, "ranksLook") return true end ]]></event> </mod>
Os créditos do script vão para Teckman;
-
Guilherme. recebeu reputação de GOD Vitor em [Creature] Proteger JogadoresOlá galerinha!
Bom, antes de tudo, os créditos de criação do script vão para o Fresh, esse script vai proteger os jogadores contra a morte caso aconteça algum erro, crash ou até mesmo restart no seu servidor.
Como?
Simples, quando o servidor for iniciado, os jogadores terão 60 segundos (tempo padrão) de imunidade contra ataques físicos e mágicos, ou seja, você não causará dano em um monstro, muito menos um monstro vai causar dano em você durante o tempo pré-determinado.
[Dica: Isso pode ser utilizado para criar uma quest diária, por exemplo, dentro da missão existem monstros que causam um dano de 9000, você apenas poderá completar a quest depois que o servidor reiniciar e você aproveitar o tempo para passar correndo dos bichos, ou seja, ela só pode ser completada uma vez por dia, quando o servidor reiniciar, no caso.]
Vamos ao que interessa:
Vá em data/creaturescripts/creaturescripts.xml e adicione isso:
<!-- Protection after server crash/restart -->
<event type="statschange" name="loginPro" event="script" value="loginPro.lua"/>
<event type="login" name="loginPro" event="script" value="loginPro.lua"/>[/xml]
Agora crie um arquivo com o nome de [b]LoginPro.lua[/b] em [b]data/creaturescripts/scripts[/b] e coloque:
[code]local seconds = 60 function onLogin(cid) registerCreatureEvent(cid, "loginPro") return true end function onStatsChange(cid, attacker, type, combat, value) if getWorldUpTime() <= seconds and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then doSendMagicEffect(getCreaturePosition(cid), 3) return false end return true end[/code]
Prontinho, aproveitem o script pessoal !
-
Guilherme. recebeu reputação de Alamxd em Critical Skill SystemOlá, fiz um singelo complemento ao script!
É uma simples talkaction que retorna ao player qual sua porcentagem atual de crítico:
talkactions.xml:
<talkaction words="!critical" event="script" value="critinfo.lua"/> Crie um arquivo em talkactions/scripts chamado critinfo.lua e adicione:
function onSay(cid, words, param, channel) local config = { levelscrit = 100 * 0.3, --- leveis que terão storagecrit = 48913 -- storage que será verificado } doPlayerSendTextMessage(cid,MESSAGE_FIRST,"Your current critical rate is: ["..(getPlayerStorageValue(cid, config.storagecrit)*0.3).."% of "..config.levelscrit.."%].") return true end
MESSAGE_FIRST no código, é o tipo/cor da mensagem que será exibida ao player, as opções estão disponíveis no arquivo constant.lua na pasta lib, no meu as opções são as seguintes:
MESSAGE_FIRST = 18 MESSAGE_STATUS_CONSOLE_RED = MESSAGE_FIRST MESSAGE_EVENT_ORANGE = 19 MESSAGE_STATUS_CONSOLE_ORANGE = 20 MESSAGE_STATUS_WARNING = 21 MESSAGE_EVENT_ADVANCE = 22 MESSAGE_EVENT_DEFAULT = 23 MESSAGE_STATUS_DEFAULT = 24 MESSAGE_INFO_DESCR = 25 MESSAGE_STATUS_SMALL = 26 MESSAGE_STATUS_CONSOLE_BLUE = 27 MESSAGE_LAST = MESSAGE_STATUS_CONSOLE_BLUE Você pode substituir o MESSAGE_FIRST por um desses valores a sua escolha.
Obrigado pelo sistema, Lobão!
-
Guilherme. recebeu reputação de Zauster em [Resolvido] Atributos em ItensTodos os atributos funcionam, mas você tem que adicionar uma TAG em movements.xml em cada item que quiser 'atributos', veja um exemplo abaixo:
<movevent type="Equip" itemid="000" slot="head" event="function" value="onEquipItem"/> <movevent type="DeEquip" itemid="000" slot="head" event="function" value="onDeEquipItem"/>
Sendo que onde está 000 é o ID do item que se encontra em items.xml e onde está slot="head" pode variar:
-
Guilherme. recebeu reputação de Zauster em [Resolvido] Atributos em ItensAqui uma lista dos atributos, suas funções e os slots, créditos à Antiemoxlr;
-
Guilherme. recebeu reputação de Gabriel Ribeiro em [GlobalEvent] Estações do AnoOlá galera, vim trazer mais um maravilhoso e criativo script do Teckman.
*OBS; O Script não contém todos os items para todas as estações.
Funciona assim: Quando você abrir o server ele irá substituir os items de acordo com as estações do ano, por exemplo, vai substituir as árvores por árvores de neve, pedras por pedras de neve, e assim por diante.
O Script vai ser executado logo que o server ligar pois ocupa muito do CPU e da memória RAM, mas apenas para grandes mapas e por pouco tempo.
Entre em /globalevents/scripts/ e então crie o arquivo seasons.lua, coloque o código abaixo no arquivo, salve e feche.
local config = { areas = { [1] = { {x = 954, y = 1001, z = 7}, {x = 992, y = 1026, z = 7} } }, items = { ["winter"] = { [2700] = 2698, -- fir tree [2705] = 8139, -- pear tree [2703] = 2697, -- plum tree [2704] = 7020, -- red maple [2706] = 7071, -- yellow maple [2701] = 2698, -- sycamore [2707] = 7022, -- beech [2708] = 7020, -- poplar [2711] = 7021, -- dwarf tree [2712] = 7023, -- pine [4526] = 6580, -- grass [4527] = 6581, -- grass [4528] = 6582, -- grass [4529] = 6583, -- grass [4530] = 6584, -- grass [4531] = 6585, -- grass [4532] = 6586, -- grass [4533] = 6587, -- grass [4534] = 6588, -- grass [4535] = 6589, -- grass [4536] = 6590, -- grass [4537] = 6591, -- grass [4538] = 6592, -- grass [4539] = 6593, -- grass [4540] = 6580, -- grass [4541] = 6580, -- grass [6216] = 6715, -- grass tuffs [6217] = 6716, -- grass tuffs [6218] = 6717, -- grass tuffs [6219] = 6718, -- grass tuffs [387] = 6966, -- stalagmite [3610] = 6611, -- stones [3614] = 6610, -- stones [3666] = 6713, -- stone [3667] = 6714, -- stone [3668] = 6715, -- stone [468] = 483, -- hole [469] = 484, -- hole [3310] = 485, -- hole [3607] = 6999, -- medium stone [3609] = 7003, -- medium stone [3616] = 7002, -- medium stone [3663] = 7016, -- big stone [3664] = 7017, -- big stone [3615] = 7000, -- medium stone [3608] = 7001, -- medium stone [3659] = 7018, -- medium stone [3660] = 7019, -- medium stone [3617] = 7004, -- big stone [3618] = 7005, -- big stone [3619] = 7006, -- big stone [3620] = 7007, -- big stone [3624] = 7008, -- big stone [3625] = 7009, -- big stone [3626] = 7010, -- big stone [3627] = 7011, -- big stone [3628] = 7012, -- big stone [3629] = 7013, -- big stone [3630] = 7014, -- big stone [3631] = 7015, -- big stone [4470] = 6768, -- mountain [4471] = 6720, -- mountain [4472] = 6719, -- mountain [4476] = 6724, -- mountain [4477] = 6725, -- mountain [4478] = 6726, -- mountain [4479] = 6727, -- mountain [4473] = 6721, -- mountain [4474] = 6722, -- mountain [4475] = 6723, -- mountain [4468] = 6762, -- mountain [4469] = 6761, -- mountain [4542] = 4737, -- grass border [4543] = 4738, -- grass border [4544] = 4739, -- grass border [4545] = 4740, -- grass border [4546] = 4741, -- grass border [4547] = 4742, -- grass border [4548] = 4743, -- grass border [4549] = 4744, -- grass border [4550] = 4745, -- grass border [4551] = 4746, -- grass border [4552] = 4747, -- grass border [4553] = 4748, -- grass border } }, seasons = { ["monday"] = "winter", ["tuesday"] = "winter", ["wednesday"] = "autumn", ["thursday"] = "autumn", ["friday"] = "spring", ["saturday"] = "summer", ["sunday"] = "summer" } } function onStartup () doSetGameState(GAMESTATE_CLOSED) addEvent(doSetGameState, 1000 * 15, GAMESTATE_NORMAL) for i = 1, table.maxn(config.areas) do for x = ((config.areas)[i][1]).x, ((config.areas)[i][2]).x do for y = ((config.areas)[i][1]).y, ((config.areas)[i][2]).y do for z = ((config.areas)[i][1]).z, ((config.areas)[i][2]).z do for k, v in pairs(config.items[config.seasons[string.lower(os.date("%A"))]]) do pos = {x = x, y = y, z = z} if(getTileItemById(pos, k).uid > 0) then doTransformItem(getTileItemById(pos, k).uid, v) end end end end end end return true end Agora entre em /globalevents/globalevents.xml adicione a TAG abaixo, salve e feche. <globalevent name="seasons" type="start" event="script" value="seasons.lua"/>
E é isso galera, vocês estão livres para editar o código e adicionar/retirar items, para fazer isso use o map editor ou então o arquivo items.xml para verificar o ID dos items.
-
Guilherme. recebeu reputação de Axion Nitron em [CreatureEvent] Rank MilitarOlá galerinha do Tibia King !
Hoje vim trazer para vocês um MOD que achei muito foda.
O script atribui um 'rank' militar ao player que tem certa quantidade de frags, é parecido com o REP System, bom agora vamos aos 'finalmente' !
Primeiro entre em /mods/ e crie um arquivo com o nome de ranks.xml agora coloque o código abaixo, salve e feche o arquivo.
Você pode editar facilmente o nome do Rank e a quantidade de Frags necessários para obtelo seguindo o padrão:
[1] - Quantidade de Frags
"Private First Class" - Nome do Rank
<?xml version = "1.0" encoding = "UTF-8"?> <mod name = "Military Ranks" version = "1.0" author = "Teckman" enabled = "yes"> <config name = "ranks"><![CDATA[ titles = { [5] = "Private First Class", [10] = "Specialist", [15] = "Corporal", [20] = "Sergeant", [25] = "Staff Sergeant", [30] = "Sergeant First Class", [35] = "Master Sergeant", [40] = "First Sergeant", [45] = "Sergeant Major", [50] = "Command Sergeant Major", [55] = "Sergeant Major of the Army", [60] = "Second Lieutenant", [65] = "First Lieutenant", [70] = "Captain", [75] = "Major", [80] = "Lieutenant Colonel", [90] = "Colonel", [100] = "Brigadier General", [110] = "Major General", [120] = "Lieutenant General", [140] = "General", [170] = "General of the Army" } fragsStorage = 600 ]]></config> <event type = "look" name = "ranksLook" event = "script"><![CDATA[ domodlib("ranks") function onLook(cid, thing, position, lookDistance) if(isPlayer(thing.uid)) then local rank = {rank = "Private", frags = 0} for k, v in pairs(titles) do if(math.max(0, getPlayerStorageValue(thing.uid, fragsStorage)) > k - 1) then if(k - 1 > rank.frags) then rank.rank, rank.frags = v, k - 1 end end end doPlayerSetSpecialDescription(thing.uid, "\n Military rank: " .. rank.rank) end return true end ]]></event> <event type = "kill" name = "ranksKill" event = "script"><![CDATA[ domodlib("ranks") function onKill(cid, target) if(isPlayer(target)) then setPlayerStorageValue(cid, fragsStorage, math.max(0, getPlayerStorageValue(cid, fragsStorage) + 1)) if(titles[getPlayerStorageValue(cid, fragsStorage)]) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You advanced to military rank: " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. ". Congratulations " .. titles[getPlayerStorageValue(cid, fragsStorage)] .. "!") end end return true end ]]></event> <event type = "login" name = "ranksLogin" event = "script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "ranksKill") registerCreatureEvent(cid, "ranksLook") return true end ]]></event> </mod>
Os créditos do script vão para Teckman;
-
Guilherme. recebeu reputação de andersonwill em [Ajuda] Bug no rme 8.60http://www.tibiaking.com/forum/topic/22469-remeres-map-editor/
Baixa esse, extrai e abre por ele que funciona...
-
Guilherme. recebeu reputação de Angeles em [Resolvido] Atributos em ItensAqui uma lista dos atributos, suas funções e os slots, créditos à Antiemoxlr;
-
Guilherme. deu reputação a zipter98 em (Resolvido)[NPC] Function Error (HELP!)No código do NPC, você está usando como objeto dos metamétodos getStorageValue e setStorageValue uma variável inexistente (player).
Confesso não programar nas novas versões do TFS, mas tente:
local choose = {} local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} 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 function creatureSayCallback(cid, type, msg) local player = Player(cid) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid if isInArray({"task", "tasks"}, msg:lower()) then selfSay("Here.", cid) taskNPCuid = getNpcCid() if player:getStorageValue(cid, 32150) < 0 then player:setStorageValue(cid, 32150, 0) end return taskWindow:sendToPlayer(cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) -
Guilherme. recebeu reputação de Raphael Darkath em [CREATURE] OWNED!OWNED!
O Que Este Script Faz?
Ao matar um player, aparecerá uma mensagem em cima do corpo com efeito de animação com o seguinte texto: OWNED!
Bom, vamos ao SCRIPT:
Vá em data/creaturescripts/scripts/preparedeath.lua e coloque isso:
OBS:Se ele nao existir voce cria, mas se existir eu recomendo trokar no nome do script.lua e no login.lua registrar o evento com outro nome.
Vá em data/creaturescripts/creaturescripts.xml e ABAIXO desta Tag:
<event type="login" name="PlayerLogin" script="login.lua"/> ADICIONE ESTA: <event type="preparedeath" name="onPrepareDeath" event="script" value="preparedeath.lua"/> Agora é só ir em data/creaturescripts/scripts/login.lua e ABAIXO de: function onLogin(cid) ADICIONE ISTO: registerCreatureEvent(cid, "onPrepareDeath")
Script Pronto! Desligue seu OT e Ligue de Novo para testar o Script.
SCRIPT RETIRADO DE OUTRO FORUM, E ANTES QUE ALGUEM FALE MERDA RECLAME, OS CRÉDITOS ESTÃO DEVIDAMENTE COLOCADOS.
-
Guilherme. recebeu reputação de Alan12 em Adicionando novas Sprites no TibiaOlá Kingtibianos,
Galera eu vi que tinha muita gente querendo saber como colocar novos sprites no servidor, até achei alguns tutoriais mas não tinham imagens e eram muito vagos, então resolvi montar esse bem explicado e com imagens para facilitar o entendimento de vocês.
Inicio:
- Neste tutorial, você irá aprender como extrair, modificar e comilar o arquivo Tibia.spr.
• Vamos trocar esse sprite -
• Por esse -
1º Passo - Donwload e Instalação;
- Após baixar o SprEditor extraia ele para uma pasta a sua escolha .
- Após extrair vá na pasta do seu Tibia e copie o arquivo Tibia.spr para a mesma pasta onde esta o SprEditor.
2º Passo - Conhecendo o programa;
- Para extrair as imagens do arquivo Tibia.spr clique em "Extract" e para compilar as imagens *.Bmp para *.Spr clique em "Compile";
3º Passo - Extraindo;
- No programa clique em "Extract"
- Agora note q foi criada uma pasta chamada "Sprites" contendo todas as imagens.
4º Passo - Imagens e suas Propriedades;
- Para mudar as imagens abra a pasta "Sprites" e note que as imagens são todas 32x32 e tem extenção *.Bmp.
- A cor rosa nas imagens indica transparência.
- Agora mude a imagen sem ultrapassar o limite de tamanho (32x32).
- Depois de mudar e salvar as imagens que voce quiser vamos para o quinto passo;
5º Passo - Compilando;
- Agora va no programa e clique em "Compile" e espere o processo terminar.
- Perceba que ja esta sendo criado um arquivo chamado "MyTibia.spr"
Pronto agora voce ja tem seu Tibia.spr editado e compilado pronto para usar!
:great:
PS: Comentem e digam o que acharam!
-
Guilherme. recebeu reputação de Homen Nuclear em (Resolvido)Formas de Visualizar Alterações feitas no MapaCara, com o mapa é uma coisa mais complexa, com os scripts até dá pra usar o /reload, mas o mapa é muito grande pra isso, realmente é necessário reiniciar o servidor para ele carregar o mapa com as alterações a cada modificação sua!
-
Guilherme. recebeu reputação de bringsz em [AJUDA] Perdendo conexão com MySqlFoi isso que você mandou que eu pedi mesmo, só essa parte. É assim, quando você deixa esses dois campos com o valor "0", fica desabilitado o tempo limite de leitura e "escrita" na database, o que deixa o servidor fazer as leituras/gravações no tempo que for necessário (mas geralmente esse tempo tem que ser rápido! kkkk)
Provavelmente o que resolveu foi você ter optimizado manualmente as tabelas, pois ao que parece o erro era no distro!
-
Guilherme. recebeu reputação de Dae Sung Robson em (Resolvido)Ajuda! Meu ot não esta ficando on!Entra nas configs do roteador e lá deve ter alguma coisa de Port forwarding ou port triggering ou virtual servers, libera as portas nele também e redireciona com o ip interno da tua máquina que deve funcionar...
-
Guilherme. recebeu reputação de xWhiteWolf em Critical Skill SystemOlá, fiz um singelo complemento ao script!
É uma simples talkaction que retorna ao player qual sua porcentagem atual de crítico:
talkactions.xml:
<talkaction words="!critical" event="script" value="critinfo.lua"/> Crie um arquivo em talkactions/scripts chamado critinfo.lua e adicione:
function onSay(cid, words, param, channel) local config = { levelscrit = 100 * 0.3, --- leveis que terão storagecrit = 48913 -- storage que será verificado } doPlayerSendTextMessage(cid,MESSAGE_FIRST,"Your current critical rate is: ["..(getPlayerStorageValue(cid, config.storagecrit)*0.3).."% of "..config.levelscrit.."%].") return true end
MESSAGE_FIRST no código, é o tipo/cor da mensagem que será exibida ao player, as opções estão disponíveis no arquivo constant.lua na pasta lib, no meu as opções são as seguintes:
MESSAGE_FIRST = 18 MESSAGE_STATUS_CONSOLE_RED = MESSAGE_FIRST MESSAGE_EVENT_ORANGE = 19 MESSAGE_STATUS_CONSOLE_ORANGE = 20 MESSAGE_STATUS_WARNING = 21 MESSAGE_EVENT_ADVANCE = 22 MESSAGE_EVENT_DEFAULT = 23 MESSAGE_STATUS_DEFAULT = 24 MESSAGE_INFO_DESCR = 25 MESSAGE_STATUS_SMALL = 26 MESSAGE_STATUS_CONSOLE_BLUE = 27 MESSAGE_LAST = MESSAGE_STATUS_CONSOLE_BLUE Você pode substituir o MESSAGE_FIRST por um desses valores a sua escolha.
Obrigado pelo sistema, Lobão!
-
Guilherme. recebeu reputação de Artt em Qual mapa vocês preferem e gostariam/gostam de jogar?Sugestões são muito bem-vindas. Gostaria da opinião de vocês
Pra quem não conhece o Azeroth, é mais ou menos assim:
-
Guilherme. deu reputação a xWhiteWolf em Experience Weapon Systemdá, vc tem que inserir or f == 4 na função isThatWeapon e fazer as modificações na parte de upar pra dar % do level atual de shield, só que isso não vai ficar salvo no shield e sim no proprio player. Pra fazer do jeito que você quer seria necessario source editing pra criar algo como shieldPercent como um atributo do próprio item. Dá pra simular isso usando movements e a condition de dar shield percent
CONDITION_PARAM_SKILL_SHIELDPERCENT = 41 mas daí se vc upa o shield, teria que tirar e colocar ele no slot pra atualizar.. seria algo semelhante à isso daqui só que em vez de ser com set seria com 1 item só, dai a condition que vc dá pode se basear no level do item (temos uma função pra pegar o level)
http://www.tibiaking.com/forum/topic/34377-b%C3%B4nus-no-conjunto-de-itens/
sem falar que fazendo isso vc só vai permitir que upe OU arma OU shield, nunca os dois ao mesmo tempo.
-
Guilherme. deu reputação a xWhiteWolf em Experience Weapon SystemEai galera, hoje eu to trazendo pra vocês o meu Experience Weapon System. Pra quem não conhece é um sistema em que conforme você vai matando os monstros sua arma vai adquirindo parte da experiencia e upando de nível junto com você!
Eu abri um tópico pra sugestões mas os players foram tão criativos que eu decidi seguir meus instintos e fazer da minha própria maneira se não ia ficar muito ruim pra servers que não fossem derivados.
Testado em TFS 0.3.6 mas deve funcionar em qualquer um que tenha getThing(Pos) e onAttack e onKill ;]
Foi decidido por mim então fazer da seguinte maneira:
• Axes/ Swords/ Bows/ Crossbows:
Tem 5% de chance (pra cada nivel) de ferir gravemente o oponente e deixar ele sangrando, o nível do ferimento é proporcional ao nível da arma.
• Clubs:
Tem 5% de chance (pra cada nivel) de bater com tanta força que faça todos ao redor sentirem o tremor do seu ataque e levarem um dano baseado no nivel da arma e no ataque da mesma.
• Wands/ Rods:
Tem 5% de chance (pra cada nivel) de retirar uma quantidade de mana do player (proporcional ao nivel da arma) e ficar recuperando mana mais rapidamente durante 5 segundos após isso
Dito isso vamos ao que interessa:
Adiciona essas duas linhas no seu creaturescripts.xml:
<event type="kill" name="itemexp" script="itemexp.lua"/> <event type="attack" name="conditionitem" script="conditionitem.lua"/> e no login.lua:
--------------- Experience System ---------------- registerCreatureEvent(cid,"itemexp") registerCreatureEvent(cid,"conditionitem") Agora crie um arquivo em data\lib\ chamado 037 - Experience System.lua e coloque isso dentro dele:
Feito isso crie um arquivo em creaturescripts\scripts chamado itemexp.lua e adicione isso daqui:
Agora crie outro arquivo em creaturescripts\scripts, adicione isso daqui nele e chame de conditionitem.lua:
Agora configurando:
Bom, é isso aí, a minha idéia era trazer um pouco a mais de RPG e fazer o pessoal pensar 2x antes de sair trocando suas armas pela primeira que ele dropa que tenha + ataque que a dele pois assim ele passa a ter que valorizar mais os itens que já possui a um bom tempo;
Outro motivo é que agora os items vão valer mais e agora seu server vai ter mais movimento nas trocas ;]
Espero que tenham gostado e qualquer coisa é só falar nos comentários. Abraço do lobinho.
Ps: aqui tem duas fotinhas mas o resto só instalando mesmo porque tem bastante coisa pra mostrar.
E lembrando, se te ajudei clica em Gostei aqui embaixo. Fuis
-
Guilherme. recebeu reputação de gabriel28 em [TalkAction] Dungeon FinderOlá TibiaKing!
Esse script necessita um pouco mais de conhecimento, pois precisa adicionar códigos em C++ ao distro.
O script adiciona você em uma espécie de fila, assim que a fila completar 5 pessoas, automaticamente um grupo é formado e as 5 pessoas são teleportadas para dentro da dungeon ou quest.
Basicamente funciona assim:
Player (Eu): /queue join
Player (Outro): /queue join
Player (Outro): /queue join
Player (Outro): /queue join
Player (Outro): /queue join
Onde queue significa fila.
Uma pequena demonstração
Database (MySQL/PHPMyAdmin)
CREATE TABLE `dungeon_finder` (`id` INT(8) AUTO_INCREMENT PRIMARY KEY, `player_id` INT(255)) Talkactions
function onSay(cid, words, param, channel) if(param == "join") then query = db.getResult("SELECT * FROM `dungeon_finder` WHERE `player_id` = " .. getPlayerGUID(cid) .. "") if(getPlayerStorageValue(cid, CONFIG.DUNGEON_STORAGE) > 1) then if(getPlayerStorageValue(cid, CONFIG.DUNGEON_STORAGE) > os.time()) then doPlayerSendCancel(cid, "You can't join queue with deserter debuff.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(CONFIG.AREA) then if(not(isInArea(getPlayerPosition(cid), (CONFIG.AREA).FROMPOS, (CONFIG.AREA).TOPOS))) then doPlayerSendCancel(cid, "You're not in required area to join the queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(CONFIG.PZ_REQUIRED) then if(not(getTilePzInfo(getPlayerPosition(cid)))) then doPlayerSendCancel(cid, "You're not in protection zone to join the queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(CONFIG.REQUIRED_LEVEL) then if(getPlayerLevel(cid) < CONFIG.REQUIRED_LEVEL) then doPlayerSendCancel(cid, "You don't have required level to join the queue. The minimum level to join the queue is " .. CONFIG.REQUIRED_LEVEL .. ".") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(CONFIG.SKULL) then if(getPlayerSkullType(cid) >= CONFIG.SKULL) then doPlayerSendCancel(cid, "Murderers are not allowed to join the queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(CONFIG.IN_FIGHT) then if(getCreatureCondition(cid, CONDITION_INFIGHT)) then doPlayerSendCancel(cid, "You can't be in combat in order to join the queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end end if(isInParty(cid)) then doPlayerSendCancel(cid, "You can't join queue while you are in party group.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end if(query:getID() == 0) then doPlayerSendCancel(cid, "You are already listed in queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end db.executeQuery("INSERT INTO `dungeon_finder` SET `player_id` = " .. getPlayerGUID(cid) .. ";") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_MAGIC_BLUE) doCreatureSay(cid, "You've beed queued in dungeon finder - random mode.", TALKTYPE_ORANGE_1) elseif(param == "remove") then query = db.getResult("SELECT * FROM `dungeon_finder` WHERE `player_id` = " .. getPlayerGUID(cid) .. "") if(query:getID() == -1) then doPlayerSendCancel(cid, "You are not listed in the queue.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) return true end db.executeQuery("DELETE FROM `dungeon_finder` WHERE `player_id` = " .. getPlayerGUID(cid) .. ";") doCreatureSay(cid, "You've beed removed from queue.", TALKTYPE_ORANGE_1) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_MAGIC_RED) end return true end Globalevents
local DUNGEONS = { [1] = {NAME = "Test dungeon", LEVEL = 30, POS = {x = 450, y = 357, z = 15}}, } local condition = createConditionObject(CONDITION_INFIGHT) setConditionParam(condition, CONDITION_PARAM_TICKS, 15000) function onThink(cid, interval) DUNGEON = DUNGEONS[math.random(1, table.maxn(DUNGEONS))] players = {} for i = 1, 1000 do if(table.maxn(players) == 5) then break end query = db.getResult("SELECT * FROM `dungeon_finder` WHERE `id` = " .. i .. ";") if(query:getID() > -1) then pid = getPlayerByName(getPlayerNameByGUID(query:getDataInt("player_id"))) if(getPlayerStorageValue(pid, CONFIG.DUNGEON_STORAGE) > 1) then return true end if(getPlayerLevel(pid) > DUNGEON.LEVEL and getPlayerLevel(pid) < DUNGEON.LEVEL + 50) then table.insert(players, getPlayerGUID(pid)) end query:free() end end if(table.maxn(players) == 5) then for i = 1, 5 do pid = getPlayerByName(getPlayerNameByGUID(players[i])) if(i == 1) then doPlayerSendTextMessage(pid, MESSAGE_STATUS_CONSOLE_BLUE, "You were chosen to be a dungeon guide.") addEvent(doCreatureSay, 15200, pid, "You and your team were teleported to the " .. DUNGEON.NAME .. ".", TALKTYPE_ORANGE_1) for j = 2, 5 do lid = getPlayerByName(getPlayerNameByGUID(players[j])) doPlayerInviteToParty(pid, lid) end else doPlayerJoinParty(pid, getPlayerByName(getPlayerNameByGUID(players[1]))) end delay = 0 for i = 1, 15 do addEvent(doPlayerSendTextMessage, delay + 1000, pid, MESSAGE_STATUS_CONSOLE_BLUE, "A dungeon group for you has been found. You'll be teleported to the dungeon in " .. 15 - i .. " seconds.") delay = delay + 1000 end doAddCondition(pid, condition) addEvent(doTeleportThing, 15000, pid, DUNGEON.POS) addEvent(doSendMagicEffect, 15000, DUNGEON.POS, CONST_ME_TELEPORT) db.executeQuery("DELETE FROM `dungeon_finder` WHERE `player_id` = " .. players[i] .. ";") if(CONFIG.QUIT_POS) then setPlayerStorageValue(pid, 9001, getPlayerPosition(pid).x) setPlayerStorageValue(pid, 9002, getPlayerPosition(pid).y) setPlayerStorageValue(pid, 9003, getPlayerPosition(pid).z) end setPlayerStorageValue(pid, CONFIG.DUNGEON_STORAGE, 1) end end return true end CreatureEvents
function onLogout(cid) query = db.getResult("SELECT * FROM `dungeon_finder` WHERE `player_id` = " .. getPlayerGUID(cid) .. ";") if(query:getID() == -1) then return true end db.executeQuery("DELETE FROM `dungeon_finder` WHERE `player_id` = " .. getPlayerGUID(cid) .. ";") return true end function onLeaveParty(cid) if(getPlayerStorageValue(cid, CONFIG.DUNGEON_STORAGE) == 1) then setPlayerStorageValue(cid, CONFIG.DUNGEON_STORAGE, -1) if(CONFIG.DESERTER_DEBUFF_TIME) then setPlayerStorageValue(cid, CONFIG.DUNGEON_STORAGE, os.time() + CONFIG.DESERTER_DEBUFF_TIME) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You've been marked with deserter debuff for " .. CONFIG.DESERTER_DEBUFF_TIME / 3600 .. " hour/s. For this time you can't join the queue again.") end TMP_POS = CONFIG.QUIT_POS and {x = getPlayerStorageValue(cid, 9001), y = getPlayerStorageValue(cid, 9002), z = getPlayerStorageValue(cid, 9003)} or getPlayerMasterPos(cid) doTeleportThing(cid, TMP_POS) doSendMagicEffect(TMP_POS, CONST_ME_TELEPORT) for i = 9001, 9003 do setPlayerStorageValue(cid, i, -1) end end return true end lib
CONFIG = { AREA = false, -- if false then everyone can join queue everywhere, if you want certain area add AREA = {FROMPOS = {}, TOPOS = {}} PZ_REQUIRED = false, -- requirement of standing in pz, if you don't want it just set PZ_REQUIRED = false REQUIRED_LEVEL = 30, -- required level to join the queue, if you don't want it just set REQUIRED_LEVEL = false SKULL = 1, -- skull that is not acceptable while joining queue, if you want players join with skulls just set SKULL = false IN_FIGHT = true, -- if player is in fight he can't join the queue, IN_FIGHT = false to disable QUIT_POS = false, -- if you want player to go back to his previous position (from which he got teleported to the dungeon) set QUIT_POS = true, if set to false it'll teleport player to his temple DESERTER_DEBUFF_TIME = 1800, -- 60 = 1 min, 3600 = 1h DUNGEON_STORAGE = 9005 } C++
luascript.cpp int32_t LuaScriptInterface::luaDoPlayerJoinParty(lua_State* L) { //doPlayerJoinParty(cid, lid) ScriptEnviroment* env = getEnv();[/left] Player* leader = env->getPlayerByUID(popNumber(L)); if(!leader) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } Player* player = env->getPlayerByUID(popNumber(L)); if(!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } g_game.playerJoinParty(player->getID(), leader->getID()); lua_pushboolean(L, true); return 1; } Coloque: int32_t LuaScriptInterface::luaDoPlayerInviteToParty(lua_State* L) { //doPlayerInviteToParty(cid, pid) ScriptEnviroment* env = getEnv(); Player* leader = env->getPlayerByUID(popNumber(L)); if(!leader) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } Player* player = env->getPlayerByUID(popNumber(L)); if(!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } g_game.playerInviteToParty(player->getID(), leader->getID()); lua_pushboolean(L, true); return 1; } creatureevent.h Depois de: CREATURE_EVENT_PREPAREDEATH, Coloque: CREATURE_EVENT_LEAVEPARTY Depois de: bool playerLogout(Player* player, bool forceLogout); Coloque: uint32_t executeLeaveParty(Player* player); Depois de: uint32_t executePrepareDeath(Creature* creature, DeathList deathList); Coloque: uint32_t executeLeaveParty(Player* player); creatureevent.cpp Depois de: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Coloque: else if(tmpStr == "leaveparty") m_type = CREATURE_EVENT_LEAVEPARTY; Depois de: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque: case CREATURE_EVENT_LEAVEPARTY: return "onLeaveParty"; Depois de: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque: case CREATURE_EVENT_LEAVEPARTY: return "cid"; Depois da função: uint32_t CreatureEvent::executeFollow(Creature* creature, Creature* target)... Coloque: uint32_t CreatureEvent::executeLeaveParty(Player* player) { //onLeaveParty(cid) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); #ifdef __DEBUG_LUASCRIPTS__ std::stringstream desc; desc << player->getName(); env->setEventDesc(desc.str()); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); bool result = m_interface->callFunction(1); m_interface->releaseEnv(); return result; } else { std::cout << "[Error - CreatureEvent::executeAdvance] Call stack overflow." << std::endl; return 0; } } game.cpp Mude: bool Game::playerLeaveParty(uint32_t playerId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if(!player->getParty() || player->hasCondition(CONDITION_INFIGHT)) return false; return player->getParty()->leave(player); } Para: bool Game::playerLeaveParty(uint32_t playerId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if(!player->getParty() || player->hasCondition(CONDITION_INFIGHT)) return false; CreatureEventList leavePartyEvents = player->getCreatureEvents(CREATURE_EVENT_LEAVEPARTY); for(CreatureEventList::iterator it = leavePartyEvents.begin(); it != leavePartyEvents.end(); ++it) (*it)->executeLeaveParty(player); return player->getParty()->leave(player); }
E é isso galera, o local da quest pode ser mudado/adicionado no GlobalEvent, mais uma maravilha do Teckman
Depois de: //doPlayerJoinParty(cid, lid) lua_register(m_luaState, "doPlayerJoinParty", LuaScriptInterface::luaDoPlayerJoinParty); Coloque: //doPlayerInviteToParty(cid, pid) lua_register(m_luaState, "doPlayerInviteToParty", LuaScriptInterface::luaDoPlayerInviteToParty); Depois de: -
Guilherme. recebeu reputação de Admnwso em [Resolvido] Atributos em ItensAqui uma lista dos atributos, suas funções e os slots, créditos à Antiemoxlr;