Ir para conteúdo

Underewar

Diretor de Projetos
  • Registro em

  • Última visita

Tudo que Underewar postou

  1. Underewar postou uma resposta no tópico em Portal
    Fala Tryller, po como esquecer essa base? as primeiras versoes do alissow é com crystal server
  2. Hoje tive tempo para sentar aqui vamos la! Primeiro em creaturescripts/scripts crie um arquivo: blessitem.lua function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if getPlayerItemCount(cid,item_id,amount) then local p = getPlayerPosition(cid) doSendAnimatedText(p, "Protected", COLOR_ORANGE) doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, loss * 50) end return true end Em creaturescript.xml <event type="preparedeath" name="blessitem" event="script" value="blessitem.lua"/>
  3. Foi mal confundi as linguagens lua nao usa pipe function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerItemCount(cid,item_id,amount) and not(getPlayerBlessing(cid, bless[1,2,3,4,5]) then doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, loss * 50) end end return true end
  4. function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerItemCount(cid,item_id,amount) || not(getPlayerBlessing(cid, bless[1,2,3,4,5]) then doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, loss * 50) end end return true end
  5. local item_id,amount = 7721,1 function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerItemCount(cid,item_id,amount) then if not(getPlayerBlessing(cid, bless[i]) then for i = 1, table.maxn(bless) do doPlayerAddBlessing(cid, bless[i]) end end end end return TRUE end
  6. @Morg vlw agora entendi haha
  7. Iniciantes ?Quer ser bom pratique!Quer ser muito bom? pratique muito!, use as areas sem exemplos para treinar e aprenda neste topico a criar funções! Como eu sei oque é uma função? sempre que você encontrar algo assim "blablabla()" isso é uma função assim como "() =>" isso é uma função, assim como "function ()" isso é uma função, dentro de uma função podemos passar instruções então abrimos chaves {} aqui no lua é o then. Beleza agora que você sabe oque é uma função continue! Sobre Lista com quase todas as funções disponíveis. você sera capaz de : Ler pequenas instruções para funções. Usar as instruções. Usar um retorno de uma função Introdução a ["get" function] A baixo existe uma lista com a função e a sua explicação. Essas funções devem sempre retornar a string ou o valor pedido. getPlayerFood(cid) Essa função vai verificar a quantos segundos o players esta com a propriedade em um food. Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getCreatureHealth(cid) Essa função vai checkar a quantidade da vida da criatura. Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getPlayerMaxMana(cid) Essa função vai retornar a quantidade maxima de mana Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getPlayerLevel(cid) Essa função vai pegar o level atual de jogador Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getPlayerMagLevel(cid) Essa função vai pegar o magic level atual de um jogador Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getPlayerName(cid) Essa função pega o nome de um jogador Ajude esse tópico a ficar 100% com um exemplo e treine suas habilidades. getPlayerAccess(cid) Essa função verifica o acesso de um jogador Ajude esse tópico aoficar 100% com um exemplo e treine suas habilidades. getPlayerPosition(cid) Essa função verifica a posição de um player Ela vai retornar um Array (Se você não sabe oque é um Array use o SLAD Search Like a Dev e abra o google) Exemplo de retorno {x = 127, y = 7, z = 9, stackpos = 1} {x = 396, y = 582, z = 13, stackpos = 2} quando o player estiver em cima de um item stackpos = 2 Exemplo de uso local playerPos = getPlayerPosition(cid)--Armazenando a função em uma variavel com a posição do jogador doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your current position is [X: "..playerPos.x.." | Y: "..playerPos.y.." | Z: "..playerPos.z.."].") getPlayerSkill(cid, skillid) Essa função vai verificar a skill de um jogador Sendo esses os ids das skills que podem ser usados: 0 = Fist Fighting 1 = Club Fighting 2 = Sword Fighting 3 = Axe Fighting 4 = Distance Fighting 5 = Shielding 6 = Fishing Exemplo de uso if getPlayerSkill(cid, 2) >= 20 then -- Verificando se a skill Sword é maior que 20 doPlayerAddItem(cid, 2376, 1) -- Se sim adicionando uma Sword como recompensa else --Se não você ainda não tem skill 20 doPlayerSendCancel(cid, "Sorry, your sword skill is not high enough.") end getPlayerTown(cid) Essa função vai verificar a cidade atual de um jogador Exemplo de uso local playerPos = getCreaturePosition(cid) -- Ja aprendemos a utilizar se não se lembra para pegarmos a posição do jogador ali em cima if getPlayerTown(cid) == 1 then -- Verificamos se a cidade atual do jogador é igual a 1 -- Se sim Verificando na posição do jogador uma string , e um numero que representa a textColor ou o seu nome de efeito TEXTCOLOR_GOLD doSendAnimatedText(playerPos, 'I am leaving in town with id: 1 (Main City)! :)', TEXTCOLOR_GOLD) elseif getPlayerTown(cid) == 2 then -- Verificando se a cidade atual é igual a 2 doSendAnimatedText(playerPos, 'I am leaving in town with id: 2 (Desert City)! :)', TEXTCOLOR_GOLD) end getPlayerVocation(cid) Essa função retorna o id da vocação Exemplos de uso local playerVoc = getPlayerVocation(cid) -- colocando a função em uma variavel if playerVoc == 1 or playerVoc == 5 then --Se a vocação é Sorcerer ou Master Sorcerer then weapon = Wand weapon == 2190 --Wand of vortex elseif playerVoc == 2 or playerVoc == 6 then --Se a vocação é == Druid ou Elder Druid then weapon = Rod weapon == 2182 --Snakebite Rod elseif playerVoc == 3 or playerVoc == 7 then --Se a vocação é == Paladin ou Royal Paladin then weapon = Spear weapon == 2389 --Spear elseif playerVoc == 4 or playerVoc == 8 then --Se a vocação é == Knight ou Elite Knight then weapon = Sword weapon == 2412 --Katana end doPlayerAddItem(cid, weapon, 1) -- usando a storage do weapon para retornar a arma a ser adicionada getPlayerItemCount(cid,itemid) Essa função vai verificar quantos item == itemid o jogador possui no momento Exemplos de uso local crystalCoins = getPlayerItemCount(cid, 2160) -- Declarada a variavel crystalCoins que vai verificar se o jogador possui o id 2160 local platinumCoins = getPlayerItemCount(cid, 2152) -- Declarada a variavel pplatinumCoins que vai verificar se o jogador possui o id 2152 local goldCoins = getPlayerItemCount(cid, 2148) -- O mesmo para o gold coin -- agora criamos uma variavel money que é igual rystalCoins * 10000 + platinumCoins * 100 + goldCoins money = crystalCoins * 10000 + platinumCoins * 100 + goldCoins -- então imprimimos para o jogador usando cid, msg doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your money: " ..money.. "gp") getPlayerFreeCap(cid) -- Essa função verifica quanto de cap disponivel o jogador ainda tem Exemplo de uso local playerCap = getPlayerFreeCap(cid) -- armazenando a função que verifica o cap na variavel playerCap local item = 2393 --Giant Sword local itemweight = getItemWeight(item, 1) -- nova função usada para pegar o peso do item if playerCap >= itemweight then -- verificando se o cap é maior que o pseo do item -- caso seja adiciona o item e manda uma mensagem doPlayerSendTextMessage(cid,22,'You have found a giant sword.') doPlayerAddItem(cid,item,1) else -- senão não possui cap doPlayerSendTextMessage(cid, 22, 'You have found a ' .. item .. 'weighing ' ..itemweight.. ' oz it\'s too heavy.') getPlayerLight(cid) Retorna a luz atual de um jogador Exemplo 215 - Depois de usar a spell "utevo gran lux" getPlayerSlotItem(cid, slot) Essa função verifica qual item o jogador esta equipado os slots que podem ser verificados são 1 = helmet 2 = necklace slot 3 = backpack, bag 4 = armor 5 = left hand 6 = right hand 7 = legs 8 = boots 9 = ring slot 10 = ammo slot Essa função tambem retorna uma Array de um slot Por exemplo: {itemid = 2493, uid = 70001, actionid = 0} (demon helmet, slot = 1) Exemplo de uso -- Aqui passamos o paremetro do slot e verifica com o itemid que desejar if getPlayerSlotItem(cid, 2) == 2173 then -- Verificando se tem aol doPlayerSendTextMessage(cid,22,'Ok, you can go.') else doPlayerSendTextMessage(cid,22,'Sorry, you need amulet of loss to go.') doTeleportThing(cid, fromPosition, TRUE) end getPlayerDepotItems(cid, depotid) Essa função vai verificar quanto slots e item e a sua quantidade o jogador tem no depot (slots reserved, becouse 10cc = 1 slot) xx player tem no depot exemplo de retorno 7 - quando ojogado - sword - rope - 100 uh - parcel (inside: 10 crystal coins + label) - depot chest (standard, all players have it) Exemplo de uso depotItems = getPlayerDepotItems(cid, 3) -- Verificando o depot na cidade 3 if depotItems < 2 then --quando o depot conter menos que 2 items então doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Your depot contains 1 item.") else --se não o deposit contem a quantidade de item retornada doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Your depot contains " ..depotItems.. " items.") end getPlayerSex(cid) Essa função retorna o sexo de um jogador Retorno 0 - female 1 - male Exemplo de uso i f getPlayerSex(cid) == 0 then --female doSendAnimatedText(playerPos, 'GiRl :*:*', TEXTCOLOR_GOLD) elseif getPlayerSex(cid) == 1 then --male doSendAnimatedText(playerPos, 'Wtf? I aM BoY.', TEXTCOLOR_GOLD) else -- Caso não tenha sexo doSendAnimatedText(playerPos, 'Wtf? I aM BoY.', TEXTCOLOR_GOLD) end getPlayerLookDir(cid) Esta função retorna a direção que o jogador esta olhando Retorno 0 - jogador esta olhando (north) (/\) 1 - jogador esta olhando (east) (>) 2 - jogador esta olhando (south) (\/) 3 - jogador esta olhando (<) Exemplo de uso local direction = getPlayerLookDir(cid) -- armazenando a direção que o player esta olhando na variavel direction if direction = 0 then --quando for north doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You are looking to north") elseif direction = 1 then --quando for east doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You are looking to east") elseif direction = 2 then --quando for south doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You are looking to south") else --quando for west doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You are looking to west") end getPlayerGUID(cid) Essa função deve retornar o id de um jogador Retorno Player.id de uma chamada de retorno then return = -1 Exemplo DE USO - Imprimito o texto no channel default com uma 'string retornando o id do jogador com a função getPlayerGUID()' doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "You are player with id: "..getPlayerGUID(cid)) getPlayerFlagValue(cid, flag) Para saber quais flags existem procure src/const.h Essa função retorna o valor de uma flag 1 quando verdadeiro 0 quando false (evento) Exemplo de uso -- Setando a variavel flagValue com a função getPlayerFlagValue(cid, id da flag) flagValue = getPlayerFlagValue(cid, 32) -- flag 32 = "Pode sumonar todos os mosntros" if flagValue = 1 then --se flag = 1 ou seja se pode sumonar. se for igual a 32 doSummonCreature("Demon", fromPosition.x + 1) -- Sumonar demon 32 = true else -- senão ou seja, se flag 32 = false doSummonCreature("Rat", fromPosition.x + 1) -- sumon rat 32 = false end getPlayerGroupId(cid) Essa função vai checar o group-id do jogador Exemplo de uso local group = getPlayerGroupId(cid) -- armazenando a função que capturar o groupid na variavel group if group == 3 --se for God só Exemplo doPlayerAddItem(cid,2160,100) --usando a função doPlayerAddItem para adicionar 100 crystal coins elseif group == 2 --se For Gamemaster só Exemplo doPlayerAddItem(cid,2160,50) --usando a função doPlayerAddItem para adicionar 50 crystal coins else -- senão chora nb doPlayerSendCancel(cid, "Sorry, cheats doesnt work for you." end getPlayerGuildId(cid) Essa função vai verificar o id da guild do jogador Exemplo de uso -- Armazenando a função que capturar o id da guild do jogador na varial guildId local guildId = getPlayerGuildId(cid) if guildId == 21 then -- se o jogador possuir 21 então doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"Welcome in!") -- 21 = true elseif guildId == 22 then -- se for diferente de 21 então doPlayerSendCancel(cid,"This area is not for your guild") -- 21 != true end getPlayerGuildName(cid) Essa função vai verificar o nome da guild de um jogador Exemplo de uso -- Armazenando a função que captura o nome da guild do jogador na variavel guildName local guildName = getPlayerGuildName(cid) -- mandando um animação de texto na posição atuao da criatura (cid = creatureID), concatenando com guildName ou seja a função da primeira linha e a cor gold doSendAnimatedText(getCreaturePosition(cid),guildName, TEXTCOLOR_GOLD) getPlayerGuildRank(cid) Essa função verifica o cargo que o jogador possui na guildName Exemplo de uso -- Armazenando a função que captura o cargo de um jogador da guild que ele possui local rank = getPlayerGuildRank(cid) -- inviando uma text message par ao jogador informando ele o rank na guild usando a concatenação .. variavel .. doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,"You're a " .. rank .. " in your guild.")
  8. Aqui pequeno gafanhoto. No caso o script a baixo não remove o item quando o player morrer... era isso? Te aconselho a usar o sistema de bless para isso que é oque os cript esta fazendo aqui em baixo, se estiver um item id,quantidade e o player não estiver com a bless as blesses serão adicionadas. local item_id,amount = 7721,1 function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerItemCount(cid,item_id,amount) then if not(getPlayerBlessing(cid, bless[i])) then for i = 1, table.maxn(bless) do doPlayerAddBlessing(cid, bless[i]) end end end end return TRUE end
  9. int32_t healthPercent = round((double)(healthChange) - target->getMaxHealth()); sprintf(buffer, "+%2fk%", healthPercent); trocar por: int32_t healthPercent = round((double)(damage) - target->getMaxHealth()); sprintf(buffer, "-%2f%k", healthPercent);
  10. trocar por: int32_t healthPercent = round((double)(healthChange * 1) / target->getMaxHealth()); sprintf(buffer, "+%2fk%", healthPercent); trocar por: int32_t healthPercent = round((double)(damage * 1) / target->getMaxHealth()); sprintf(buffer, "-%2f%k", healthPercent);
  11. Ataques DoS (Denial of Service) e DDoS (Distributed DoS) De acordo com a definição do CERT (Computer Emergency Response Team), os ataques DoS (Denial of Service), também denominados Ataques de Negação de Serviços, consistem em tentativas de impedir usuários legítimos de utilizarem um determinado serviço de um computador. Para isso, são usadas técnicas que podem: sobrecarregar uma rede a tal ponto em que os verdadeiros usuários dela não consigam usá-la; derrubar uma conexão entre dois ou mais computadores; fazer tantas requisições a um site até que este não consiga mais ser acessado; negar acesso a um sistema ou a determinados usuários. Os ataques do tipo DoS mais comuns podem ser feitos devido a algumas características do protocolo TCP/IP (Transmission Control Protocol / Internet Protocol), sendo possível ocorrer em qualquer computador que o utilize. Uma das formas de ataque mais conhecidas é a SYN Flooding, onde um computador tenta estabelecer uma conexão com um servidor através de um sinal do TCP conhecido por SYN (Synchronize). Se o servidor atender o pedido de conexão, enviará ao computador solicitante um sinal chamado ACK (Acknowledgement). O problema é que em ataques desse tipo, o servidor não consegue responder a todas as solicitações e então passa a recusar novos pedidos. Outra forma de ataque comum é o UPD Packet Storm, onde um computador faz solicitações constantes para que uma máquina remota envie pacotes de respostas ao solicitante. A máquina fica tão sobrecarregada que não consegue executar suas funções. Ataques DDoS O DDoS, sigla para Distributed Denial of Service, é um ataque DoS ampliado, ou seja, que utiliza até milhares de computadores para atacar uma determinada máquina. Esse é um dos tipos mais eficazes de ataques e já prejudicou sites conhecidos, tais como os da CNN, Amazon, Yahoo, Microsoft e eBay. Para que os ataques do tipo DDoS sejam bem-sucedidos, é necessário que se tenha um número grande de computadores para fazerem parte do ataque. Uma das melhores formas encontradas para se ter tantas máquinas, foi inserir programas de ataque DDoS em vírus ou em softwares maliciosos. Em um primeiro momento, os hackers que criavam ataques DDoS tentavam "escravizar" computadores que agiam como servidores na internet. Com o aumento na velocidade de acesso à internet, passou-se a existir interesse nos computadores dos usuários comuns com acesso banda larga, já que estes representam um número muito grande de máquinas na internet. Para atingir a massa, isto é, a enorme quantidade de computadores conectados à internet, vírus foram e são criados com a intenção de disseminar pequenos programas para ataques DoS. Assim, quando um vírus com tal poder contamina um computador, este fica disponível para fazer parte de um ataque DoS e o usuário dificilmente fica sabendo que sua máquina está sendo utilizado para tais fins. Como a quantidade de computadores que participam do ataque é grande, é praticamente impossível saber exatamente qual é a máquina principal do ataque. Quando o computador de um internauta comum é infectado com um vírus com funções para ataques DoS, este computador passa a ser chamado de zumbi. Após a contaminação, os zumbis entram em contato com máquinas chamadas de mestres, que por sua vez recebem orientações (quando, em qual site/computador, tipo de ataque, entre outros) de um computador chamado atacante. Após receberem as ordens, os computadores mestres as repassam aos computadores zumbis, que efetivamente executam o ataque. Um computador mestre pode ter sob sua responsabilidade até milhares de computadores. Repare que nestes casos, as tarefas de ataque DoS são distribuídas a um "exército" de máquinas escravizadas. Daí é que surgiu o nome Distributed Denial of Service. Impedindo e detectando ataques DoS Apesar de não existir nenhum meio que consiga impedir totalmente um ataque DoS, é possível detectar a presença de ataques ou de computadores (zumbis) de uma rede que estão participando de um DDoS. Para isso, basta observar se está havendo mais tráfego do que o normal (principalmente em casos de sites, seja ele um menos conhecido, como o InfoWester, seja ele um muito utilizado, como o Google), se há pacotes TCP e UDP que não fazem parte da rede ou se há pacotes com tamanho acima do normal. Outra dica importante é utilizar softwares de IDS (Intrusion Detection System - Sistema de Identificação de Intrusos). Para prevenção, uma das melhores armas é verificar as atualizações de segurança dos sistemas operacionais e softwares utilizados pelos computadores. Muitos vírus aproveitam de vulnerabilidades para efetuar contaminações. Também é importante filtrar certos tipos de pacotes na rede e desativar serviços que não são usados. Fonte: http://www.infoweste...m/col091004.php Primeiramente use um servidor LINUX Dicas para se dificultar a ação de Ddos A equipe de segurança da LinuxSvr.Net tem algumas dicas aos clientes sel-managed. Utilize o Módulo Dos_Evasive (Apache) É importante saber que bloquear um ataque Ddos usando software é possível em apenas 20% dos casos, e que é necessário perícia e conhecimento técnico avançado para isso. Para saber mais: Atualizado 2023. Utilize o Módulo Dos_Evasive (Apache)
  12. Assim que for aprovado esta aqui o sistema.
  13. @ApacheBom dia! tenta este por favor, caso não funcione abre um tópico com seu pedido que te ajudo por la! local item_id,amount = 7721,1 function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerItemCount(cid,item_id,amount) then if (getCreatureSkullType(cid) == SKULL_RED or SKULL_BLACK) then doCreatureSetDropLoot(cid, FALSE) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA) end if not(getPlayerBlessing(cid, bless[i])) then for i = 1, table.maxn(bless) do doPlayerAddBlessing(cid, bless[i]) end end end end return TRUE end
  14. @luanluciano93 quanto tempo hein! Bom ver que ainda tem boas pessoas na comunidade, obrigado pelo comentário! Você ta no rank dos melhores programadores aqui do fórum tmj(Minha opinião) aqui quem vos fala é Underewar
  15. O sistema funciona pelo Target do Monstro, e Regenera Stamina Points. Em events/scripts/creature.lua Vamos Adicionar a função a Baixo. No mesmo script vamos procurar por Creature:onTargetCombat(target) E colocar logo a baixo o seguinte script Onde está == "Trainer" Coloque o nome do trainer do seu servidor.
  16. Coloque esse login.php na pasta raiz do seu website. https://github.com/opentibiabr/myaac-tibia12-login/releases/tag/2.0
  17. Ele verifica se o jogador esta black ou red e caso estiver seta o drop loot para false, para dropar o item mude para true doCreatureSetDropLoot(cid, FALSE) Vou deixar aqui uma lista organizada das lua functions até a versão 0.3.6 da TFS pode te ajudar a implementar o sistema. Espero que te ajude.
  18. procure pelo player.lua do seu servidor procure por : function Player:onLoseExperience(exp) return exp end E troque essa função por essa. function Player:onLoseExperience(exp) local Amulets = { [ITEMID] = {ExpLossProtection = 0.3, LoseAfter = true} [ITEMID] = {ExpLossProtection = 0, LoseAfter = false}, [ITEMID] = {ExpLossProtection = 1, LoseAfter = true } } local amulet = self:getSlotItem(CONST_SLOT_NECKLACE) if Amulets[amulet.itemid] then exp = exp * Amulets[amulet.itemid].ExpLossProtection if Amulets[amulet.itemid].LoseAfter then charges-1 end end return exp end Não sei se o código a cima funciona na tfs 0.4 no entanto é possivel fazer na tfs 0.4 CreatureScript XML: <event type="preparedeath" name="blessAmulet" script="script.lua"/> local bless = {1, 2, 3, 4, 5} local amulet = amulet id function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (isPlayer(cid) == TRUE) then if (getPlayerSlotItem(cid, CONST_SLOT_NECKLACE).itemid == amulet) then if (getCreatureSkullType(cid) == SKULL_RED or SKULL_BLACK) then doCreatureSetDropLoot(cid, FALSE) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA) end if not(getPlayerBlessing(cid, bless[i])) then for i = 1, table.maxn(bless) do doPlayerAddBlessing(cid, bless[i]) end end end end return TRUE end
  19. Erro meu tente este trocar por: int32_t healthPercent = round((double)(healthChange) / target->getMaxHealth()); sprintf(buffer, "+%.2f", healthPercent); trocar por: int32_t healthPercent = round((double)(damage) / target->getMaxHealth()); sprintf(buffer, "-%.2f", healthPercent);
  20. Tá vamos la, o código esta totalmente correto e muito organizado parabéns, no entanto você esta inicializando uma speed nova para a montaria. Incluindo o player.h (acredito que você criou novos cpp e headers para criar este código) Acessamos a velocidade atual do jogador retornando ela e podemos usar como quiser para alterar, acredito que o calculo deva ser o base speed + o speed da mount e não iniciar ela em zero... int32_t ExtSpeed = 0; Acredito que você deveria setar o PLAYER_MAX_SPEED para realmente alterar velocidade máxima que o jogador deve ser da seguinte maneira, definido o player flag para a flag hasMaxSpeed in group or player constructor. if (!hasFlag(PlayerFlag_SetMaxSpeed)) { baseSpeed = vocation->getBaseSpeed();
  21. @stauroEstá resolvido? se sim poderia compartilhar? como resolveu, obg!
  22. Qual source você ?
  23. Cria um creaturescript verificando o login dos jogadores por storage, ou uma tabela de storages chamada reset, e verifica o nivel do reset que o jogador esta por storage, você pode atribuir ao jogador usando o seguinte código. Adicionando no combat.cpp Nas funções CombatHealthFunc and CombatManaFunc Procure por: int32_t change = 0; if(Combat2Var* var = (Combat2Var*)data) { change = var->change; E no final do escopo ou seja quando a chave fechar } Cole isso: if(caster && caster->getPlayer()) { std::string value; caster->getStorage("ResetStorageValue", value); int32_t plus = (int32_t)(atoi(value.c_str())); int32_t resetpower = plus *2.5 ; if(plus > 0 && params.combatType != COMBAT_HEALING ) change = (int32_t)std::ceil (change + change * resetpower /100); } Em caster -> getStorage é a storage que o jogador ganha no reset. resetpower = plus * 2.5 é a formula. change = (change + change * resetpower / 100) é o calculo .
  24. Eu não testei no entanto oque eu fiz foi o seguinte. Isso imprimirá o valor de "total" (é o que % é, em seguida, o total faz) com 2 pontos flutuantes seja exibido (é o que .2f faz). trocar por: int32_t healthPercent = round((double)(healthChange) / target->getMaxHealth()); sprintf(buffer, "+%.2f", healthPercent); trocar por: int32_t healthPercent = round((double)(damage) / target->getMaxHealth()); sprintf(buffer, "-%.2f", healthPercent);

Informação Importante

Confirmação de Termo