Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o tema • Voltar para a ficha do tema
[Prof ~] NPC Evolve
3 participantes
Página 1 de 1
[Prof ~] NPC Evolve
Oin Amoresitos.
Cai no conto do Coyote de comentar que faria uma incrementação em um sistema do @GalaxyHells , bla bla... caso ele tomasse vergonha na face dele e arrumasse o tópico para que fosse possível ser lido e copiado e colado pelos belos garotos peludos do fórum.
Eis aqui... Depois de um longo tempo sem trazer incrementações e sisteminhas para os Narutos de vocês... Trago a Trans por Foto de NPC.
Não que o do @GalaxyHells estivesse errado. O Link para o tópico do sistema do mesmo vai estar disponível aqui, mas me é ruim incrementar uma estrutura que é feita meio que de meia boca.
Link para o Tópico do Hells: [Hells] Boss Fight (EO)
Logo resolvi trazer os códigos todos para o sistema em questão, obviamente que existem outras 1000000 formas e de serem feitas, com palavras e jeitos diferentes.. porém esse é meu jeito programadora ninja de ser.
- Ficha Técnica
- Código:
Nível de Programação: Baixo
Programas Necessários: Visual Basic 6 (Sex)
Nível de Programação para Edições Futuras: Mediano
- Entendimento sobre o sistema em si.
- Código:
O Sistema gira com a função de ao NPC setado chegar até uma determinada % de HP (Vital) iniciar seu modo
de transformação. Será possível o mesmo usar um valor imenso de 'tabs' de transformação, você conseguindo
por exemplo configurar 100 Transformações em Cadeia para o mesmo NPC, cada uma contendo um valor diferente de
potencial de HP/DANO.
Algumas funções adicionais naturais foram adicionadas como Tempo para Transformar, Animações, Falas, Se ele
entrar em momento de evolução estará imune e também se ao transformar ele irá encher por completo seu HP.
- Adicionais
- Código:
No decorrer da programação notei que era interessante adicionar coisas que vinham com a situação... Ex's.
> Regeneração Funcional do HP do NPC enquanto ele estiver fora de Batalha.
> Des-Evolve (Npc voltará ao seu estado natural e inicial ~)
> Outros
Ao Sistema ~
- Client Side
[ 1.0 - Adicionando Componentes na Form do Editor ]
- Spoiler:
- Well primeiro iremos começar adicionando os componentes na Form de Editor de Npc's. O Esquema é simples porém você tem que saber o minimo do minimo.. que é INDEX!https://i.imgur.com/O4t5zvk.png
A Numeração representa os Index de cada componente em ordem. Lembre-se que eles vão precisar estar na devida ordem para funcionar de acordo com a estrutura do código.- Código:
Nomenclatura dos Componentes -
*Label Name = lblNpcEvolve
*CheckBox Name = chkNpcEvolve
*TextBox Name = txtNpcEvolve
*Scroll Name = scrlNpcEvolve
*Picture Name = picNpcEvolve
Index em componente permite economizar nomenclaturas e subs. Logo cada componente ai é da mesma família relacionada ao Evolve.Quando criar os Componentes e atribuir Index aos mesmo, vai notar que ficarão com este detalhe.https://i.imgur.com/4kvimVY.pngEntão faça de forma certa seguindo o esquema postado no começo.
[ 1.1 - Código do FrmEditor_Npc ]
- Spoiler:
- Entre na Window de Código da FrmEditor_NPC para que possamos adicionar os códigos que dão função aos Componente.Botão direito sobre o visual da Form e acesso o View Code.
https://i.imgur.com/MHWT4qC.png
No final do Modulo da Form adicione o que está abaixo.'''''''''''''''' Evolve Area '''''''''''''''' // Copy Below'Modificações na Data1 do NPC - EvolveRECPrivate Sub scrlNpcEvolve_Change(Index As Integer)' If debug mode, handle error then exit outIf Options.Debug = 1 Then On Error GoTo errorhandlerSelect Case IndexCase 0 'Matriz de TAB baseado no MAX_NPC_Evolve'Mudança apenas da ABA TAB do Index de EvolvelblNpcEvolve(0).Caption = "Evolution - " & scrlNpcEvolve(0).ValueNpcEditor_EvolveTab scrlNpcEvolve(0).Value'// Load EvolveCase 1 'Animação de Charge - Pre EvolveIf scrlNpcEvolve(1).Value > 0 And scrlNpcEvolve(1).Value <= MAX_ANIMATIONS ThenlblNpcEvolve(1).Caption = "Charge Anim: " & scrlNpcEvolve(1).Value & " - " & Trim$(Animation(scrlNpcEvolve(1).Value).Name)Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(4) = scrlNpcEvolve(1).ValueElselblNpcEvolve(1).Caption = "Charge Anim: X - None"Exit SubEnd IfCase 2 'Animação Final - Já Finalizando a EvoluçãoIf scrlNpcEvolve(2).Value > 0 And scrlNpcEvolve(2).Value <= MAX_ANIMATIONS ThenlblNpcEvolve(2).Caption = "Evolve Anim: " & scrlNpcEvolve(2).Value & " - " & Trim$(Animation(scrlNpcEvolve(2).Value).Name)Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(6) = scrlNpcEvolve(2).ValueElselblNpcEvolve(2).Caption = "Evolve Anim: X - None"Exit SubEnd IfCase 3 'Evolved SpriteNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(7) = scrlNpcEvolve(3).ValuelblNpcEvolve(3).Caption = "Sprite: " & scrlNpcEvolve(3).ValueCall EditorNpc_BltSprite_Evolve'Atualizar QuadroEnd Select' Error handlerExit Suberrorhandler:HandleError "scrlNpcEvolve_Change", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContextErr.ClearExit SubEnd SubPrivate Sub txtNpcEvolve_Change(Index As Integer)Dim textval As StringDim numval As StringDim posted As IntegerDim Old As String' If debug mode, handle error then exit outIf Options.Debug = 1 Then On Error GoTo errorhandlerSelect Case IndexCase 0, 1, 2, 3 '% To Evolve / Seconds in Evolve Charge / General Power Up / HP Increase %textval = txtNpcEvolve(Index).textIf IsNumeric(textval) Thennumval = textvalposted = CInt(numval)If Len(posted) <= txtNpcEvolve(Index).MaxLength Then'ResguardarIf Index = 0 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(1) = posted 'scrlNpcEvolve(Index).ValueIf Index = 1 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(2) = posted 'scrlNpcEvolve(Index).ValueIf Index = 2 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(8) = posted 'scrlNpcEvolve(Index).ValueIf Index = 3 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(9) = posted 'scrlNpcEvolve(Index).ValuetxtNpcEvolve(Index).text = postedElsetxtNpcEvolve(Index).text = "0"Exit SubEnd IfElsetxtNpcEvolve(Index).text = CStr(numval)End IfCase 4 'Say TextNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data2 = Trim$(txtNpcEvolve(Index).text)End Select' Error handlerExit Suberrorhandler:HandleError "txtNpcEvolve_Change", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContextErr.ClearExit SubEnd SubPrivate Sub chkNpcEvolve_Click(Index As Integer)' If debug mode, handle error then exit outIf Options.Debug = 1 Then On Error GoTo errorhandlerSelect Case IndexCase 0 'ImmuneIf chkNpcEvolve(0).Value > 0 ThenNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(3) = 1ElseNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(3) = 0End IfCase 1 'Restore Hp After EvolveIf chkNpcEvolve(1).Value > 0 ThenNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(5) = 1ElseNpc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(5) = 0End IfEnd Select' Error handlerExit Suberrorhandler:HandleError "chkNpcEvolve_Click", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContextErr.ClearExit SubEnd Sub
[ 1.2 - Editando o GameEditor do Cliente ]
- Spoiler:
- Vá para os módulos, busque pelo ... ModGameEditorsDentro dele procure pela Sub NpcEditorInitNela, procure por End WithAcima dele adicione :
- Código:
''''''''''
' Evolve '
''''''''''
.scrlNpcEvolve(0).Max = MAX_NPC_EVOLVE: .scrlNpcEvolve(0).Min = 1: .scrlNpcEvolve(0).Value = 1
If Npc(EditorIndex).Evolve(1).Data1(7) <= 0 Or Npc(EditorIndex).Evolve(1).Data1(7) > .scrlNpcEvolve(3).Max Then Npc(EditorIndex).Evolve(1).Data1(7) = 0
.scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(1).Data1(7)
.txtNpcEvolve(0).MaxLength = 2
.txtNpcEvolve(1).MaxLength = 2
.txtNpcEvolve(0).text = Npc(EditorIndex).Evolve(1).Data1(1)
.txtNpcEvolve(1).text = Npc(EditorIndex).Evolve(1).Data1(2)
If Npc(EditorIndex).Evolve(1).Data1(3) > 0 Then .chkNpcEvolve(0).Value = 1 Else .chkNpcEvolve(0).Value = 0
.scrlNpcEvolve(1).Value = Npc(EditorIndex).Evolve(1).Data1(4)
If Npc(EditorIndex).Evolve(1).Data1(5) > 0 Then .chkNpcEvolve(1).Value = 1 Else .chkNpcEvolve(1).Value = 0
.scrlNpcEvolve(2).Value = Npc(EditorIndex).Evolve(1).Data1(6)
.scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(1).Data1(7)
.txtNpcEvolve(2).text = Npc(EditorIndex).Evolve(1).Data1(8)
.txtNpcEvolve(3).text = Npc(EditorIndex).Evolve(1).Data1(9)
.txtNpcEvolve(4).text = Trim$(Npc(EditorIndex).Evolve(1).Data2)
Saia da NpcEditorInit, abaixo dela, adicione esta nova Sub.- Código:
Public Sub NpcEditor_EvolveTab(ByVal Index As Long)
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
'Normalizando Setor
If Index <= 0 Or Index > MAX_NPC_EVOLVE Then Index = 1
With frmEditor_NPC
''''''''''
' Evolve '
''''''''''
.scrlNpcEvolve(0).Max = MAX_NPC_EVOLVE: .scrlNpcEvolve(0).Min = 1
If Npc(EditorIndex).Evolve(Index).Data1(7) <= 0 Or Npc(EditorIndex).Evolve(Index).Data1(7) > .scrlNpcEvolve(3).Max Then Npc(EditorIndex).Evolve(Index).Data1(7) = 0
.scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(Index).Data1(7)
.txtNpcEvolve(0).text = Npc(EditorIndex).Evolve(Index).Data1(1)
.txtNpcEvolve(1).text = Npc(EditorIndex).Evolve(Index).Data1(2)
If Npc(EditorIndex).Evolve(Index).Data1(3) > 0 Then .chkNpcEvolve(0).Value = 1 Else .chkNpcEvolve(0).Value = 0
.scrlNpcEvolve(1).Value = Npc(EditorIndex).Evolve(Index).Data1(4)
If Npc(EditorIndex).Evolve(Index).Data1(5) > 0 Then .chkNpcEvolve(1).Value = 1 Else .chkNpcEvolve(1).Value = 0
.scrlNpcEvolve(2).Value = Npc(EditorIndex).Evolve(Index).Data1(6)
.scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(Index).Data1(7)
.txtNpcEvolve(2).text = Npc(EditorIndex).Evolve(Index).Data1(8)
.txtNpcEvolve(3).text = Npc(EditorIndex).Evolve(Index).Data1(9)
.txtNpcEvolve(4).text = Trim$(Npc(EditorIndex).Evolve(Index).Data2)
End With
' Error handler
Exit Sub
errorhandler:
HandleError "NpcEditor_EvolveTab", "modGameEditors", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
[ 1.3 - Adicionando Memórias no ModType ]
- Spoiler:
- Acesse o ModTypes no Cliente, procure por...
- Código:
Private Type MapNpcRec
Dentro dele, abaixo de- Código:
Dir As Byte
Adicione:- Código:
Evolve As Byte 'Guarda o Valor de Evolve do Npc
MaxHP As Long
Agora procure por...- Código:
Private Type NpcRec
Antes do End Type da sessão adicione:- Código:
Evolve(1 To MAX_NPC_EVOLVE) As EvolveRec
Acima de :- Código:
Private Type NpcRec
Adicione:- Código:
'Npc Evolve Data()
Private Type EvolveRec
Data1(1 To 9) As Integer 'Valores Numericos
Data2 As String * 100 'Valores em Texto
End Type
[ 1.4 - Delimitando Limites na velocidade da Luz ]
- Spoiler:
- Acesse agora o ModConstants, procure por ...
- Código:
Public Const MAX_PARTY_MEMBERS As Long = 4
Abaixo adicione:- Código:
Public Const MAX_NPC_EVOLVE As Byte = 4
O Valor correspondente ao "4" representa a quantidade de possiveis evoluções em cadeia a qual os NPC's terão de limite.Se o valor é 4, então ele terá até 4 transformações a qual você poderá ou não configurar.Não é interessante que você fique editando esse valor... decida um para o seu projeto, obviamente que não seja um valor esculhambado... a variavel da data está como Byte, então so irá até 255, caso queira usar mais do que 255 Evoluções no NPC então... Mude o Byte para um Integer ou Long ~(o.o~)
[ 1.5 - Preparação para mudança de Sprite ]
- Spoiler:
- Procure por :
- Código:
Public Sub BltNpc(ByVal MapNpcNum As Long)
Dentro dela, bem no inicio, procure por:- Código:
Sprite = Npc(MapNpc(MapNpcNum).num).Sprite
Abaixo adicione:- Código:
'Analisar Evolve
If MapNpc(MapNpcNum).Evolve > 0 Then
If Npc(MapNpc(MapNpcNum).num).Evolve(MapNpc(MapNpcNum).Evolve).Data1(7) > 0 Then
Sprite = Npc(MapNpc(MapNpcNum).num).Evolve(MapNpc(MapNpcNum).Evolve).Data1(7)
End If
End If
[ 1.6 - Barras ]
- Spoiler:
- Procure por:
- Código:
Private Sub BltBars()
Substitua TODA a SUB por isso aqui:- Código:
Private Sub BltBars()
Dim tmpY As Long, tmpX As Long
Dim sWidth As Long, sHeight As Long
Dim sRECT As RECT
Dim barWidth As Long
Dim i As Long, npcNum As Long, partyIndex As Long
Dim HaveMaxHP As Boolean
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
' dynamic bar calculations
sWidth = DDSD_Bars.lWidth
sHeight = DDSD_Bars.lHeight / 4
' render health bars
For i = 1 To MAX_MAP_NPCS
npcNum = MapNpc(i).num
' exists?
If npcNum > 0 Then
'Evolve Hp Show
If MapNpc(i).MaxHP > 0 Then
If MapNpc(i).Vital(Vitals.HP) > 0 And MapNpc(i).Vital(Vitals.HP) < MapNpc(i).MaxHP Then
GoTo RenderMaxHP
End If
End If
' alive?
If MapNpc(i).Vital(Vitals.HP) > 0 And MapNpc(i).Vital(Vitals.HP) < Npc(npcNum).HP Then
RenderMaxHP:
' lock to npc
tmpX = MapNpc(i).x * PIC_X + MapNpc(i).XOffset + 16 - (sWidth / 2)
tmpY = MapNpc(i).y * PIC_Y + MapNpc(i).YOffset + 35
' calculate the width to fill
barWidth = ((MapNpc(i).Vital(Vitals.HP) / sWidth) / (Npc(npcNum).HP / sWidth)) * sWidth
If MapNpc(i).Evolve > 0 And MapNpc(i).MaxHP > 0 Then
barWidth = ((MapNpc(i).Vital(Vitals.HP) / sWidth) / (MapNpc(i).MaxHP / sWidth)) * sWidth
End If
' draw bar background
With sRECT
.top = sHeight * 1 ' HP bar background
.Left = 0
.Right = .Left + sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = 0 ' HP bar
.Left = 0
.Right = .Left + barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
End If
Next
' check for casting time bar
If SpellBuffer > 0 Then
If Spell(PlayerSpells(SpellBuffer)).CastTime > 0 Then
' lock to player
tmpX = GetPlayerX(MyIndex) * PIC_X + Player(MyIndex).XOffset + 16 - (sWidth / 2)
tmpY = GetPlayerY(MyIndex) * PIC_Y + Player(MyIndex).YOffset + 35 + sHeight + 1
' calculate the width to fill
barWidth = (GetTickCount - SpellBufferTimer) / ((Spell(PlayerSpells(SpellBuffer)).CastTime * 1000)) * sWidth
' draw bar background
With sRECT
.top = sHeight * 3 ' cooldown bar background
.Left = 0
.Right = sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = sHeight * 2 ' cooldown bar
.Left = 0
.Right = barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
End If
' draw own health bar
If GetPlayerVital(MyIndex, Vitals.HP) > 0 And GetPlayerVital(MyIndex, Vitals.HP) < GetPlayerMaxVital(MyIndex, Vitals.HP) Then
' lock to Player
tmpX = GetPlayerX(MyIndex) * PIC_X + Player(MyIndex).XOffset + 16 - (sWidth / 2)
tmpY = GetPlayerY(MyIndex) * PIC_X + Player(MyIndex).YOffset + 35
' calculate the width to fill
barWidth = ((GetPlayerVital(MyIndex, Vitals.HP) / sWidth) / (GetPlayerMaxVital(MyIndex, Vitals.HP) / sWidth)) * sWidth
' draw bar background
With sRECT
.top = sHeight * 1 ' HP bar background
.Left = 0
.Right = .Left + sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = 0 ' HP bar
.Left = 0
.Right = .Left + barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
' draw party health bars
If Party.Leader > 0 Then
For i = 1 To MAX_PARTY_MEMBERS
partyIndex = Party.Member(i)
If (partyIndex > 0) And (partyIndex <> MyIndex) And (GetPlayerMap(partyIndex) = GetPlayerMap(MyIndex)) Then
' player exists
If GetPlayerVital(partyIndex, Vitals.HP) > 0 And GetPlayerVital(partyIndex, Vitals.HP) < GetPlayerMaxVital(partyIndex, Vitals.HP) Then
' lock to Player
tmpX = GetPlayerX(partyIndex) * PIC_X + Player(partyIndex).XOffset + 16 - (sWidth / 2)
tmpY = GetPlayerY(partyIndex) * PIC_X + Player(partyIndex).YOffset + 35
' calculate the width to fill
barWidth = ((GetPlayerVital(partyIndex, Vitals.HP) / sWidth) / (GetPlayerMaxVital(partyIndex, Vitals.HP) / sWidth)) * sWidth
' draw bar background
With sRECT
.top = sHeight * 1 ' HP bar background
.Left = 0
.Right = .Left + sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = 0 ' HP bar
.Left = 0
.Right = .Left + barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
End If
Next
End If
' Error handler
Exit Sub
errorhandler:
HandleError "BltBars", "modDirectDraw7", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
[ 1.7 - Recebimento ]
- Spoiler:
- Procure por :
- Código:
Private Sub HandleMapNpcData
Substitua TODA a SUB por...- Código:
Private Sub HandleMapNpcData(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
Dim i As Long, OnlyOne As Long
Dim Buffer As clsBuffer
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
Set Buffer = New clsBuffer
Buffer.WriteBytes Data()
OnlyOne = Buffer.ReadLong
If OnlyOne <= 0 Then
For i = 1 To MAX_MAP_NPCS
With MapNpc(i)
.num = Buffer.ReadLong
.x = Buffer.ReadLong
.y = Buffer.ReadLong
.Dir = Buffer.ReadLong
.Vital(HP) = Buffer.ReadLong
.Evolve = Buffer.ReadByte
.MaxHP = Buffer.ReadLong
End With
Next
Else
i = Buffer.ReadLong
With MapNpc(i)
.num = Buffer.ReadLong
.x = Buffer.ReadLong
.y = Buffer.ReadLong
.Dir = Buffer.ReadLong
.Vital(HP) = Buffer.ReadLong
.Evolve = Buffer.ReadByte
.MaxHP = Buffer.ReadLong
End With
End If
' Error handler
Exit Sub
errorhandler:
HandleError "HandleMapNpcData", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
[ 1.8 - Sensualidade da Form NPC Editor ]
- Spoiler:
- Procure por...
- Código:
Public Sub EditorNpc_BltSprite()
Acima dessa sub adicione:- Código:
Public Sub EditorNpc_BltSprite_Evolve()
Dim Sprite As Long
Dim sRECT As DxVBLib.RECT
Dim dRECT As DxVBLib.RECT
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
Sprite = frmEditor_NPC.scrlNpcEvolve(3).Value
If Sprite < 1 Or Sprite > NumCharacters Then
frmEditor_NPC.picNpcEvolve.Cls
Exit Sub
End If
CharacterTimer(Sprite) = GetTickCount + SurfaceTimerMax
If DDS_Character(Sprite) Is Nothing Then
Call InitDDSurf("characters\" & Sprite, DDSD_Character(Sprite), DDS_Character(Sprite))
End If
sRECT.top = 0
sRECT.Bottom = SIZE_Y
sRECT.Left = PIC_X * 3 ' facing down
sRECT.Right = sRECT.Left + SIZE_X
dRECT.top = 0
dRECT.Bottom = SIZE_Y
dRECT.Left = 0
dRECT.Right = SIZE_X
Call Engine_BltToDC(DDS_Character(Sprite), sRECT, dRECT, frmEditor_NPC.picNpcEvolve)
' Error handler
Exit Sub
errorhandler:
HandleError "EditorNpc_BltSprite_Evolve", "modDirectDraw7", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
_________________
"Mistress of shattered hopes and forever broken dreams"
Profane ~- Colaborador
- Mensagens : 818
Créditos : 130
Re: [Prof ~] NPC Evolve
- Server Side
[ 2.0 - Adicionando o Trigger Like a Rainbow]
- Spoiler:
- Dentro do servidor, eu indicaria adicionar um novo Modulo, no meu caso eu adicionei e o coloquei o Nome de...
- Código:
modNpcEvolve
Você não é obrigado a fazer o mesmo, mas em casos de organização é o decente a se fazer. Ainda mais se no futuro desejar maiores incrementações... saberá onde estar a área relacionada.
Dentro do novo modulo, adicione:- Código:
Option Explicit
'###################################################
'# Modulo Responsável por armazenar Funções e Subs #
'# relacionadas a Evolve dos Npc's. #
'###################################################
'Analisa se o Npc tem Evolução
Sub HaveNpcEvolve(ByVal mapNum As Long, ByVal MapNpcNum As Long)
Dim npcNum As Long, MaxVital As Long
Dim Npc_HP As Long
Dim Anim As Long
npcNum = MapNpc(mapNum).Npc(MapNpcNum).Num
'Ele está em momento de Evolve
If GetTickCount < MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer Then Exit Sub
'Analisar Slots de Evolução Baseado na Atual e no MAX
If MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1 <= MAX_NPC_EVOLVE Then
'Ha Alguma Evolução Disponível?
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(1) > 0 Then
'Existe evolução disponível, então analisar HP%
MaxVital = GetNpcMaxVital(npcNum, HP)
Npc_HP = MapNpc(mapNum).Npc(MapNpcNum).Vital(HP)
Npc_HP = (Npc_HP * 100) / MaxVital
'Bateu o Valor Necessário para Evolve?
If Npc_HP <= Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(1) Then
MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer = GetTickCount + 100 + (Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(2) * 1000) 'Aplica os Segundo para Evolve
'Analisar Animação
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4) > 0 And Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4) <= MAX_ANIMATIONS Then
Anim = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4)
If Len(Trim$(Animation(Anim).Name)) > 0 Then 'Enviar Animação de Pre Evolve
SendAnimation mapNum, Anim, MapNpc(mapNum).Npc(MapNpcNum).x, MapNpc(mapNum).Npc(MapNpcNum).y, TARGET_TYPE_NPC, MapNpcNum
End If
End If
End If
End If
End If
End Sub
[ 2.1 - Adicionando Constant de Max Evolve ]
- Spoiler:
Vá ao modConstants. Procure por...- Código:
Public Const MAX_PARTY_MEMBERS As Long = 4
Adicione abaixo:- Código:
Public Const MAX_NPC_EVOLVE As Byte = 4
Lembrando que é estritamente interessante que o Valor que foi colocado nesta Constante seja o mesmo a qual você decidiu no Client Side.
[ 2.2 - Adicionando as Memórias no Servidor. ]
- Spoiler:
Vá ao ModTypes no Servidor e procure por...- Código:
Private Type MapNpcRec
Dentro dele, de preferencia la pelo fim, antes do End Type, adicione:- Código:
Evolve As Byte 'Guarda o Valor de Evolve
Evolve_Timer As Long 'Tempo de Evolve Charge
'Evolve Effect's
HP_Up As Integer
Power_Up As Integer
MaxHp As Long
Agora procure por...- Código:
Private Type NpcRec
Dentro dele, de preferencia no final, antes do End Types.. adicione.- Código:
Evolve(1 To MAX_NPC_EVOLVE) As EvolveRec
Acima do...- Código:
Private Type NpcRec
Adicione:- Código:
'Npc Evolve Data()
Private Type EvolveRec
Data1(1 To 9) As Integer 'Valores Numericos
Data2 As String * 100 'Valores em Texto
End Type
[ 2.3 - Modificações de Gatilho ]
- Spoiler:
Vá ao modCombat no Servidor... Procure por...- Código:
Public Sub TryNpcAttackPlayer(ByVal MapNpcNum As Long, ByVal index As Long)
Dentro da Sub procure por...- Código:
' Get the damage we can do
Damage = GetNpcDamage(npcNum)
Abaixo dele adicione:- Código:
'Evolve Power Up
If MapNpc(mapNum).Npc(MapNpcNum).Power_Up > 0 Then Damage = Damage + ((Damage / 100) * MapNpc(mapNum).Npc(MapNpcNum).Power_Up)
Agora procure por...- Código:
Public Sub PlayerAttackNpc(ByVal attacker As Long, ByVal MapNpcNum As Long, ByVal Damage As Long, Optional ByVal spellnum As Long, Optional ByVal overTime As Boolean = False)
Dentro desta SUB, procure por...- Código:
' set the regen timer
TempPlayer(attacker).stopRegen = True
TempPlayer(attacker).stopRegenTimer = GetTickCount
Abaixo disso adicione:- Código:
'Evolve Immune
If MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer > 0 Then
If Npc(MapNpc(mapNum).Npc(MapNpcNum).Num).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(3) > 0 Then
Damage = 0
End If
End If
Ainda dentro da mesma sub, procure por...- 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
Abaixo adicione:- Código:
MapNpc(mapNum).Npc(MapNpcNum).Evolve = 0
MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer = 0
MapNpc(mapNum).Npc(MapNpcNum).MaxHp = 0
Ainda na SUB procure por...- Código:
' NPC not dead, just do the damage
MapNpc(mapNum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(mapNum).Npc(MapNpcNum).Vital(Vitals.HP) - Damage
Adicione abaixo...- Código:
'Analise de Evolve
HaveNpcEvolve mapNum, MapNpcNum
[ 2.4 - Serverlupando ]
- Spoiler:
Dentro do Servidor, procure o ModServerLoop, nele procure por...- Código:
Private Sub UpdateMapLogic()
Dentro desta Sub, iremos trabalhar, logo abaixo do titulo da Sub, junto as declarações ( Dim.. ) adicione..- Código:
Dim Data_Regen As Long 'Evolve
Agora, procure por...- Código:
If Map(mapNum).Npc(x) > 0 And MapNpc(mapNum).Npc(x).Num > 0 Then
Abaixo adicione:- Código:
'Analisar Evolução Pendente
If MapNpc(mapNum).Npc(x).Evolve_Timer > 0 Then
If GetTickCount > MapNpc(mapNum).Npc(x).Evolve_Timer Then
'Clear
MapNpc(mapNum).Npc(x).Evolve_Timer = 0
'Habilitar Evolve
MapNpc(mapNum).Npc(x).Evolve = MapNpc(mapNum).Npc(x).Evolve + 1
'Enviar Animação de Evolução caso tenha
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6) > 0 And Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6) <= MAX_ANIMATIONS Then
SendAnimation mapNum, Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6), MapNpc(mapNum).Npc(x).x, MapNpc(mapNum).Npc(x).y, TARGET_TYPE_NPC, x
End If
'Analisar Buff's Put
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(8) > 0 Then 'Power Up
MapNpc(mapNum).Npc(x).Power_Up = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(8)
End If
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(9) > 0 Then 'Hp Up
MapNpc(mapNum).Npc(x).HP_Up = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(9)
MapNpc(mapNum).Npc(x).MaxHp = GetNpcMaxVital(npcNum, HP) + ((GetNpcMaxVital(npcNum, HP) / 100) * MapNpc(mapNum).Npc(x).HP_Up)
End If
'Analisar Restauramento de Hp
If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(5) > 0 Then
MapNpc(mapNum).Npc(x).Vital(HP) = GetNpcMaxVital(npcNum, HP)
If MapNpc(mapNum).Npc(x).MaxHp > 0 Then MapNpc(mapNum).Npc(x).Vital(HP) = MapNpc(mapNum).Npc(x).MaxHp
End If
'Analisar Frase de Envio - Evolve
If Len(Trim$(Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data2)) > 0 Then
Call MapMsg(mapNum, Trim$(Npc(npcNum).Name) & " says: " & Trim$(Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data2), SayColor)
End If
'Atualizar NpcData
SendMapNpcsTo 0, mapNum, x
End If
End If
Mais abaixo, mas ainda na mesma SUB... procure por isso aqui..https://i.imgur.com/wGsG7yi.png
Caso queira buscar em códigos... aqui está..- Código:
' ////////////////////////////////////////////
' // This is used for regenerating NPC's HP //
' ////////////////////////////////////////////
' Check to see if we want to regen some of the npc's hp
If Not MapNpc(mapNum).Npc(x).stopRegen Then
If MapNpc(mapNum).Npc(x).Num > 0 And TickCount > GiveNPCHPTimer + 10000 Then
If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > 0 Then
MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = MapNpc(mapNum).Npc(x).Vital(Vitals.HP) + GetNpcVitalRegen(npcNum, Vitals.HP)
' Check if they have more then they should and if so just set it to max
If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > GetNpcMaxVital(npcNum, Vitals.HP) Then
MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = GetNpcMaxVital(npcNum, Vitals.HP)
End If
End If
End If
End If
Apague tudo isso ai, e no local adicione isso aqui.- Código:
' ////////////////////////////////////////////
' // This is used for regenerating NPC's HP //
' ////////////////////////////////////////////
' Check to see if we want to regen some of the npc's hp
If MapNpc(mapNum).Npc(x).stopRegen Then
If MapNpc(mapNum).Npc(x).Num > 0 And GetTickCount > MapNpc(mapNum).Npc(x).stopRegenTimer + 5000 Then
MapNpc(mapNum).Npc(x).stopRegenTimer = GetTickCount + 5000 'Tempo para a Proxima Regeneração
If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > 0 Then
Data_Regen = GetNpcVitalRegen(npcNum, Vitals.HP)
MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = MapNpc(mapNum).Npc(x).Vital(Vitals.HP) + Data_Regen
SendActionMsg mapNum, "-" & Data_Regen, BrightGreen, 1, (MapNpc(mapNum).Npc(x).x * 32), (MapNpc(mapNum).Npc(x).y * 32)
'Setted HP MAX
Data_Regen = GetNpcMaxVital(npcNum, Vitals.HP)
If MapNpc(mapNum).Npc(x).MaxHp > 0 Then Data_Regen = MapNpc(mapNum).Npc(x).MaxHp
' Check if they have more then they should and if so just set it to max
If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) >= Data_Regen Then
MapNpc(mapNum).Npc(x).stopRegen = False
'De-Evolve
MapNpc(mapNum).Npc(x).Evolve = 0
MapNpc(mapNum).Npc(x).Evolve_Timer = 0
MapNpc(mapNum).Npc(x).MaxHp = 0
MapNpc(mapNum).Npc(x).Power_Up = 0
'Setted Hp
Data_Regen = GetNpcMaxVital(npcNum, Vitals.HP)
MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = Data_Regen
'Atualizar NpcData
SendMapNpcsTo 0, mapNum, x
End If
SendMapNpcVitals mapNum, x
End If
End If
End If
Esse é o novo esquema de Regen, decente e que faz umas coisinhas em adicional com o NPC Evoluido.Mostrará o NPC regenerando HP, será responsável por retirar o NPC de Batalha permitindo a Regen, e caso o NPC consiga se recuperar por completo, então ele retornará o NPC ao estado inicial, não evoluído, e o ciclo da batalha poderá recomeçar.
[ 2.5 - Trick ou Trick ]
- Spoiler:
Aqui um leve aumento de Função ao Envio do NPC, no modServerTCP procure por...- Código:
Sub SendMapNpcsTo(ByVal index As Long
Substitua totalmente essa SUB por esta aqui...- Código:
Sub SendMapNpcsTo(ByVal index As Long, ByVal mapNum As Long, Optional ByVal OnlyOne As Long)
Dim packet As String
Dim i As Long
Dim Buffer As clsBuffer
Set Buffer = New clsBuffer
'Prevent Out of Range
If OnlyOne > MAX_MAP_NPCS Then Exit Sub
Buffer.WriteLong SMapNpcData
Buffer.WriteLong OnlyOne
If OnlyOne <= 0 Then
For i = 1 To MAX_MAP_NPCS
Buffer.WriteLong MapNpc(mapNum).Npc(i).Num
Buffer.WriteLong MapNpc(mapNum).Npc(i).x
Buffer.WriteLong MapNpc(mapNum).Npc(i).y
Buffer.WriteLong MapNpc(mapNum).Npc(i).Dir
Buffer.WriteLong MapNpc(mapNum).Npc(i).Vital(HP)
Buffer.WriteByte MapNpc(mapNum).Npc(i).Evolve
Buffer.WriteLong MapNpc(mapNum).Npc(i).MaxHp
Next
Else
i = OnlyOne
Buffer.WriteLong i
Buffer.WriteLong MapNpc(mapNum).Npc(i).Num
Buffer.WriteLong MapNpc(mapNum).Npc(i).x
Buffer.WriteLong MapNpc(mapNum).Npc(i).y
Buffer.WriteLong MapNpc(mapNum).Npc(i).Dir
Buffer.WriteLong MapNpc(mapNum).Npc(i).Vital(HP)
Buffer.WriteByte MapNpc(mapNum).Npc(i).Evolve
Buffer.WriteLong MapNpc(mapNum).Npc(i).MaxHp
End If
If index > 0 And index <= MAX_PLAYERS Then
SendDataTo index, Buffer.ToArray()
ElseIf index <= 0 Then
SendDataToMap mapNum, Buffer.ToArray() 'E assim nascem as gambiarras ~
End If
Set Buffer = Nothing
End Sub
Creio que está tudo ai... Caso venha a dar algum tipo de problema refaça.. leia todos os coments do Post caso tenha, e por ultimo se não conseguir resolver (se é que vai encontrar problemas /o/) você manda ai o Buxo que tentamos ajudar.
A Configuração é bem simples, adicione os valores que é sucesso.
Não é necessário apagar os NPC's já feitos, porém é interessante que seja feito... O Designer do Sistema foi feito em cima de uma EO 2.0. No que foi mexido não se é necessário perder os NPCs.
Com a estrutura montada é possível configurar infinitas coisas em adicional e etc.
Link para Download da Engine Mãe já contendo o sistema programado direto pela Loved Me.
http://www.mediafire.com/file/0ovwt3goc7vhtw5/EO_2.0_NPC_Evolution.rar/file
_________________
"Mistress of shattered hopes and forever broken dreams"
Profane ~- Colaborador
- Mensagens : 818
Créditos : 130
Re: [Prof ~] NPC Evolve
Ficou bom, agora faz o npc voar.
DragonicK- Experiente
- Mensagens : 543
Créditos : 81
Ficha do personagem
Nível: 1
Experiência:
(0/0)
Vida:
(30/30)
Re: [Prof ~] NPC Evolve
DragonicK escreveu:Ficou bom, agora faz o npc voar.
OFWGKTA- Experiente
- Mensagens : 408
Créditos : 27
Ficha do personagem
Nível: 1
Experiência:
(5/50)
Vida:
(30/30)
Tópicos semelhantes
» [Prof ~] Sistema de Herói (Guardião)
» [Prof ~] Adicionando Mapas Parallax
» [Prof ~] Sistema de Transformação
» [Prof ~] Add-On - Transformação por Foto
» [Prof~] Sistema de Reputação
» [Prof ~] Adicionando Mapas Parallax
» [Prof ~] Sistema de Transformação
» [Prof ~] Add-On - Transformação por Foto
» [Prof~] Sistema de Reputação
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos