Battle Maker

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte para criação de Jogos


    Adicionando Skills ao vbGORE

    jiraya
    jiraya
    Administrador
    Administrador


    Mensagens : 1299
    Credibilidade : 54

    Adicionando Skills ao vbGORE Empty Adicionando Skills ao vbGORE

    Mensagem por jiraya Qua Jan 26, 2011 6:00 pm

    [Autor: Cayoda ]
    É 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.

      Data/hora atual: Sex Mar 29, 2024 1:20 am