Ir para conteúdo
  • 0
shocks

Scripting Sistema de Exercise Training

Pergunta

shocks    2
shocks

Base:  TFS 1.3 Custom

 

Estou com um script de exercise training e ele da 1 de skill a cada charge da arma, porem queria saber como editar para ele dar Skill Tries de acordo com a stage do servidor ao invez de dar 1 skill  por charge.

 

 

Código: 

Spoiler

local skills = {
    [31821] = {id=SKILL_SWORD,voc=4},
    [31822] = {id=SKILL_AXE,voc=4},
    [31823] = {id=SKILL_CLUB,voc=4},
    [31824] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW},
    [31825] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_ENERGY},
    [31826] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE},
}

------- CONFIG -----//
local dummies = {31832,31833,31828,31829,31830,31831}
local skill_gain = 1 -- per hit
local gain_stamina = 60

local function start_train(pid,start_pos,itemid,fpos)
    local player = Player(pid)
    if player ~= nil then
        local pos_n = player:getPosition()

    if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then
            if player:getItemCount(itemid) >= 1 then
                local exercise = player:getItemById(itemid,true)

                if exercise:isItem() then
                    if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then
                        local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES)

                        if charges_n >= 1 then
                            exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES, (charges_n-1))

                            local required = 0
                            local currently = 0
                            local voc = player:getVocation()

                            if skills[itemid].id == SKILL_MAGLEVEL then
                                required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain
                                currently = player:getManaSpent()
                                player:addManaSpent(required - currently)
                            else
                                required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain
                                currently = player:getSkillTries(skills[itemid].id)

                                player:addSkillTries(skills[itemid].id, (required - currently))
                            end

                            fpos:sendMagicEffect(CONST_ME_HITAREA)
                            if skills[itemid].range then
                                pos_n:sendDistanceEffect(fpos, skills[itemid].range)
                            end
                            player:setStamina(player:getStamina() + 60)

                            if charges_n == 1 then 
                                exercise:remove(1)
                                return true
                            end
                            local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos)
                        else
                            exercise:remove(1)
                            stopEvent(training)
                        end
                    end
                end
            end
        else
            stopEvent(training)
        end
    else
        stopEvent(training)
    end
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local start_pos = player:getPosition()

    if target:isItem() then
        if isInArray(dummies,target:getId()) then
            if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then
                stopEvent(training)
                return false
            end
            if not player:getVocation():getId() == skills[item.itemid].voc or not player:getVocation():getId() == (skills[item.itemid].voc+4) then
                stopEvent(training)
                return false
            end
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You started training.")
            start_train(player:getId(),start_pos,item.itemid,target:getPosition())
        end
    end

    return true
end

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

8 respostass a esta questão

Recommended Posts

  • 3
GryLLo    19
GryLLo
Em 15/01/2019 em 16:49, shocks disse:

@GryLLo Tentei adicionar as informações porem ocorreu este erro: image.png.ea7d3f73e0fac74052cdfda2d7f343a5.png

O apenas alterei as informações inicias e deixei o codigo assim:

Se puder me explicar porque a chamada está dando valor nulo agradeço tambem hehe, bom pra aprendizado. :P

 

 valor está dando nulo porque a variável voc não existe ali fora.

Altere:

required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain
currently = player:getManaSpent()
player:addManaSpent(required - currently)

Para:

local up_skill = exercise_mana_use * configManager.getNumber(configKeys.RATE_MAGIC)
player:addManaSpent(up_skill)

exercise_mana_use você pode inserir um valor equivalente a quanto de mana cada HIT da exercise wand/rod valerá.
Se você colocar 1000, cada HIT da exercise será o mesmo que usar 1000 de mana (isso em RATE 1X)

E depois altere:

required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain
currently = player:getSkillTries(skills[itemid].id)
player:addSkillTries(skills[itemid].id, (required - currently))						

Para:

local skillId = skills[itemid].id
local up_skill = exercise_hit * configManager.getNumber(configKeys.RATE_SKILL)
player:addSkillTries(skillId, up_skill)

exercise_hit você pode inserir um valor equivalente a quantos HITS cada HIT da exercise sword/axe/club/dist valerá.
Se você colocar 10, cada HIT da exercise será o mesmo que dar 10 HITS  em monstros (isso em RATE 1X)


É nóssssssssssss e TO VAZANDO AGORA, BEJUS

Editado por GryLLo
TAVA TUDO ERRADO

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 1
shocks    2
shocks

Boa tarde Gryllo, estava dando uma olhada como sou meio fraco na parte de lua, chequei a função que você me passou

No caso eu poderia alterar para este jeito??

local to_up_skill = ((voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain)/Quantidade de hits);

 

E no

local skill_gain = 1 -- per hit alteraria para local skill_gain = to_up_skill -- per hit

Só puder me da uma luz ou confirmada se é isso mesmo kk

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
GryLLo    19
GryLLo

Hello @shocks tudo bom brother?

Então, ta logo no início do código onde você precisa fazer modificação, nessa linha:

local skill_gain = 1 -- per hit

Ali está escrito pra dar 1 skill por hit, se você quiser que seja um treinamento aprimorado, terá de fazer cálculos. Primeiro crie um boost pro próprio exercise, vamos chamá-lo de exercise_boost, e vamos fazer com que ele seja equivalente a 30 hits, ou seja, cada hit da exercise equivalerá a 30 hits. Agora vamos supor que cada SWORD FIGHTING acrescente 50% a mais de hits que você precisa dar pra subir a skill, ou seja, se SWORD 30 pro 31 precisar de 10 hits, pro 32 vai precisar de 10 + 5 (50% de 10) = 15, seguindo esse raciocínio você pode começar a calcular:

Pega a skill do jogador (80 sword) e calcula a quantidade de hits que você precisa pro 81;
Acrescenta o boost que você quiser no exercise training (exercise_boost);
Coloca tudo na variável skill_gain;

Ficando mais ou menos assim:

-- pega a quantidade de hits, finge que é 30000 divide por 30 ficando 1000, sendo necessário 1000 hits para subir a skill.
local to_up_skill = quantidade_hits / exercise_boost;

Aplica uma regra de 3 simplona! (1000 = 100; 1 = x)
1000x = 100.1
x = 100/1000
x = 0.1

Aqui você descobre quantos % cada hit vai dar, pra não ter que alterar a lógica do seu código que 1 equivale a 100, pegamos o x e dividimos por 100.
0.1 / 100 = 0.001

Agora sim, temos o valor de skill_gain, que é 0.001, ou seja, 0.001%  por hit, até alcançar os 1000 hits necessários pro up.
Power of matemática mai friendi.

EDIT1: Você pode usar a mesma ideia pro MAGIC, porém nesse o calculo é utilizado a quantidade de mana gasta.


É nóissssssssssssss.

Editado por GryLLo
EDIT1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
GryLLo    19
GryLLo
39 minutos atrás, shocks disse:

Boa tarde Gryllo, estava dando uma olhada como sou meio fraco na parte de lua, chequei a função que você me passou

No caso eu poderia alterar para este jeito??


local to_up_skill = ((voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain)/Quantidade de hits);

 

E no


local skill_gain = 1 -- per hit alteraria para local skill_gain = to_up_skill -- per hit

Só puder me da uma luz ou confirmada se é isso mesmo kk

Hmm, não é bem desse jeito.

voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)

Já pega a quantidade de HITS que você precisa pra upar a skill.

local qntHits = getRequiredSkillTries...

Daí você precisa definir o boost que tua exercise irá dar (cada hit da exercise equivale a quantos hits normais?).
O resto está no post que fiz acima, só você dar uma olhadinha e ler atentamente você finaliza isso aí.

Caso consiga finalizar o que precisava, avise no DS que o tópico foi respondido!
É nóissssssssssssss

Editado por GryLLo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
Kuma Bear    33
Kuma Bear
Citar

Segundo um post do CM Burchan no fórum oficial, tanto a Exercise Rod quanto a Exercise Wand possuem a mesma efetividade de 610 Ultimate Mana Potions, ou aproximadamente 305.000 pontos de mana.

Citar

Item com 500 cargas. Utilizado para treinar nos Exercise Dummies.

Em:

required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain
currently = player:getManaSpent()
player:addManaSpent(required - currently)

Fica:

player:addManaSpent(610)

 

não lí o código inteiro, se for haver algum problema, será na quantidade de charges que eu não sei onde fica, deve ficar no item

mas se o código se comportar da maneira que eu espero que se comporte (executa a cada hit da wand), isso aí já basta

Editado por bolotabunito

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
GryLLo    19
GryLLo
11 minutos atrás, bolotabunito disse:

Em:


required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain
currently = player:getManaSpent()
player:addManaSpent(required - currently)

Fica:


player:addManaSpent(610)

 

não lí o código inteiro, se for haver algum problema, será na quantidade de charges que eu não sei onde fica, deve ficar no item

mas se o código se comportar da maneira que eu espero que se comporte (executa a cada hit da wand), isso aí já basta

Boa @bolotabunito xD
Isso citado acima serve pro ML em servidor 1x.
Pra utilizar o rate do seu servidor ficaria assim:

player:addManaSpent(610 * configManager.getNumber(configKeys.RATE_MAGIC))

Sobre o treino dos outros skills você não consegue fugir muito dos cálculos, acredito eu.
Infelizmente o CM divulgou apenas sobre o treino de ML, os treinos das outras SKILLS não parece ter sido divulgado ainda.

É nóisssssssss

Editado por GryLLo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
shocks    2
shocks

@GryLLo Tentei adicionar as informações porem ocorreu este erro: image.png.ea7d3f73e0fac74052cdfda2d7f343a5.png

O apenas alterei as informações inicias e deixei o codigo assim:

Spoiler

local skills = {
	[31821] = {id=SKILL_SWORD,voc=4},
	[31822] = {id=SKILL_AXE,voc=4},
	[31823] = {id=SKILL_CLUB,voc=4},
	[31824] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW},
	[31825] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_ENERGY},
	[31826] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE},
}

------- CONFIG -----//
local dummies = {31832,31833,31828,31829,31830,31831}
local qntHits = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)
local to_up_skill = qntHits/20;
local skill_gain = to_up_skill -- per hit
local gain_stamina = 60

local function start_train(pid,start_pos,itemid,fpos)
	local player = Player(pid)
	if player ~= nil then
		local pos_n = player:getPosition()

	if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then
			if player:getItemCount(itemid) >= 1 then
				local exercise = player:getItemById(itemid,true)

				if exercise:isItem() then
					if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then
						local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES)

						if charges_n >= 1 then
							exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES, (charges_n-1))

							local required = 0
							local currently = 0
							local voc = player:getVocation()

							if skills[itemid].id == SKILL_MAGLEVEL then
								required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain
								currently = player:getManaSpent()
								player:addManaSpent(required - currently)
							else
								required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain
								currently = player:getSkillTries(skills[itemid].id)

								player:addSkillTries(skills[itemid].id, (required - currently))
							end

							fpos:sendMagicEffect(CONST_ME_HITAREA)
							if skills[itemid].range then
								pos_n:sendDistanceEffect(fpos, skills[itemid].range)
							end
						    player:setStamina(player:getStamina() + 60)

						    if charges_n == 1 then 
								exercise:remove(1)
								return true
						    end
							local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos)
						else
							exercise:remove(1)
							stopEvent(training)
						end
					end
				end
			end
		else
			stopEvent(training)
		end
	else
		stopEvent(training)
	end
	return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	local start_pos = player:getPosition()

	if target:isItem() then
		if isInArray(dummies,target:getId()) then
			if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then
				stopEvent(training)
				return false
			end
			if not player:getVocation():getId() == skills[item.itemid].voc or not player:getVocation():getId() == (skills[item.itemid].voc+4) then
				stopEvent(training)
				return false
			end
		    player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You started training.")
			start_train(player:getId(),start_pos,item.itemid,target:getPosition())
		end
	end

	return true
end

 

Se puder me explicar porque a chamada está dando valor nulo agradeço tambem hehe, bom pra aprendizado. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
shocks    2
shocks

Funcionando perfeitamente agora, foi só editar os  valores de acordo com a nescessidade xD 

@GryLLo  e @bolotabunito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×