Ir para conteúdo
Banner com Efeitos

Featured Replies

Postado
  • 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:

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:

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:

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:


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:

 

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.

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

 

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

 

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 ;D

Editado 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

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

  • Respostas 109
  • Visualizações 10.4k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • [1] = {required = 1000}, -- qnt de exp precisa pra cada nivel no formato [nv] = {required = experiencia requerida} [2] = {required = 10000}, [3] = {required = 100000}, [4] = {required = 1000000}, [5]

  • @Coul, é só remover o restante dos prints agr que vc sabe que funciona   @Ayna, até daria pra fazer mas tem que fazer pela source pra n ficar gambiarra.. porque o player pode upar e qnd remover a es

  • Tava na hora de eu fazer um script da minha cabeça mesmo, fico sempre fazendo oque os outros pedem :~~~

Posted Images

Postado
  • 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

I7Pm6ih.png

(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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo