Universo Games
Ola , Convidado



Você ainda não e cadastrado então cadastre-se e veja todas as atualizações no mundo rpg!!!
Universo Games

Suporte e Desenvolvimento só no Universo Games

Ola Convidado, Seja Bem vindo a equipe lhe deseja boa sorte no seu projeto!

Você não está conectado. Conecte-se ou registre-se

Adicionando Skills no vbGORE

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

1Tutorial Adicionando Skills no vbGORE em Sab 25 Jun 2011, 09:24

GameOver


Administrador
Administrador
Bom, olá a todos primeiramente. Hoje vou postar um tutorial básico do vbGore de como adicionar Skills nele, agora vamos lá.

É recomendado antes de ler tem uma noção básica de VB6



Adicionando Skills no vbGORE



Em vbGORE, habilidades devem ser totalmente codificadas - sem script ou qualquer coisa do tipo. Isso é feito por causa da flexibilidade. Habilidades "scriptadas" são muito limitadas, enquanto codifica-las torna melhor o seu resultado. O problema que vem com esta, porém, é a dificuldade.

Tenha em mente que as habilidades são tão diversas no que se realizar, a partir de buffs e cura à ataques de dano e talvez até mesmo efeitos de alteração no mapa. Todo o código mostrado aqui é apenas uma sugestão sobre como determinadas tarefas podem ser realizadas. Não basta "copiar e colar" o código pensando que vai trabalhar em todas as condições.

Escrevendo o código da magia

A parte mais importante do código é o código da magia em si. Estas são todas realizadas em Competências modulo Skills. A maioria dos feitiços do vbGORE padrão oferecem suporte para a conjuração de PC-> NPC, NPC-> NPC e PC-> PC. Além disso, as constantes são adicionadas ao topo para definir facilmente certos valores. Estes não são necessárias, mas é recomendado para a facilidade de uso. Tudo sobre seu estilo pessoal, no entanto.




Checando as Condições necessárias para soltar a skill

A Primeira parte a se fazer para uma skill funcionar é checar as condições necessárias, isto depende de como será a conjuração de PC -> NPC ou PC->PC, Conjurações PC->PC terá mais condições a se checar.

Vamos começar certificando-se o usuário está mesmo no estado para lançar o feitiço, ou ser alvo do feitiço, e checar se eles estão online (ou o NPC está vivo). Por exemplo, a partir do PC-PC

Código:

    If UserList(CasterIndex).flags.UserLogged = 0 Then Exit Sub
    If UserList(TargetIndex).flags.UserLogged = 0 Then Exit Sub
    If UserList(CasterIndex).Counters.SpellExhaustion > 0 Then Exit Sub

O Proximo passo é checar se o usuário que esta conjurando a habilidade realmente a tem ou conheçe a habilidade. Checar isso em um NPC é desnecessário.

Código:

    'Checamos se o usuário conheçe a skill
    If UserList(CasterIndex).KnownSkills(SkID.Bless) = 0 Then
        Data_Send ToIndex, CasterIndex, cMessage(37).Data
        Exit Sub
  End If

Após isso, certifique-se que o conjurador (NPC ou PC) tenha MP , força e HP o suficiente para usar a habilidade se for o caso for necessário. Por exemplo:

Código:

    'Checamos se o o conjurador tem Mana/hp/força o suficiente para conjurar
    If UserList(CasterIndex).Stats.BaseStat(SID.MinMAN) < Int(UserList(CasterIndex).Stats.ModStat(SID.Mag) * Bless_Cost) Then
        Data_Send ToIndex, CasterIndex, cMessage(38).Data
        Exit Sub
    End If

Para os usuários, muitas vezes é importante, para o caso, checar a distância antes da habilidade ser usada se for "target-based":

Código:

    'Checamos se tem um alvo válido a distância
    If Server_CheckTargetedDistance(CasterIndex) = 0 Then Exit Sub




Usando a Habilidade

Sabemos agora que o usuário passa todas as condições para usar a habilidade. A partir daqui, vamos assumir que a habilidade será utilizada com êxito, de modo a reduzir Estatísticas do usuário se necessário (isto é, MP/mana):

Código:

    'Reduzimos a Mana
    UserList(CasterIndex).Stats.BaseStat(SID.MinMAN) = UserList(CasterIndex).Stats.BaseStat(SID.MinMAN) - Int(UserList(CasterIndex).Stats.ModStat(SID.Mag) * Bless_Cost)

Para doenças ou magias de buff, como uma maldição ou bênção, muitas vezes você vai querer certificar-se que o usuário não tiver a habilidade aplicado sobre ele com um forte poder. A razão para isso é que você não quer que alguém seja capaz de ter um fraco buff conjurado a eles por seus inimigos para cancelar seu buff forte. Uma boa idéia é permitir que a habilidade para ser conjurado sobre eles de qualquer forma se a um conjurado que lhes está prestes a esgotar-se - isto permitirá que os usuários para evitar que "unbuffed time" entre o velho buff, quando se esgota, e um novo é conjurado. O exemplo abaixo não faz isso, no entanto:

Código:

    'Conjuramos sobre o alvo
    If UserList(TargetIndex).Counters.BlessCounter > 0 Then
        If UserList(TargetIndex).Skills.Bless > UserList(CasterIndex).Stats.ModStat(SID.Mag) Then

Em seguida está a lidar com os ícones exibidos acima do conjurador e do alvo, se houver. O mais comum é sobre o esgotamento do período (tempo que deve ser aguardado entre Conjurações). O abaixo é um exemplo que irá exibir o ícone da "Benção":

Código:

    'Mostra o Icone do Buff(Isto se ele ainda não existir no alvo)
    If UserList(TargetIndex).Skills.Bless = 0 Then
        ConBuf.PreAllocate 4
        ConBuf.Put_Byte DataCode.Server_IconBlessed
        ConBuf.Put_Byte 1
        ConBuf.Put_Integer UserList(TargetIndex).Char.CharIndex
        Data_Send ToMap, CasterIndex, ConBuf.Get_Buffer, UserList(CasterIndex).Pos.Map, PP_StatusIcons
    End If

E agora faremos o período de exaustão da habilidade e a mostramos como ícone

Código:

'Add the spell exhaustion and display it
    UserList(CasterIndex).Counters.SpellExhaustion = timeGetTime  Bless_Exhaust
    ConBuf.PreAllocate 4
    ConBuf.Put_Byte DataCode.Server_IconSpellExhaustion
    ConBuf.Put_Byte 1
    ConBuf.Put_Integer UserList(CasterIndex).Char.CharIndex
    Data_Send ToMap, CasterIndex, ConBuf.Get_Buffer, UserList(CasterIndex).Pos.Map, PP_StatusIcons

Tenha em mente que os tempos são calculadas como CurrentTime Lenght (em milissegundos). Isso ajuda a reduzir a carga da CPU para o temporizador baseado em cálculos, juntamente com uma precisão muito melhor.

algumas tarefas mais display esquerdo. O abaixo é um exemplo de como contar o Conjurador e de Alvo que a benção foi conjurada:

Código:

'Envia a mensagem para o conjurador
    If TargetIndex <> CasterIndex Then
        ConBuf.PreAllocate 3  Len(UserList(TargetIndex).Name)
        ConBuf.Put_Byte DataCode.Server_Message
        ConBuf.Put_Byte 40
        ConBuf.Put_String UserList(TargetIndex).Name
        Data_Send ToIndex, CasterIndex, ConBuf.Get_Buffer
 
        'Vira o Conjurador para o Alvo
        UserList(CasterIndex).Char.Heading = Server_FindDirection(UserList(CasterIndex).Pos, UserList(TargetIndex).Pos)
        UserList(CasterIndex).Char.HeadHeading = UserList(CasterIndex).Char.Heading
        ConBuf.PreAllocate 4
        ConBuf.Put_Byte DataCode.User_Rotate
        ConBuf.Put_Integer UserList(CasterIndex).Char.CharIndex
        ConBuf.Put_Byte UserList(CasterIndex).Char.Heading
        Data_Send ToMap, CasterIndex, ConBuf.Get_Buffer, UserList(CasterIndex).Pos.Map
 
    End If
 
    'Manda a Mensagem para o Alvo
    ConBuf.PreAllocate 5  Len(UserList(CasterIndex).Name)
    ConBuf.Put_Byte DataCode.Server_Message
    ConBuf.Put_Byte 41
    ConBuf.Put_String UserList(CasterIndex).Name
    ConBuf.Put_Integer UserList(CasterIndex).Skills.Bless
    Data_Send ToIndex, TargetIndex, ConBuf.Get_Buffer

Agora, para Mostrar os efeitos. Isto tem que ser tratado mais sobre o cliente que vamos chegar mais tarde. Se você deseja exibir um efeito de mágica, você terá que passar a ID da habilidade, e os parâmetros específicos para essa habilidade. Muitas vezes, este é apenas o índex do personagem do alvo e conjurador:

Código:

'Mostra o Efeito
    ConBuf.PreAllocate 6
    ConBuf.Put_Byte DataCode.User_CastSkill
    ConBuf.Put_Byte SkID.Bless
    ConBuf.Put_Integer UserList(CasterIndex).Char.CharIndex
    ConBuf.Put_Integer UserList(TargetIndex).Char.CharIndex
    Data_Send ToMap, CasterIndex, ConBuf.Get_Buffer, UserList(CasterIndex).Pos.Map, PP_DisplaySpell

Finalmente, a última coisa é o som. O som exige apenas o envio do número de som (como 6 para 6.wav), juntamente com a posição do tile:

Código:

'Toca o Efeito do Som
    ConBuf.PreAllocate 4
    ConBuf.Put_Byte DataCode.Server_PlaySound3D
    ConBuf.Put_Byte Bless_Sfx
    ConBuf.Put_Byte UserList(CasterIndex).Pos.X
    ConBuf.Put_Byte UserList(CasterIndex).Pos.Y
    Data_Send ToPCArea, CasterIndex, ConBuf.Get_Buffer, , PP_Sound




Adicionando o ID da Skill

A ID da Habilidade (SkillID) é o que é usado para deixar o servidor e o cliente dizer uns aos outros o que a habilidade está sendo usada sem passar o nome. A SkillID é realizada no módulo DataIDs, que faz parte do Código Comum, o que significa que o cliente e o servidor utilizam o mesmo módulo. Se você alterar o código no servidor, por exemplo, será mostrado no cliente quando você carregá-lo.

Encontre Isso no Módulo:

Código:

Public Type SkillID
    Bless As Byte
    Protection As Byte
    Strengthen As Byte
    Warcry As Byte
    Heal As Byte
    IronSkin As Byte
    SpikeField As Byte
    SummonBandit As Byte
End Type
Public SkID As SkillID  'Skill IDs
Public Const NumSkills As Byte = 8

Em qualquer lugar abaixo do Public Type SkillID, Adicione a sua habilidade

Código:

MinhaSkill As Byte

Certifique-se de atualizar o NumSkills que é o constante com o número de habilidades que você tem. Na maioria dos casos, este será o mesmo número que existem variáveis no UDT SkillID.

Código:
Public Const NumSkills As Byte = 9 'Tire o 9 Para o maior numero de habilidades que o seu jogo tem(quando criar alguma modifique-a

Agora aplicar o valor para a nova habilidade neste método

Código:
    With SkID
        .Bless = 1
        .Heal = 2
        .IronSkin = 3
        .Protection = 4
        .Strengthen = 5
        .Warcry = 6
        .SpikeField = 7
        .SummonBandit = 8
    End With

Agora Abaixo da Oitava Skill adicione:
Código:
.MinhaSkill = 9




SkillIDto...

Enquanto o servidor só precisa saber o número SkillID e habilidade que se refere à subs, o cliente precisa ser capaz de converter a SkillID no nome de habilidade e GRH para exibir as informações sobre a habilidade do cliente. Estes subs são Engine_SkillIDtoGRHID e Engine_SkillIDtoSkillName. O uso para eles são muito auto-explicativo, você só precisa digitar o número e o nome da habilidade Grh .

Depois de seguir estes passos, se o usuário conhece a habilidade, eles devem ser capazes de vê-lo em sua lista de seleção de habilidade, que pode ser levantada por Shift Mouse Esquerdo em um slot bar rápida.




Extendendo as Skills

Status Negativos e Contadores de Tempo


Uma parte enorme sobre feitiços é sobre doenças e temporizadores. Por exemplo, se você quiser ter um feitiço Maldição que reduz todas as estatísticas do usuário e tem a duração de 5 minutos, vai precisar de um temporizador variável para dizer que tem a duração de 5 minutos, e uma variável de dizer ao dizer ao servidor a magia está no o usuário, e como a magia é poderosa.

No Servidor. Procure por

Código:
Type UserCounters

Você vai ver um monte de contadores de habilidade aqui já. Como afirmado anteriormente, o valor armazenado neste contador não é quanto tempo dura a habilidade, mas em que momento a habilidade irá acabar, que é encontrado por timeGetTime Length, e é representado em milissegundos. Manter todos os contadores As Long.

Em seguida, para adicionar as informações da habilidade para o usuário, busque por:

Código:
Type Skills

Isso Indica poder da habilidade. Como usar e calcular esse valor. Algumas habilidades, como a Iron Skill, está apenas ligado ou desligado, enquanto os outros são mantidos pelo seu valor, onde um maior valor de potência = maior Poder.

Em seguida, você quer ter a certeza que está a verificar para ver se o contador se esgote. Muitos exemplos disso podem ser encontrados se você olhar para o código:
Código:
*** Update the counters ***

Um Exemplo para a habilidade Benção

Código:
If UserList(UserIndex).Counters.BlessCounter > 0 Then
                            If UserList(UserIndex).Counters.BlessCounter < timeGetTime Then
                                UserList(UserIndex).Skills.Bless = 0
                                ConBuf.PreAllocate 4
                                ConBuf.Put_Byte DataCode.Server_IconBlessed
                                ConBuf.Put_Byte 0
                                ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
                                Data_Send ToMap, UserIndex, ConBuf.Get_Buffer, UserList(UserIndex).Pos.Map, PP_StatusIcons
                                User_UpdateModStats UserIndex
                            End If
                        End If

O conceito básico deste é verificar se o feitiço acabou, define o valor de habilidade para 0 (desativar a doença), desliga o ícone e atualização de suas estatísticas.

O passo final é fazer uso da doença. Isto é feito em User_UpdateModStats. Por exemplo:

Código:

        'Protection
        If UserList(UserIndex).Skills.Protect > 0 Then
            Log "User_UpdateModStats: Updating effects of skill/spell Protection", CodeTracker '//\\LOGLINE//\\
            .ModStat(SID.DEF) = .ModStat(SID.DEF)  UserList(UserIndex).Skills.Protect
        End If

Isso deve ser auto-explicativo. :-) Certifique-se de usar ModStat e BaseStat adequadamente.

Créditos~~
Cayoda

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum