Tópico retirado da MMORPGBR
Bem vc deve estar se perguntando pra que outro tópico de spell linear, sendo que existes vários outros aqui.
Resposta: é que todos os que existem não funcionam 100%, sempre tem algum bug, ou algo do tipo e esse meu sim funciona 100%, chega de enrolar e vamos para o tutorial.
antes de mais nada Spell Linear, é spell em area ou magia reta.
1° Abra o sourcer do Cliente
procure por:
Cliente pronto, agora vamos para o Servidor~
na sub Public Sub CastSpell procure por:
adicione:
adicione:
acho que é só, caso de algum erro me informe aqui no TÓPICO.
obs: spell baseado nos status, funciona com este tutorial :)
Bem vc deve estar se perguntando pra que outro tópico de spell linear, sendo que existes vários outros aqui.
Resposta: é que todos os que existem não funcionam 100%, sempre tem algum bug, ou algo do tipo e esse meu sim funciona 100%, chega de enrolar e vamos para o tutorial.
antes de mais nada Spell Linear, é spell em area ou magia reta.
1° Abra o sourcer do Cliente
procure por:
- Código:
Public Const SPELL_TYPE_WARP As Byte = 4
- Código:
Public Const SPELL_TYPE_LINEAR As Byte = 5 ' ou o proximo numero
- Código:
Spell(EditorIndex).Type = cmbType.ListIndex
If cmbType.text = "Linear" Then
scrlRange.Value = 0
chkAOE.Value = 1
End If
Linear
Cliente pronto, agora vamos para o Servidor~
na sub Public Sub CastSpell procure por:
- Código:
Dim x As Long, y As Long
- Código:
Dim Linha As Integer
Dim Calculate As Long
- Código:
Case 2 ' targetted
If targetType = 0 Then Exit Sub
If target = 0 Then Exit Sub
If targetType = TARGET_TYPE_PLAYER Then
x = GetPlayerX(target)
y = GetPlayerY(target)
Else
x = MapNpc(mapnum).NPC(target).x
y = MapNpc(mapnum).NPC(target).y
End If
If Not isInRange(Range, GetPlayerX(index), GetPlayerY(index), x, y) Then
PlayerMsg index, "Target not in range.", BrightRed
SendClearSpellBuffer index
Exit Sub
End If
- Código:
Case SPELL_TYPE_LINEAR
DidCast = True
Linha = 1
Do While Linha < Spell(spellnum).AoE
Select Case GetPlayerDir(index)
Case DIR_UP
Calculate = GetPlayerY(index) - Linha
If Calculate <= 0 Then Exit Sub
If Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index) - Linha).Type = TILE_TYPE_BLOCKED Then Exit Sub
SendAnimation GetPlayerMap(index), Spell(spellnum).SpellAnim, GetPlayerX(index), GetPlayerY(index) - Linha
IsUseLinear index, spellnum, Vital, GetPlayerMap(index), GetPlayerX(index), GetPlayerY(index) - Linha
Case DIR_DOWN
Calculate = GetPlayerY(index) + Linha
If Calculate >= Map(Linha).MaxY Then Exit Sub
If Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index) + Linha).Type = TILE_TYPE_BLOCKED Then Exit Sub
SendAnimation GetPlayerMap(index), Spell(spellnum).SpellAnim, GetPlayerX(index), GetPlayerY(index) + Linha
IsUseLinear index, spellnum, Vital, GetPlayerMap(index), GetPlayerX(index), GetPlayerY(index) + Linha
Case DIR_LEFT
Calculate = GetPlayerX(index) - Linha
If Calculate <= 0 Then Exit Sub
If Map(GetPlayerMap(index)).Tile(GetPlayerX(index) - Linha, GetPlayerY(index)).Type = TILE_TYPE_BLOCKED Then Exit Sub
SendAnimation GetPlayerMap(index), Spell(spellnum).SpellAnim, GetPlayerX(index) - Linha, GetPlayerY(index)
IsUseLinear index, spellnum, Vital, GetPlayerMap(index), GetPlayerX(index) - Linha, GetPlayerY(index)
Case DIR_RIGHT
Calculate = GetPlayerX(index) + Linha
If Calculate <= 0 Then Exit Sub
If Map(GetPlayerMap(index)).Tile(GetPlayerX(index), GetPlayerY(index)).Type = TILE_TYPE_BLOCKED Then Exit Sub
SendAnimation GetPlayerMap(index), Spell(spellnum).SpellAnim, GetPlayerX(index) + Linha, GetPlayerY(index)
IsUseLinear index, spellnum, Vital, GetPlayerMap(index), GetPlayerX(index) + Linha, GetPlayerY(index)
End Select
Linha = Linha + 1
Loop
End Select
adicione:
- Código:
Function IsUseLinear(ByVal index As Integer, ByVal spellnum As Integer, ByVal Vital As Long, ByVal Mapa As Integer, ByVal x As Byte, ByVal y As Byte)
Dim i As Long
'Loop Global Npc
For i = 1 To MAX_MAP_NPCS
If MapNpc(Mapa).NPC(i).Num > 0 And MapNpc(Mapa).NPC(i).x = x And MapNpc(Mapa).NPC(i).y = y And MapNpc(Mapa).NPC(i).Vital(HP) > 0 Then PlayerAttackNpc index, i, Vital, spellnum
Next
'Loop Global Player
For i = 1 To Player_HighIndex
If GetPlayerMap(i) = Mapa And GetPlayerX(i) = x And GetPlayerY(i) = y Then PlayerAttackPlayer index, i, Vital, spellnum
Next
End Function
- Código:
Public Const SPELL_TYPE_WARP As Byte = 4
adicione:
- Código:
Public Const SPELL_TYPE_LINEAR As Byte = 5
acho que é só, caso de algum erro me informe aqui no TÓPICO.
obs: spell baseado nos status, funciona com este tutorial :)
Créditos
Dazateam (Rodrigo)