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)
Postado Setembro 12, 2014 10 anos Parabéns cara , ótima script , bem original! Muito bom, já vou instalar no meu servidor. REPUTADO
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 :~~~
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.