Suporte no desenvolvimento de jogos



1 Resultado encontrado para CheckBox

Profane ~

[Prof ~] Sistema de Transformação - Ter Jul 04, 2017 7:27 pm

Oin!

######
Desabafo
######

É com muita insatisfação, que eu trago esse sistema. Mas porque insatisfação? 
Ué, eu acompanho e ajudo em mais de 10 projetos, a qual todos parecem querer esse sistema,
me trazerem inúmeros erros e isso é um saco ta respondendo sempre a mesma coisa, para algo que foi feito de "forma errada", não exatamente errada, mas de forma "burra".

Espero encarecidamente que aqueles que forem usar, aprendam a ter noção das coisas mais "direitas", e que não se contentem com o "pouco", se querem algo decente no projeto de vocês, vocês precisam buscar e ir atrás de meliorar ;3

Esse é o Intuito da Aldeia, formar vocês para que façam projetos Bons para nós!

Primeiro dê Play nisso aqui:
https://www.youtube.com/watch?v=Gs89xBcfgKI

Vamos ao Sistema!

#########
Ficha Técnica
#########

Nome do Sistema: Sistema de Transformação
Nível de Dificuldade: Nenhum já que você vai copiar e colar ;v ué k
Compatibilidade: Qualquer EO ou Crystal
Programa Necessário: Visual Basic 6
 | Função |
 - É uma Spell? Não exatamente, é algo decente. Será um Complemento a qual você vai poder aplicar a qualquer tipo de Spell. Mas porque? Porque eu sou acostumada a fazer coisas ilimitadas e abertas e não coisas para mentes fechadas.

Como funcionará? Você irá marcar apenas 1 caixinha, e em QUALQUER tipo de spell, você marca essa caixinha e configura a Transformação para QUALQUER tipo de Spell. 

Isso libera que você faça uma Spell de DANO, e mesmo assim se Transforme. 
OU de cura? mas porque?

Ué, Imagine você se transformando e acontecendo uma grande explosão ao mesmo tempo? Você se transforma e explode a area toda como efeito da sua transformação;

Ou mesmo você cura a area toda e se transforma em um Anjo Op com status aumentados ué uashuhsa, ser uma "Capacidade", algo "adicional" as spells abre um leque infundado de fusões.

 | Observação |
Neste Sistema de Transformação eu estarei usando uma CrystalShire Comum, os códigos em nada serão diferentes das EO comum, então a compatibilidade é Global. 

Porém diferente do aumento comum de Atributos, eu alterarei apenas 4 Valores.
Serão eles:

-HP 
-MP
-DANO
-DEFESA

Você pode customizar e adicionar quantos quiser, EXP, REGEN, e o caralho a 4, basta você usar a lógica.

#########
Pedido
#########

Se for usar, seria interessante deixar os Créditos de onde você tirou esse sistema, digo a Aldeia! Traga mais pessoas para este meio xD Assim teremos mais mundos, e mais historias para viver.

#########
Adicional
#########

Sobre o Sistema, ninguém tem "integridade" sobre nada, é programação, o sistema não é meu, o sistema é de quem usa, eu sou apenas o instrumento a qual usou a cabeça para montar, porque qualquer um que seja capaz é capaz de montar.

Vamos ao Work.



#########
 Client - Side
#########

[1] Preparando o Terreno.

Aqui iremos preparar a Form do Editor de Spells para a Transformação; No seu cliente, na frmEditor_Spell, crie uma area dessa forma: ( http://prntscr.com/frngwt ) - http://prntscr.com/frngwt

Tópicos com a tag checkbox em Aldeia RPG 0fOHbYvhTMib3TDgD0ykLw

São 2 CheckBox, Labels para nomear as Áreas e 6 TextBox.

Preencha os Componentes com os Seguintes nomes:

#CheckBox de Transformação:
Name: chkHasTransform

#CheckBox de Mudar Sprite?
Name: chkChangeSprite

#textBox da Sprite
Name: txtTransSprite
MaxLenght: 3                        'Observe isso aqui, é importante limitar para você não acabar pondo um valor absurdo!!

#TextBox do Tempo
Name: txtTransTime

#textBox do Hp
Name: txtTransHp

#textBox do Mp
Name: txtTransMp

#textBox do Poder
Name: txtTransPoder

#textBox do Defesa
Name: txtTransDefesa

Agora com nosso esquema montado vamos aos Scripts ;3 
Acesse a área de Códigos da FrmEditor_Spells, basta clicar nela com o botão direito, e por CodeView

Tópicos com a tag checkbox em Aldeia RPG KOem7ySqRtmDcfjNeqXQwQ

Agora estamos na área de códigos da FrmEditor_Spells.

No fim dela adicione isso aqui:


Dentro do PasterBin, basta copiar e colar para o fim do seu FRMEDITOR_SPELLS!!!


[2] Preparando as Variáveis 

Seguindo agora para o ModTypes, dentro do Cliente.
Aqui encontramos diversas classes, mas estamos procurando pela: Private Type SpellRec


No Fim dela, antes do End Type, no caso ainda "dentro" dela.

Adicione:
Código:
Transform As SpellTransformRec


Adicionando isso, agora ACIMA!!!! da Private Type SpellRec adicione isso aqui:

Código:
Private Type SpellTransformRec
    HasTransform As Byte        'Está habilitada a transformação?
    ChangeSprite As Byte        'Está habilitada a mudança de Sprite?
    
    TransSprite As Long         'Valor que salva o numero da transformação.
    TransTimer As Long          'Salva o Tempo de Transformação em Segundos.
    
    HpPercent As Long           'Guarda o % de Acrescimo de Hp
    MpPercent As Long           'Guarda a % de Acrescimo de Mp
    PoderPercent As Long        'Guarda a % de Acrescimo de Poder
    DefesaPercent As Long       'Guarda a % de Acrescimo de Defesa
End Type


Pronto, modTypes do Cliente está pronto! Falta por a mesma coisa no Servidor, mas faremos quando chegar no servidor.


[3] Cuidando do Inicializador do Editor de Spells.

No ModGameEditors, procure por : Public Sub SpellEditorInit()


Dentro dele é que vamos trabalhar agora, ele é responsável por fazer a "load" de cada spell que você clica para editar no Editor de Spells.

Então precisamos atualizar essa criança para ele ler os valores novos.

Antes do End With ,que fica em cima do Spell_Changed(EditorIndex) = True , você adiciona isso aqui:
Segue Imagem: http://prntscr.com/fro1ub  // http://prntscr.com/fro1ub

Código:
 'Trans MoonShine by Profane
        If Spell(EditorIndex).Transform.HasTransform > 0 Then
            .chkHasTransform.Value = 1
        Else
            .chkHasTransform.Value = 0
        End If
        
        If Spell(EditorIndex).Transform.ChangeSprite > 0 Then
            .chkChangeSprite.Value = 1
        Else
            .chkChangeSprite.Value = 0
        End If
        
        .txtTransSprite.Text = Spell(EditorIndex).Transform.TransSprite
        .txtTransTime.Text = Spell(EditorIndex).Transform.TransTimer
        
        .txtTransHp.Text = Spell(EditorIndex).Transform.HpPercent
        .txtTransMp.Text = Spell(EditorIndex).Transform.MpPercent
        .txtTransPoder.Text = Spell(EditorIndex).Transform.PoderPercent
        .txtTransDefesa.Text = Spell(EditorIndex).Transform.DefesaPercent


Com isso o Grosso do Cliente está pronto.
Vamos ao Servidor.

#########
 Server - Side
#########

[4] Colocando as Variaveis do ModTypes


Como fizemos no Cliente, o servidor precisa estar "INGUAL!!!" viu? nhonc!

Vá para o ModTypes, dentro dele procure por: Private Type SpellRec


Dentro delo, no FINAL! assim como foi posto no FINAL do Cliente, adicione:

Código:
Transform As SpellTransformRec


Lembre-se que fica antes do END TYPES!!!

Agora acima do Private Type SpellRec, você adiciona isso aqui:

Código:

Private Type SpellTransformRec
    HasTransform As Byte        'Está habilitada a transformação?
    ChangeSprite As Byte        'Está habilitada a mudança de Sprite?
    
    TransSprite As Long         'Valor que salva o numero da transformação.
    TransTimer As Long          'Salva o Tempo de Transformação em Segundos.
    
    HpPercent As Long           'Guarda o % de Acrescimo de Hp
    MpPercent As Long           'Guarda a % de Acrescimo de Mp
    PoderPercent As Long        'Guarda a % de Acrescimo de Poder
    DefesaPercent As Long       'Guarda a % de Acrescimo de Defesa
End Type


Pronto, ModTypes da parte de Spell terminado, jaja vamos voltar aqui ;3;

[5] Colocando a putaria Transformação para funcionar!

Vamos ao ModCombat procurar pela.. Public Sub CastSpell


Uhm...Procure por:     If DidCast Then
A Didcast quer dizer que se efetuou a Spell, ela teve exito em ser executada/lançada, e ela processa coisas como enviar o Resfriamento(cooldown), retirar mana e outras atualizações.

É nela que vamos trabalhar.

Dentro do If DidCast Then, abaixo dele obvio, adicione:

Código:
   
        If Spell(SpellNum).Transform.HasTransform > 0 Then  'Verifica se a Spell tem Transformação Habilitada
            Call ProcessSpellTransform(index, SpellNum, True)     'Processar Transformação
        End If
    


Certo, agora vamos processar e transformação!


[6] Adicionando o Processamento da Transformação.


Vá ao ModPlayer no final dele, adicione:

Código:

Public Sub ProcessSpellTransform(ByVal Index As Long, ByVal SpellNum As Long, ByVal Switcher As Boolean)
'Sub Responsável por aplicar a Transformação.
Dim SpriteValue As Long

    'Prevent Scripts
    If Index <= 0 Or Index > MAX_PLAYERS Then Exit Sub
    If SpellNum <= 0 Or SpellNum > MAX_SPELLS Then Exit Sub
    
    'Re-Verificar se é Spell de Trans
    If Spell(SpellNum).Transform.HasTransform <= 0 Then Exit Sub
    
    'Caso o Switcher seja Falso, então enviar para a limpeza da Transformação.
    If Not Switcher Then
        Call ClearSpellTransform(Index)
        Exit Sub
    End If
    
    'Observação e Proteção do Sistema , forma Lógic
    If TempPlayer(Index).Transform.Transformed > 0 Then 'Player ja está transformado?
        If TempPlayer(Index).Transform.Transformed = SpellNum Then
            'Se é a Mesma Transformação, então apenas repor o Tempo de trans e NÃO ADICIONAR AINDA MAIS!
            TempPlayer(Index).Transform.TransformDuration = Spell(SpellNum).Transform.TransTimer '(Cada valor 1 no timer, confere 1s de transformação.)
            TempPlayer(Index).Transform.TransformTimer = GetTickCount   'Atualiza o GetTick
            Call PlayerMsg(Index, "Você mantém a transformação atual.", Cyan)       'Avisar Player que ele reestabeleceu o tempo da Transformação.
            Exit Sub    'Exitar, ja que não tem mais anda a ser processado.
        Else 'Else então se trata de outra Transformação e não a mesma que estamos usando.
        'Aqui trataremos de anti acumulo de uma forma lógica, Fazer a limpeza do Player e apos isso atualizar os valores.
            Call ClearSpellTransform(Index) 'Vai fazer a limpeza e continuar processando.
        End if
    End If
    
    'Hora de Trabalhar a transformação.
    If Spell(SpellNum).Transform.ChangeSprite > 0 Then 'Spell Tem Mudança de Sprite pela Trans? se Sim
        'Processar a Mudança.
        Player(Index).MySelfSprite = GetPlayerSprite(Index)     'Adiciona o valor da minha sprite atual ao MySelfSprite.
        SpriteValue = Spell(SpellNum).Transform.TransSprite     'Adiciona o Valor da Sprite a uma Variavel Interna
        Call SetPlayerSprite(Index, SpriteValue)                'Modifica a Sprite do Index
        SavePlayer Index
    End If
        
    'caso tenha mudança de sprite ela já vai ter entrado, e salvo a sprite base natural.
    'Abaixo vamos a mudança de atribuições e estabelecer os tempos.
    TempPlayer(Index).Transform.Transformed = SpellNum 'Adiciona o Numero da Transformação no Temp
    TempPlayer(Index).Transform.TransformDuration = Spell(SpellNum).Transform.TransTimer '(Cada valor 1 no timer, confere 1s de transformação.)
    TempPlayer(Index).Transform.TransformTimer = GetTickCount   'Atualiza o GetTick
    
    TempPlayer(Index).Transform.TempHpUp = Spell(SpellNum).Transform.HpPercent
    TempPlayer(Index).Transform.TempMpUp = Spell(SpellNum).Transform.MpPercent
    TempPlayer(Index).Transform.TempPoderUp = Spell(SpellNum).Transform.PoderPercent
    TempPlayer(Index).Transform.TempDefesaUp = Spell(SpellNum).Transform.DefesaPercent
    
    'usando o TempPlayer, você guarda o valor em uma variavel temporária assim não fica presa ao jogador e evita certos erros ;3
    'ainda mais porque é algo temporario a transformação.
    SendPlayerData Index
    Call PlayerMsg(Index, "Você se transformou!", Cyan)     'Avisar ao Player

End Sub

Public Sub ClearSpellTransform(ByVal Index As Long)
'Sub Responsável pela Limpeza das Transformações.

    'Prevent Scripts
    If Index <= 0 Or Index > MAX_PLAYERS Then Exit Sub
    
    'Verificar se o Player tem mesmo uma Transformação ou se tem a sprite alterada por uma transformação prévia.
    If TempPlayer(Index).Transform.Transformed > 0 Or Player(Index).MySelfSprite > 0 Then
        'dessa forma nem toda trans precisa ter mudança de Sprite e ja serve como um sistema de buff xD
        
        'Hora da Limpeza
        
        If Player(Index).MySelfSprite > 0 Then  'Caso tenha sprite trocada ~
            Call SetPlayerSprite(Index, Player(Index).MySelfSprite) 'colocar sprite myself de volta uffa.
            Player(Index).MySelfSprite = 0
            SavePlayer Index
        End If
        
        'Limpar valores Temporarios
        TempPlayer(Index).Transform.TransformDuration = 0
        TempPlayer(Index).Transform.TransformTimer = 0
        TempPlayer(Index).Transform.TempHpUp = 0
        TempPlayer(Index).Transform.TempMpUp = 0
        TempPlayer(Index).Transform.TempPoderUp = 0
        TempPlayer(Index).Transform.TempDefesaUp = 0
        
        TempPlayer(Index).Transform.Transformed = 0
    
         SendPlayerData Index
        'Coloque um call PlayerMsg caso queira avisar algo ao Player.
    End If
    
End Sub


Agora vamos voltar ao ModTypes ;3 


[7] Colocando os Temporários no ModTypes!
Voltando ao ModTypes procure por: Public Type TempPlayerRec

No final dela antes do End Types adicione:     Transform As TempTransformRec


Acima do Public Type TempPlayerRec adicione :

Código:
Public Type TempTransformRec
    Transformed As Long         'Salva o Numero da Spell que o Transformou, sendo maior que zero, então está.
    
    TransformTimer As Long
    TransformDuration As Long
    
    TempHpUp As Long
    TempMpUp As Long
    TempPoderUp As Long
    TempDefesaUp As Long
End Type


Agora vamos dar um passeio pela do Player, procure por: Private Type PlayerRec


Dentro e no FINAL antes do End Types adicione:
Código:
   
    'Sprite da Transformação
    MySelfSprite As Long


algo que não é necessário ir para o Cliente e nem ser enviado para o Cliente, por isso não precisa conter em conjunto no cliente.

[8] Fazendo a Trans intervir nos Valores:

[8.a] Mudando no HP:
Procure a ModCombat, a Function GetPlayerMaxVital(ByVal Index As Long, ByVal Vital As Vitals) As Long 

Ela é responsável por calcular TANTO o HP quanto o MP, Máximos!

Dentro disso aqui: Case HP

Você poem antes do Case MP! isso aqui:

Código:
GetPlayerMaxVital = GetPlayerMaxVital + ((GetPlayerMaxVital / 100) * TempPlayer(Index).Transform.TempHpUp)


Aplicando a Matematica base, ele fará com que o valor do Aumento do HP la da Spell Aumente em % o HP MAXIMO, assim se vc por 500 lá na criação da Trans, ele vai aumentar 500% do HP MAXIMO ATUAL.

Vamos fazer a mesma coisa no MP.

Antes do End Select, dentro do Case MP e no final do Case MP ainda... adicione:

Código:
GetPlayerMaxVital = GetPlayerMaxVital + ((GetPlayerMaxVital / 100) * TempPlayer(Index).Transform.TempMpUp)


Mesma coisa, vai aumentar o MP máximo em porcentagem de acordo com o valor da caixinha de MP.

[8.b] Modificando valores de "Poder (Dano)" e Defesa:


| DANO |
Dentro do ModCombat, procure por: Function GetPlayerDamage(ByVal Index As Long) As Long

Dentro dela no final, antes do End Sub adicione:
Código:
GetPlayerDamage = GetPlayerDamage + ((getPlayerDamage / 100) * TempPlayer(Index).Transform.TempPoderUp)



Assim o valor da spell trans vai aumentar em porcentagem o valor de DANO ATUAL geral.

| Defesas... |
Defesa é um tanto mais complicadinho, já que nem todas as engines contam com uma "defesa", então o que eu farei é um redutor de  % de dano Recebido.

Se você deixar 100, então na transformação o Player estará IMUNE a dano recebido pela Try Comum.
Então você precisa ou criar uma sub de defesa, ou customizar isso.

- Contra Monstros: Procure pela : Public Sub TryNpcAttackPlayer

Dentro dela, antes de Call NpcAttackPlayer(MapNpcNum, Index, damage)


Adicione:

Código:
Damage = Damage - ((Damage / 100) * TempPlayer(Index).Transform.TempDefesaUp)


Dessa forma o dano que o player receberia, seria reduzido em % direto no valor do dano.
Então como falei, 100% seria reduzir 100% do valor do dano, anulando o dano recebido.

- Contra Players:  Procure pela: Public Sub TryPlayerAttackPlayer(ByVal attacker As Long, ByVal Victim As Long,


No final dela, você encontrará: Call PlayerAttackPlayer(attacker, Victim,


Acima disso você adiciona:

Código:
Damage = Damage - ((Damage / 100) * TempPlayer(Victim).Transform.TempDefesaUp)


Assim será o mesmo esquema, reduzirá o dano que passar por essa sub.

Alterações comuns de valores já feitos, agora vamos as Miscelanous ~

[9] Colocando o Tempo da Animação para Acabar e fazer a Limpeza, afinal nem tudo dura pra sempre.


Vá ao ModServerLoop, dentro dele procure a primera sub mesmo a : Sub ServerLoop()
Ela é responsável por muito do processamento de tempos e de seu servidor.

Então vamos trabalhar nela,

procure por isso aqui bem no começo:

Código:
If Tick > tmr25 Then
            For i = 1 To Player_HighIndex
                If IsPlaying(i) Then



Abaixo disso ai você pode adicionar:
Código:

                     ' checkar e processar tempo da Transformação
                    If TempPlayer(i).Transform.Transformed > 0 Then
                        If GetTickCount > TempPlayer(i).Transform.TransformTimer + (TempPlayer(i).Transform.TransformDuration * 1000) Then
                            Call ProcessSpellTransform(i, TempPlayer(i).Transform.Transformed, False) 'Acabou o tempo, mandar limpar a bagaça.
                        End If
                    End If



Com isso , ela já vai mandar pra ProcessSpellTransform, e ela vai passar pelo Switcher posto e fazer a limpeza da transformação.

Uffa... falta mais o que? uahshusa Ah! Vamos evitar erros ao logar e deslogar estando transformado.

[10] Evitando problemas ao Logar e Deslogar, Sprites e etc...


Procure pela: Sub JoinGame(ByVal Index As Long)


Dentro dela, no final, antes do End Sub coloque: 

Código:
'Transformação, passar limpeza
    Call ClearSpellTransform(Index)


Creio que é isso, como enviamos pacotes de datas dentro da Subs de Processo de SpellTransforme, não é interessante por a call da Sub direto na Sub LeftGame()


Então, Dentro da  Sub LeftGame() abaixo de: TempPlayer(Index).InGame = False


Adicione:
Código:
        TempPlayer(Index).Transform.TempDefesaUp = 0
        TempPlayer(Index).Transform.TempHpUp = 0
        TempPlayer(Index).Transform.TempMpUp = 0
        TempPlayer(Index).Transform.TempPoderUp = 0
        TempPlayer(Index).Transform.TransformDuration = 0
        TempPlayer(Index).Transform.Transformed = 0
        TempPlayer(Index).Transform.TransformTimer = 0
        


Assim é feita a limpeza no temporário.



############
 Encerramento
############


O Sistema é totalmente customizado e editável, a atender qualquer outros padrões e estilos. Mas cabe a você também usar um pouco da sua mente, e sentar, estudar, ler, em quase tudo tentei deixar a logica bem explicita e o porque daquela linha existir, assim você pode ler e começar a entender. 

"ah mais eu quero mais valores..." Basta você adicionar mais valores. 

Outro detalhe, é necessário que você faça a limpeza das spells e dos jogadores, para evitar possiveis falhas de resguardo.

Maiores duvidas eu e a Aldeia estaremos aqui para alumiar vocês.

Bjus da Fada Linda < 3 

Bom jogos e noites viradas desenvolvendo turma! 

Creio que eu não tenha esquecido de nada ;c


Voltar ao Topo

Data/hora atual: Sex Nov 22, 2019 7:11 am