Postado Setembro 12, 2014 10 anos Este é um post popular. Eai 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: Mostrar conteúdo oculto function isThatWeapon(uid) -- Function by Mock the bear. uid = uid or 0 local f = getItemWeaponType(uid) if f == 1 or f == 2 or f == 3 or f == 5 or f == 6 then return true end return false end function getWeapon(uid) -- Function by Night Wolf teste = getPlayerSlotItem(uid, CONST_SLOT_RIGHT) if teste.itemid > 0 then if not isThatWeapon(teste.uid) then teste = getPlayerSlotItem(uid, CONST_SLOT_LEFT) end else teste = getPlayerSlotItem(uid, CONST_SLOT_LEFT) end if teste.itemid > 0 then if not isThatWeapon(teste.uid) then teste = false end else teste = false end return teste end function getItemLevel(uid, maxlevel) -- Function By Night Wolf level = 0 local name = getItemName(uid) for i = 1, maxlevel do if string.find(tostring(name),"+".. i .."") then level = i end end return level end Feito isso crie um arquivo em creaturescripts\scripts chamado itemexp.lua e adicione isso daqui: Mostrar conteúdo oculto function onKill(cid, target, lastHit) local upgrade = { [1] = {required = 1000}, [2] = {required = 10000}, [3] = {required = 100000}, [4] = {required = 1000000}, [5] = {required = 10000000} } local teste = getWeapon(cid) if teste == false or not isMonster(target) then return true end if getCreatureMaster(target) ~= target then return true end local pos = getThingPos(cid) local level = getItemLevel(teste.uid, #upgrade) if level >= #upgrade then doItemSetAttribute(teste.uid, "description", "Experience: ["..upgrade[level].required.."/"..upgrade[level].required.."]") return true end local count = math.floor((getMonsterInfo(string.lower(getCreatureName(target))).experience)) local expatual = getItemAttribute(teste.uid, "exp") or 0 local newexp = expatual+count if newexp >= upgrade[level + 1].required then doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,"You leveled your "..getItemNameById(teste.itemid).." to ".. level+1 ..".") doItemSetAttribute(teste.uid,'name', getItemNameById(teste.itemid)..' +'..(level+1)) doSendMagicEffect(pos, math.random(28,30)) doItemSetAttribute(teste.uid, "exp", 0) if level + 2 <= #upgrade then doItemSetAttribute(teste.uid, "description", "Experience: [".. 0 .."/"..upgrade[level + 2].required.."]") end else doItemSetAttribute(teste.uid, "exp", expatual+count) doItemSetAttribute(teste.uid, "description", "Experience: ["..(expatual+count).."/"..upgrade[level + 1].required.."]") doPlayerSendTextMessage(cid, 27, "Congratulations, you get the experience of a ".. getCreatureName(target) .."!") end return true end Agora crie outro arquivo em creaturescripts\scripts, adicione isso daqui nele e chame de conditionitem.lua: Mostrar conteúdo oculto local area = createCombatArea( { {0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}, {1, 1, 3, 1, 1}, {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0} }) local manaup = createConditionObject(CONDITION_FOOD) setConditionParam(manaup, CONDITION_PARAM_TICKS, 5000) setConditionParam(manaup, CONDITION_PARAM_BUFF, true) setConditionParam(manaup, CONDITION_PARAM_MANAGAIN, 15) setConditionParam(manaup, CONDITION_PARAM_MANATICKS, 1000) local um = createConditionObject(CONDITION_PHYSICAL) setConditionParam(um, CONDITION_PARAM_DELAYED, 1) local damageTable1 = { {3, -5}, {3, -3}, {3, -2} } for i = 1, #damageTable1 do local t = damageTable1[i] addDamageCondition(um, t[1], 1000, t[2]) end local dois = createConditionObject(CONDITION_PHYSICAL) setConditionParam(dois, CONDITION_PARAM_DELAYED, 1) local damageTable2 = { {3, -10}, {3, -5}, {3, -3} } for i = 1, #damageTable2 do local t = damageTable2[i] addDamageCondition(dois, t[1], 1000, t[2]) end local tres = createConditionObject(CONDITION_PHYSICAL) setConditionParam(tres, CONDITION_PARAM_DELAYED, 1) local damageTable3 = { {3, -20}, {3, -10}, {3, -8} } for i = 1, #damageTable3 do local t = damageTable3[i] addDamageCondition(tres, t[1], 1000, t[2]) end local quatro = createConditionObject(CONDITION_PHYSICAL) setConditionParam(quatro, CONDITION_PARAM_DELAYED, 1) local damageTable4 = { {3, -40}, {3, -20}, {3, -15} } for i = 1, #damageTable4 do local t = damageTable4[i] addDamageCondition(quatro, t[1], 1000, t[2]) end local cinco = createConditionObject(CONDITION_PHYSICAL) setConditionParam(cinco, CONDITION_PARAM_DELAYED, 1) local damageTable5 = { {3, -100}, {3, -50}, {3, -30} } for i = 1, #damageTable5 do local t = damageTable5[i] addDamageCondition(cinco, t[1], 1000, t[2]) end function onAttack(cid, target) function getLeveltoStr(level) -- Function By Night Wolf local str = {um, dois, tres, quatro, cinco, seis, sete, oito, nove, dez, onze, doze, treze, quatorze, quinze} return str[level] end if isPlayer(cid) and isCreature(target) then if getWeapon(cid) ~= false then level = getItemLevel((getWeapon(cid)).uid, 5) if level > 0 and math.random(100) < ((level * 10)/2) then local f = getItemWeaponType((getWeapon(cid)).uid) if (f == 1 or f == 3) and getDistanceBetween(getThingPos(cid), getThingPos(target)) < 2 then doTargetCombatCondition(cid, target, getLeveltoStr(level), 255) elseif f == 5 and getDistanceBetween(getThingPos(cid), getThingPos(target)) < 8 then doTargetCombatCondition(cid, target, getLeveltoStr(level), 255) elseif f == 2 and getDistanceBetween(getThingPos(cid), getThingPos(target)) < 2 then damage = getItemInfo((getWeapon(cid)).itemid).attack doAreaCombatHealth(cid, COMBAT_PHYSICALDAMAGE, getThingPos(target), area, -2*(level + tonumber(damage)), -4*(level + tonumber(damage)), 34) elseif f == 6 then if not getCreatureCondition(cid, CONDITION_FOOD) then doAddCondition(cid, manaup) doTargetCombatMana(cid, target, -(level * 25), -(level * 50), 1) for i = 1, 5 do addEvent(function() if isCreature(cid) then doSendMagicEffect(getThingPos(cid), 12) end end, 1 + (1000*i)) end end end end end end return true end Agora configurando: Mostrar conteúdo oculto No primeiro script não tem muito oque mudar, vc coloca a experiencia requerida pra cada nivel e o número de níveis, sendo 5 o padrão. No segundo temos isso daqui: Citar local area = createCombatArea( { {0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}, {1, 1, 3, 1, 1}, ------ area do ataque quando a clube dá dano em área {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0} }) local manaup = createConditionObject(CONDITION_FOOD) setConditionParam(manaup, CONDITION_PARAM_TICKS, 5000) --- tempo que vai ficar dando mana qnd se usa wand (em milisegundos) setConditionParam(manaup, CONDITION_PARAM_BUFF, true) setConditionParam(manaup, CONDITION_PARAM_MANAGAIN, 15) --- quanto de mana ganha a cada tick setConditionParam(manaup, CONDITION_PARAM_MANATICKS, 1000) -- de quanto em quanto tempo dá o tick (em milisegundos) --- no caso vai durar 5 segundos e durante esse tempo a cada 1 segundo ganhamos 15 de mana local um = createConditionObject(CONDITION_PHYSICAL) setConditionParam(um, CONDITION_PARAM_DELAYED, 1) local damageTable1 = { {3, -5}, --- {quantidade de hits, dano que vai tirar} {3, -3}, --- esta dividido em 3 partes pra simular que o sangue está sendo estancado aos poucos {3, -2} } for i = 1, #damageTable1 do local t = damageTable1 addDamageCondition(um, t[1], 1000, t[2]) --- nesse 1000 vc edita de quanto em quanto tempo vai sangrar end Obs: tudo que está no local um serve pros locais dois, tres, quatro e cinco pra configurar o nivel de sangramento em cada nível, tanto a velocidade que sangra como o dano que sai. No caso, sendo nivel 1 ele vai tirar 3x de -5, 3x de -3 e 3x de -2 antes de sumir, isso dá -30 de dano total em 9 segundos. Citar if level > 0 and math.random(100) < ((level * 10)/2) --- aqui vc configura a formula da chance de ativar a passiva do item, é o nivel dela * 10 /2 Citar doAreaCombatHealth(cid, COMBAT_PHYSICALDAMAGE, getThingPos(target), area, -2*(level + tonumber(damage)), -4*(level + tonumber(damage)), 34) --- aqui vc tem o dano da club em área, o dano minimo é 2* o level da arma + o ataque dela e o dano máximo é 4* o level + o ataque dela Citar doTargetCombatMana(cid, target, -(level * 25), -(level * 50), 1) --- aqui vc tem o dano que vai tirar no roubo de mana das wands/rods.. no caso é o level da arma * 25 no minimo e o level da arma * 50 no máximo. --- assim uma arma nivel 5 vai tirar no minimo 125 e no máximo 250 de mana 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 Editado Abril 21, 2015 10 anos por xWhiteWolf (veja o histórico de edições) Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Setembro 12, 2014 10 anos Parabéns cara , ótima script , bem original! Muito bom, já vou instalar no meu servidor. REPUTADO LONADOVISK ♥
Postado Setembro 12, 2014 10 anos ficou mt massa concerteza vou usar no meu servidor +rep Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas. discord.gg/phJZeHa2k4 Projeto ATS (Naruto) Informações Abaixo Facebook Youtube Discord Tutoriais / Conteúdos Clique Aqui
Postado Setembro 12, 2014 10 anos muito bom, gostei do RPG proposto, achei criativo também Ot Design: https://discord.gg/VgtVRNmCD7
Postado Setembro 12, 2014 10 anos Autor Tava na hora de eu fazer um script da minha cabeça mesmo, fico sempre fazendo oque os outros pedem :~~~ Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.