Suporte no desenvolvimento de jogos


3 Resultados encontrados para É

Profane ~

[Prof~] Sistema de Reputação - Seg Abr 30, 2018 11:22 am

Oin turu baum?

Venho trazer um sistemazinho simples.
O que se tem de entender dele é que ele não necessariamente é um Sistema de Reputação, mas sim uma Base Geral de se ter Valores Salvos e de se Enviar tais valores pela comunicação Server <> Cliente.

Esse Pedido foi feito pelo Yashi (Allan) via PM, e aqui estou disponibilizando.

Vai servir como uma Leve Aula para os que ainda não tem conhecimento de como enviar valores, fazer atualização dos mesmos e salva-los.




Qual a Lógica por trás?

Bem, teremos de abrir uma memoria no NPC, onde ela armazenará o valor de "Reputação". 

Quando este NPC for derrotado o Player ganhará esse valor de Reputação.

Logo o Player também precisará de uma memoria para salvar este valor de reputação que vamos usar.



Ficha Tecnina

 Dificuldade: Fácil
 Compatibilidade: Qualquer EO/CS
 Necessário
- Visual Basic 6
- Após o Termino apagar NPC's e Player's nas pastas do Servidor. (Evitar Probleminhas ;3)


 Engine Já Modificada: Download  (Menos de 2mb)
 (Baixe caso queria apenas Ripar o Sistema de Engine - Ou o ver funcionando.)
 (Caso queira Ripar, procurar por tudo que tenha "Reputation" ou "Reputação".)




Ao Sistema


[ Parte 1 - Criando as Memórias ]

Vamos estar Indo aos Types para poder adicionar a Variável Type que irá armazenar o Valor que desejamos criar.

 No Cliente e no Servidor, procure por:
Código:
Private Type PlayerRec


 Dentro dele, antes do End Type, adicione:

Código:
   Reputation As Long


Colocamos um valor Long na Memória já que em geral esses jogos vão trabalhar na casa de milhões mais.. (Absurdo /o/)
Com isso a memoria no Player já vai estar lá.

Vamos tratar dos Npc's.

Procure por:
Código:
Private Type NpcRec


Dentro dele e antes do End Type, adicione:

Código:
   Reputation As Long


O Npc irá armazenar o Valor de reputação a qual ele dará ao morrer.

[ Parte 2 - Preparando o NPC ]

No Cliente

Acesse a FrmEditor_NPC e prepare os componentes a qual irão nos ajudar na edição do Npc.

Poderá ficar mais o menos assim:
Tópicos com a tag É em Aldeia RPG PcARvUl

 Componentes Principais ai são: 
 - Label (Sem nome necessário, apenas para ficar indicado que é ali que fica a reputação.)
 - textBox (Name = txtReputation)

Apague todo o conteúdo da propriedade "Text" do textBox (txtReputation), deixando ele Limpo.

Dê 2 click's sobre o txtReputation e vamos aos seus códigos:

Código:
 ' If debug mode, handle error then exit out
    If Options.Debug = 1 Then On Error GoTo errorhandler
    
    If Not Len(txtReputation.text) > 0 Then Exit Sub
    If IsNumeric(txtReputation.text) Then Npc(EditorIndex).Reputation = Val(txtReputation.text)
    
    ' Error handler
    Exit Sub
errorhandler:
    HandleError "txtReputation_Change", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContext
    Err.Clear
    Exit Sub


Adicionado isso a parte interna do txtReputation, vamos agora garantir que ao Npc ser carregado no Editor, ele carregue também o valor de reputação atual do Npc.

Procure por:

Código:
Public Sub NpcEditorInit()


Esta sub processa cada carregamento de NPC no Editor. É muito importante que ao fazer componentes novos que usem memória, seja adicionado o carregamento do mesmo no Editor usando essa Sub.

Dentro dela e abaixo de :

Código:
With frmEditor_NPC


Adicione:

Código:
.txtReputation.text = Npc(EditorIndex).Reputation


Dessa forma, toda vez que acessar o Editor de Npc's, será posto o valor de Reputação do NPC no TextBox de Reputação.

[ Parte 3 - Packets e Trocas ]

Nessa parte faremos o Pacote que irá transitar a reputação de forma principal. Ele será pequeno já que toda vez que um NPC com Reputação morrer ele será enviado ao Jogador atualizando assim o valor de Reputação do Jogador.

Ainda no cliente procure por:

Código:
SMSG_COUNT


Acima dele adicione:

Código:
SPlayerReputation


Estamos aumentando o Limite de Pacotes conhecidos pelo Cliente.

Faremos o mesmo no Servidor.

No servidor procure por:

Código:
SMSG_COUNT


Acima dele adicione:

Código:
SPlayerReputation



#É Extremamente Importante que essa parte do modEnumerations esteja de acordo e igual Cliente e Servidor. O Mesmo Numero de Pacotes e de preferencia o Mesmo Nome! Caso contrário você vai começar a ter dores de cabeça >
Vá ao final do modServerTCP (Modulo que é responsável por armazenar os Envios de Pacotes para o Cliente.)

No Final dele adicione:
Código:
Sub SendReputationTo(ByVal index As Long)
Dim Buffer As clsBuffer, i As Long, partyNum As Long

    Set Buffer = New clsBuffer
    Buffer.WriteLong SPlayerReputation
    Buffer.WriteLong Player(index).Reputation
    
    SendDataTo index, Buffer.ToArray()
    Set Buffer = Nothing
End Sub


Tendo isso, quando chamarmos pela Call SendReputation(?), ela pegará o valor de memoria "Reputation" do jogador Alvo e tentará enviar para o Cliente.

Agora vamos fazer o cliente receber.

Voltando ao Cliente, vá ao modHandleData (Modulo responsável por receber os Pacotes que vem do Servidor para o Cliente.)

Procure por:

Código:
Public Sub InitMessages()


Dentro dele, depois de todos os :

Código:
HandleDataSub(


Você adiciona:

Código:
HandleDataSub(SPlayerReputation) = GetAddress(AddressOf HandlePlayerReputation)


Não é estritamente necessário que você adicione isso em um "Padrão". Como assim? A ordem ali dentro não é importante, é mais organização. Já que se adicionou um novo pacote, ele "teria" de ficar no final.

Agora que o Cliente já tem conhecimento do que fazer com o Pacote que criamos, vamos fazer ele ler o pacote.

O Pacote ao chegar será enviado para a "HandlePlayerReputation", sendo assim no final da ModHandleData, coloque:

Código:
Private Sub HandlePlayerReputation(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
Dim Buffer As clsBuffer, i As Long
Dim Reputation As Long

    ' If debug mode, handle error then exit out
    If Options.Debug = 1 Then On Error GoTo errorhandler
    
    Set Buffer = New clsBuffer
    Buffer.WriteBytes Data()

    Reputation = Buffer.ReadLong
    
    If Index = MyIndex Then
        Player(MyIndex).Reputation = Reputation
    End If
  
    ' Error handler
    Exit Sub
errorhandler:
    HandleError "HandlePlayerReputation", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
    Err.Clear
    Exit Sub
End Sub



Pronto, dessa forma o Servidor já sabe enviar o valor ao Cliente, o Cliente já recebe o Pacote e também já faz a leitura guardando o valor recebido dentro da Memória que criamos para ele.

[ Parte 4 - Fazendo o NPC dar Reputação ao ser Abatido ]

 No Servidor, vamos procurar pela SUB que processa a morte do NPC.

Procure por:

Código:
Public Sub PlayerAttackNpc(ByVal attacker As Long


Dentro dela, procure por isso aqui...

Código:
 ' Now set HP to 0 so we know to actually kill them in the server loop (this prevents subscript out of range)
        MapNpc(mapNum).Npc(mapNpcNum).Num = 0
        MapNpc(mapNum).Npc(mapNpcNum).SpawnWait = GetTickCount
        MapNpc(mapNum).Npc(mapNpcNum).Vital(Vitals.HP) = 0


Esta parte acima determina e faz o começo da limpeza do NPC, mas queremos que antes dele ser "limpo" entregue a nós a reputação num é mermu?

Então, acima disso adicione:

Código:
'Get Reputation
   If Npc(npcNum).Reputation > 0 Then
        Player(attacker).Reputation = Player(attacker).Reputation + Npc(npcNum).Reputation 'Add Reputação
        SendReputationTo attacker 'Envia ao Player que Matou
   End If


Em outras palavras o código analisa se o Npc tem reputação para ser entregue, caso tenha, ele adiciona a reputação a memoria do Player, e logo em seguida pede para enviar o Pacote de atualização de Reputação ao Cliente do Player.

[ Parte 5 *-* - Mostrando a Reputação no Cliente ]

De forma simples apenas para mostrar a reputação na tela, eu criei uma Label no FrmMain.

Name da Label: (lblReputation)

Tópicos com a tag É em Aldeia RPG 87vPB37

Agora procure pelo nosso pacote que recebe a Reputação do Servidor...
Ainda no Cliente procure por:

Código:
Private Sub HandlePlayerReputation(B


Dentro dessa Sub procure por:

Código:
Player(MyIndex).Reputation = Reputation


Abaixo dele adicione:

Código:
frmMain.lblReputation.Caption = "Reputação: " & Reputation


Dessa forma, toda vez que o Pacote chegar, ele irá atualizar a Propriedade Caption da Label que criamos para mostrar a Reputação.

Até aqui o sistema está basicamente terminado, faltando apenas mais um detalhe!

[ Parte Ultima - Detalhe! ]

Esse detalhe se trata de uma atualização vital que se segue pelo cliente<>Server. 

É o Nosso PlayerData() que  envia muitas vezes boa parte de todas as memorias do Player.

Vamos por nossa memoria de Reputação para ser atualizada também via ele, porque caso contrario.. Ao Você logar no jogo, o Player só receberia a Reputação de 2 Jeitos:

 [ 1 ] Caso esteja no PlayerData()
 [ 2 ] Caso envie a Reputação via JoinGame()

Como eu estou fazendo esse sistema visando que vocês aprendam e assim modifiquem essa "logica" e memorias para serem usadas de outras maneiras e com outros nomes /o/ para outras diversas finalidades então vou ensinar a mover isso pelo PlayerData(), o que para a Situação Atual seria melhor ser enviada pelo JoinGame (Assim que o Player Logar). 

Mas não chega a ser um problema.

Vamos lá.

No Servidor, procure por:

Código:
Function PlayerData(ByVal index As Long) As Byte()


Fique bem atento a isso, entenda que os Buffer's empacotam os valores em ORDEM , no caso Listagem! E o Cliente precisa desempacotar na mesma ORDEM de listagem. Caso contrário você ter dor de cabecinha bb ><

Uma maneira fácil de por é, procure um Buffer de preferencia sem estar dentro de um For/Next

Ex:

Código:
Buffer.WriteLong GetPlayerPK(index)


Esse Buffer empacota o valor de PK do Player.

Abaixo adicione:

Código:
Buffer.WriteLong Player(index).Reputation

Agora o PlayerData() vai estar enviando o Reputation do Player.

Vamos ao Cliente,

Iremos agora procurar a Leitura do Pacote do PlayerData() que se chama HandlePlayerData()

Procure por:

Código:
Private Sub HandlePlayerData(ByVal Index As Long,


Dentro dela, LEMBRANDO QUE A ESTRUTURA TEM DE SER DESEMPACOTADA EM ORDEM QUE FOI EMPACOTADA!

Como botamos o Buffer do Reputation para ser Empacotado embaixo do Buffer de PK, então procuremos pelo de PK Primeiro:

Código:
Call SetPlayerPK(i, Buffer.ReadLong)


Abaixo dele, adicionaremos:

Código:
Player(i).Reputation = Buffer.ReadLong


Pronto! Agora, o Cliente desempacota com tranquilidade e na ordem correta. 

Caso você ponha em ordem errada, o Valor vai ser Atribuído a outra MEMORIA, e assim Você pode imaginar sua Reputação sendo colocada no HP, ou em diversos outros locais dependendo da ordem de desempacotamento /o/ ~ É uma reação em cadeia que iria lhe dar dores de cabeça não só a você... pq provavelmente iria vir aqui trazer o problema < 3

Para Finalizar...

Ainda na HandlePlayerData, procure por isso aqui:

Código:
' Check if the player is the client player
    If i = MyIndex Then


Abaixo disso adicione:

Código:
 'Refresh Reputation Label
        frmMain.lblReputation.Caption = "Reputation: " & Player(MyIndex).Reputation


Agora a Label que criamos lá no FrmMain será atualizada assim que o Player Receber a PlayerData também /o/

FIM * o *

Espero que tenham gostado e que com isso possam pensar em diversas outras memórias,valores e possíveis customizações para a falência de vocês!

Att amores < 3

[Resolvido]Adicionar slots de equipamentos - Sab Abr 14, 2018 5:49 pm

Primeiro analise isso aqui:

Tópicos com a tag É em Aldeia RPG TTAxkRe

Isso é encontrado no modConstants em qualquer Side (Server/Client). 
É a organização de estrutura para rebuscar item. 

Ao em qualquer lugar do projeto se chamar por tais nomes referentes, o Nome é apenas uma "maquiagem" para o valor que está após o "=".

A estrutura dentro do cmbType do frmEditor_item faz-se tal leitura.

Código:
  If (cmbType.ListIndex >= ITEM_TYPE_WEAPON) And (cmbType.ListIndex <= ITEM_TYPE_SHIELD) Then


em outras palavras:

Código:
  If (cmbType.ListIndex >= 1) And (cmbType.ListIndex <= 4) Then


Você fará uma reorganização do seus Slots para não perder essa estrutura já que muita coisa ligada a equipamentos é usada tal estrutura. 

Comparar Valores do Weapon ATÉ Shield

Assim qualquer Slot novo é indicado que ele exista dentro desse conjunto Chave de valor.

Vou mostrar um Ex:

Tópicos com a tag É em Aldeia RPG N4XwUfV

Note que o OIN apareceu, e ele jogou todos os outros para +1 nos seus valores de listagem.
Assim quando ele passar pela leituras de Weapon [até] Shield, ele será contabilizado.

O segundo fator na sua questão é que para ser Lido de tal forma, ele compara o Valor de tais constantes ao valor da Listagem do CmbType no frmEditor_Item.

Se você souber o minimo de Vb você conseguirá achar isso aqui no cmbType:

Tópicos com a tag É em Aldeia RPG U3U41ZA

Toda a listagem necessita bater com a referência das Constantes, isso devia a estrutura a qual foi criada.

Então, vamos adicionar o "oin" na listagem para que ele devidamente possa estar atrelado ao valor correto da Listagem.

#É indicado que remova todos os itens da listagem usando um Control + X, cole em um bloco de notas e assim adicione ele na listagem, após isso cole novamente no componente do vb6.

Ficará assim:

Tópicos com a tag É em Aldeia RPG KNHKmEx

Note nosso OIN agora ali na listagem. 

É agora você aprendeu a "amostrar" conteúdos manuais dentro de uma comboBox, e claro que também entender a estrutura de o porque não ter visto "Helmet ou Armor" quando abriu os códigos.

: )

Att bb qlq outra duvida so chamar ><

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 É 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 É 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: Ter Jun 25, 2019 2:30 am