Bora sair um pouco dos mesmos npc's, e vamos dar mais dificuldade ao jogo. Que tal um npc que você está lutando contra, e de repente, ele upa e dos 64 de dano que você tirava, agora tira 60, e ele que te atacava com 10, agora ataca com 11...Claro, a exp ganha é aumentada conforme o perigo.
Sem mais delongas vamos lá, que é rapidão.
Abra seu 'client.vbp' , e em "ModText" , na "Public Sub DrawNpcName" , procure por:
E substitua por:
Agora em "ModTypes" , na "Private Type MapNpcRec", declar um TIPO: descendo, antes do primeiro "End Type" , adicione isso:
Agora, em "ModHandleData" , na "Private Sub HandleMapNpcData" , procure por:
E abaixo disto, adicione isso:
Ainda em "ModHandleData" , mas na "Private Sub HandleSpawnNpc" , procure por:
E abaixo disto, adicione isso:
Pronto, ~Client Side~ finalizado, vamos ao ~Server Side~.
Abra seu 'server.vbp' , e em "ModGameLogic" na "Public Sub SpawnNpc" , procure por:
E abaixo disto, adicione isso:
Ainda em "ModGameLogic" na "Public Sub SpawnNpc" mais abaixo , procure por:
E abaixo disto, adicione isso:
Agora, no final de "ModGameLogic" , adicione essa Sub:
Agora, em "ModServerTCP" , na "Sub SendMapNpcsTo" , procure por:
E abaixo disto, adicione isso:
Ainda em "ModServerTCP" , na "Sub SendMapNpcsToMap" , procure por:
E abaixo disto, adicione isso:
Agora, em "ModTypes" , procure por "Private Type MapNpcRec" , e declare um TIPO: descendo antes do primeiro "End Type", adicione isso:
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc" , procure por:
E substitua por:
Ainda em "ModCombat" , na "Public Sub TryNpcAttackPlayer" , procure por essa parte:
E substitua por isso:
Agora, no final de "ModCombat" , adicione isso:
Ainda em "ModCombat" , procure pela "Function GetNpcDamage(ByVal NpcNum As Long) As Long" , e substitua ela por isso:
Mais uma vez em "ModCombat" , na "Public Sub TryPlayerAttackPlayer" , procure por essa parte:
E substitua por essa:
Ainda em "ModCombat" , na "Public Sub CastSpell" , procure por essa parte:
E substitua por isso:
Ainda em "ModCombat" na "Public Sub CastSpell" , procure por essa parte:
E substitua por essa:
Agora, ainda em "ModCombat" na "Public Sub PlayerAttackNpc" , procure por isso:
E abaixo disto, adicione isso:
E ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , bem no início procure por isso:
E abaixo disto, aicione isso:
E ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , procure por isso:
E abaixo disto, adicione isso:
E finalmente, ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , procure por isso:
E abixo disto, adicione isso:
E pronto!
Explicação:
- O NPC ao ser atacado ganha exp entre 1 e 10 aleatoriamente;
- O NPC ao atacar ganha exp entre 1 e 10 aleatoriamente;
- Com 100 ou mais de exp, ele UPA +1 nível, zera a exp e ganha 5 pontos de Status;
- Os 5 pontos são distribuídos aleatoriamente entre os 5 status do MapNpc(Str, End, Int, Agi, Will);
- MapNpcDamage = 100% STR + 50% AGI;
- MapNpcDefense = 100% END + 50% WILL;
- MapNpcMagicDefense = 100% INT + 50% WILL;
- O MapNpc zera o nível e status ganho ao ser: Morto, Respawnado e Server Reiniciado;
- A EXP que um jogador ganha ao matar um npc é: EXP do editor + (1~3) + 2% por nível do MapNpc da EXP do editor + nível do MapNpc. Ex.:
Exp no editor: 100;
Nível o MapNpc: 10;
Exp = 100 + (1 ou 2 ou 3) + 20 + 10.
E é isso, qualquer dúvida ou bug, me avisem!
Sem mais delongas vamos lá, que é rapidão.
Abra seu 'client.vbp' , e em "ModText" , na "Public Sub DrawNpcName" , procure por:
- Spoiler:
- Name = Trim$(Npc(npcNum).Name)
E substitua por:
- Spoiler:
- Name = Trim$(Npc(npcNum).Name) & "(Lv." & MapNpc(Index).BattleLevel & ")"
Agora em "ModTypes" , na "Private Type MapNpcRec", declar um TIPO: descendo, antes do primeiro "End Type" , adicione isso:
- Spoiler:
BattleExp As Long
BattleLevel As Long
Agora, em "ModHandleData" , na "Private Sub HandleMapNpcData" , procure por:
- Spoiler:
- .Vital(HP) = buffer.ReadLong
E abaixo disto, adicione isso:
- Spoiler:
- .BattleLevel = buffer.ReadLong
Ainda em "ModHandleData" , mas na "Private Sub HandleSpawnNpc" , procure por:
- Spoiler:
- .Dir = buffer.ReadLong
E abaixo disto, adicione isso:
- Spoiler:
- .BattleLevel = buffer.ReadLong
Pronto, ~Client Side~ finalizado, vamos ao ~Server Side~.
Abra seu 'server.vbp' , e em "ModGameLogic" na "Public Sub SpawnNpc" , procure por:
- Spoiler:
- MapNpc(MapNum).Npc(MapNpcNum).Dir = Int(Rnd * 4)
E abaixo disto, adicione isso:
- Spoiler:
MapNpc(MapNum).Npc(MapNpcNum).BattleExp = 0
MapNpc(MapNum).Npc(MapNpcNum).BattleLevel = 0
For i = 1 To Stats.Stat_Count - 1
MapNpc(MapNum).Npc(MapNpcNum).BattleStats(i) = 0
Next
Ainda em "ModGameLogic" na "Public Sub SpawnNpc" mais abaixo , procure por:
- Spoiler:
Buffer.WriteLong MapNpc(MapNum).Npc(MapNpcNum).Dir
E abaixo disto, adicione isso:
- Spoiler:
- Buffer.WriteLong MapNpc(MapNum).Npc(MapNpcNum).BattleLevel
Agora, no final de "ModGameLogic" , adicione essa Sub:
- Spoiler:
Public Sub MapNpcLevelUp(ByVal MapNum As Long, ByVal MapNpcNum As Long)
Dim GainAmount As Long, GainStats As Long, HealAmount As Long
Dim r As Long
Dim sNpc As Long
' Check for subscript out of range
If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Then Exit Sub
If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Sub
If MapNpc(MapNum).Npc(MapNpcNum).BattleExp >= 100 Then
'Gain stats as level up
GainAmount = 5
For r = 1 To Stats.Stat_Count - 1
If GainAmount > 0 Then
GainStats = RAND(1, 5)
MapNpc(MapNum).Npc(MapNpcNum).BattleStats(GainStats) = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(GainStats) + 1
GainAmount = GainAmount - 1
Else
Exit For
End If
Next
MapNpc(MapNum).Npc(MapNpcNum).BattleLevel = MapNpc(MapNum).Npc(MapNpcNum).BattleLevel + 1
MapNpc(MapNum).Npc(MapNpcNum).BattleExp = 0
If MapNpc(MapNum).Npc(MapNpcNum).Vital(Vitals.HP) > 0 Then
HealAmount = Npc(MapNpc(MapNum).Npc(MapNpcNum).Num).HP * 0.2 '20% of max HP
MapNpc(MapNum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(MapNum).Npc(MapNpcNum).Vital(Vitals.HP) + HealAmount
SendActionMsg MapNum, "+" & HealAmount, BrightGreen, 1, (MapNpc(MapNum).Npc(MapNpcNum).x * 32), (MapNpc(MapNum).Npc(MapNpcNum).y * 32)
End If
SendActionMsg MapNum, "Level Up!", Yellow, 0, (MapNpc(MapNum).Npc(MapNpcNum).x * 32), (MapNpc(MapNum).Npc(MapNpcNum).y * 32)
Call SendMapNpcsToMap(MapNum)
End If
End Sub
Agora, em "ModServerTCP" , na "Sub SendMapNpcsTo" , procure por:
- Spoiler:
- Buffer.WriteLong MapNpc(MapNum).Npc(i).Vital(HP)
E abaixo disto, adicione isso:
- Spoiler:
- Buffer.WriteLong MapNpc(MapNum).Npc(i).BattleLevel
Ainda em "ModServerTCP" , na "Sub SendMapNpcsToMap" , procure por:
- Spoiler:
- Buffer.WriteLong MapNpc(MapNum).Npc(i).Vital(HP)
E abaixo disto, adicione isso:
- Spoiler:
- Buffer.WriteLong MapNpc(MapNum).Npc(i).BattleLevel
Agora, em "ModTypes" , procure por "Private Type MapNpcRec" , e declare um TIPO: descendo antes do primeiro "End Type", adicione isso:
- Spoiler:
BattleExp As Long
BattleLevel As Long
BattleStats(1 To Stats.Stat_Count - 1) As Long
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc" , procure por:
- Spoiler:
' Calculate exp to give attacker
exp = Npc(npcNum).exp
' Make sure we dont get less then 0
If exp < 0 Then
exp = 1
End If
E substitua por:
- Spoiler:
' Calculate exp to give attacker
Exp = Npc(NpcNum).Exp + RAND(1, 3)
If MapNpc(MapNum).Npc(MapNpcNum).BattleLevel > 0 Then
Exp = Exp + (Exp * MapNpc(MapNum).Npc(MapNpcNum).BattleLevel / 50) + MapNpc(MapNum).Npc(MapNpcNum).BattleLevel
End If
' Make sure we dont get less then 0
If Exp < 0 Then
Exp = 0
End If
Ainda em "ModCombat" , na "Public Sub TryNpcAttackPlayer" , procure por essa parte:
- Spoiler:
' Get the damage we can do
Damage = GetNpcDamage(npcNum)
' if the player blocks, take away the block amount
blockAmount = CanPlayerBlock(index)
Damage = Damage - blockAmount
' take away armour
Damage = Damage - RAND(1, (GetPlayerStat(index, Agility) * 2))
' randomise for up to 10% lower than max hit
Damage = RAND(1, Damage)
E substitua por isso:
- Spoiler:
If MapNpc(MapNum).Npc(MapNpcNum).BattleLevel > 0 Then
Damage = Damage + (Damage * MapNpc(MapNum).Npc(MapNpcNum).BattleLevel / 50)
End If
'Damage from MapNpc
Damage = Damage + MapNpcDamage(MapNum, MapNpcNum)
' Get from Npc on Editor
Damage = Damage + GetNpcDamage(NpcNum)
' if the player blocks, take away the block amount
blockAmount = CanPlayerBlock(index)
Damage = Damage - blockAmount
Agora, no final de "ModCombat" , adicione isso:
- Spoiler:
Public Function MapNpcDamage(ByVal MapNum, ByVal MapNpcNum As Long) As Long
Dim Eq1 As Long, Eq2 As Long
Dim rndNum As Long
MapNpcDamage = 0
Eq1 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Strength)
Eq2 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Agility) * 0.5
MapNpcDamage = Eq1 + Eq2
End Function
Public Function MapNpcDefense(ByVal MapNum, ByVal MapNpcNum As Long) As Long
Dim Eq1 As Long, Eq2 As Long
Dim rndNum As Long
MapNpcDefense = 0
Eq1 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Endurance)
Eq2 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Willpower) * 0.5
MapNpcDefense = Eq1 + Eq2
End Function
Public Function MapNpcMagicDefense(ByVal MapNum, ByVal MapNpcNum As Long) As Long
Dim Eq1 As Long, Eq2 As Long
Dim rndNum As Long
MapNpcMagicDefense = 0
Eq1 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Intelligence)
Eq2 = MapNpc(MapNum).Npc(MapNpcNum).BattleStats(Stats.Willpower) * 0.5
MapNpcMagicDefense = Eq1 + Eq2
End Function
Ainda em "ModCombat" , procure pela "Function GetNpcDamage(ByVal NpcNum As Long) As Long" , e substitua ela por isso:
- Spoiler:
Function GetNpcDamage(ByVal NpcNum As Long) As Long
GetNpcDamage = Npc(NpcNum).Stat(Stats.Strength) + Npc(NpcNum).Damage + (Npc(NpcNum).Level)
End Function
Mais uma vez em "ModCombat" , na "Public Sub TryPlayerAttackPlayer" , procure por essa parte:
- Spoiler:
' Get the damage we can do
Damage = GetPlayerDamage(attacker)
' if the npc blocks, take away the block amount
blockAmount = CanPlayerBlock(victim)
Damage = Damage - blockAmount
' take away armour
Damage = Damage - RAND(1, (GetPlayerStat(victim, Agility) * 2))
' randomise for up to 10% lower than max hit
Damage = RAND(1, Damage)
' * 1.5 if can crit
If CanPlayerCrit(attacker) Then
Damage = Damage * 1.5
SendActionMsg mapNum, "Critical!", BrightCyan, 1, (GetPlayerX(attacker) * 32), (GetPlayerY(attacker) * 32)
End If
If Damage > 0 Then
Call PlayerAttackPlayer(attacker, victim, Damage)
Else
Call PlayerMsg(attacker, "Your attack does nothing.", BrightRed)
End If
E substitua por essa:
- Spoiler:
' Get the damage we can do
Damage = GetPlayerDamage(index)
' if the npc blocks, take away the block amount
blockAmount = CanNpcBlock(MapNpcNum)
Damage = Damage - blockAmount
Damage = Damage - MapNpcDefense(GetPlayerMap(index), MapNpcNum)
' * 1.5 if it's a crit!
If CanPlayerCrit(index) Then
Damage = Damage * 1.5
SendActionMsg MapNum, "Critical!", BrightCyan, 1, (GetPlayerX(index) * 32), (GetPlayerY(index) * 32)
End If
If Damage > 0 Then
Call PlayerAttackNpc(index, MapNpcNum, Damage)
Else
'Call PlayerMsg(index, "Your attack does nothing.", BrightRed)
SendActionMsg GetPlayerMap(index), "*-" & Damage & "*", White, 1, (MapNpc(MapNum).Npc(MapNpcNum).x * 32), (MapNpc(MapNum).Npc(MapNpcNum).y * 32)
End If
Ainda em "ModCombat" , na "Public Sub CastSpell" , procure por essa parte:
- Spoiler:
For i = 1 To MAX_MAP_NPCS
If MapNpc(mapNum).Npc(i).Num > 0 Then
If MapNpc(mapNum).Npc(i).Vital(HP) > 0 Then
If isInRange(AoE, x, y, MapNpc(mapNum).Npc(i).x, MapNpc(mapNum).Npc(i).y) Then
If CanPlayerAttackNpc(index, i, True) Then
SendAnimation mapNum, Spell(spellnum).SpellAnim, 0, 0, TARGET_TYPE_NPC, i
PlayerAttackNpc index, i, Vital, spellnum
End If
End If
End If
End If
Next
E substitua por isso:
- Spoiler:
For i = 1 To MAX_MAP_NPCS
If MapNpc(MapNum).Npc(i).Num > 0 Then
If MapNpc(MapNum).Npc(i).Vital(HP) > 0 Then
If isInRange(AoE, x, y, MapNpc(MapNum).Npc(i).x, MapNpc(MapNum).Npc(i).y) Then
If CanPlayerAttackNpc(index, i, True) Then
Vital = Vital - MapNpcMagicDefense(MapNum, i)
SendAnimation MapNum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, i
PlayerAttackNpc index, i, Vital, SpellNum
End If
End If
End If
End If
Next
Ainda em "ModCombat" na "Public Sub CastSpell" , procure por essa parte:
- Spoiler:
If CanPlayerAttackNpc(index, Target, True) Then
If Vital > 0 Then
SendAnimation MapNum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, Target
PlayerAttackNpc index, Target, Vital, SpellNum
DidCast = True
End If
End If
E substitua por essa:
- Spoiler:
If CanPlayerAttackNpc(index, Target, True) Then
If Vital > 0 Then
Vital = Vital - MapNpcMagicDefense(MapNum, Target)
SendAnimation MapNum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, Target
PlayerAttackNpc index, Target, Vital, SpellNum
DidCast = True
End If
End If
Agora, ainda em "ModCombat" na "Public Sub PlayerAttackNpc" , procure por isso:
- Spoiler:
' NPC not dead, just do the damage
MapNpc(MapNum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(MapNum).Npc(MapNpcNum).Vital(Vitals.HP) - Damage
E abaixo disto, adicione isso:
- Spoiler:
Dim GainExp As Long
GainExp = RAND(1, 10)
MapNpc(MapNum).Npc(MapNpcNum).BattleExp = MapNpc(MapNum).Npc(MapNpcNum).BattleExp + GainExp
'Level up
If MapNpc(MapNum).Npc(MapNpcNum).BattleExp >= 100 Then
MapNpcLevelUp MapNum, MapNpcNum
End If
E ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , bem no início procure por isso:
- Spoiler:
- Dim Buffer As clsBuffer
E abaixo disto, aicione isso:
- Spoiler:
- Dim GainExp As Long
E ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , procure por isso:
- Spoiler:
' Player is dead
Call GlobalMsg(GetPlayerName(Victim) & " has been killed by " & Name, BrightRed)
E abaixo disto, adicione isso:
- Spoiler:
'Killed a player, level up almost instantly
GainExp = RAND(50, 99)
MapNpc(MapNum).Npc(MapNpcNum).BattleExp = MapNpc(MapNum).Npc(MapNpcNum).BattleExp + GainExp
'Level up
If MapNpc(MapNum).Npc(MapNpcNum).BattleExp >= 100 Then
MapNpcLevelUp MapNum, MapNpcNum
End If
E finalmente, ainda em "ModCombat" na "Public Sub NpcAttackPlayer" , procure por isso:
- Spoiler:
SendBlood GetPlayerMap(Victim), GetPlayerX(Victim), GetPlayerY(Victim)
E abixo disto, adicione isso:
- Spoiler:
GainExp = RAND(1, 10)
MapNpc(MapNum).Npc(MapNpcNum).BattleExp = MapNpc(MapNum).Npc(MapNpcNum).BattleExp + GainExp
'Level up
If MapNpc(MapNum).Npc(MapNpcNum).BattleExp >= 100 Then
MapNpcLevelUp MapNum, MapNpcNum
End If
E pronto!
Explicação:
- O NPC ao ser atacado ganha exp entre 1 e 10 aleatoriamente;
- O NPC ao atacar ganha exp entre 1 e 10 aleatoriamente;
- Com 100 ou mais de exp, ele UPA +1 nível, zera a exp e ganha 5 pontos de Status;
- Os 5 pontos são distribuídos aleatoriamente entre os 5 status do MapNpc(Str, End, Int, Agi, Will);
- MapNpcDamage = 100% STR + 50% AGI;
- MapNpcDefense = 100% END + 50% WILL;
- MapNpcMagicDefense = 100% INT + 50% WILL;
- O MapNpc zera o nível e status ganho ao ser: Morto, Respawnado e Server Reiniciado;
- A EXP que um jogador ganha ao matar um npc é: EXP do editor + (1~3) + 2% por nível do MapNpc da EXP do editor + nível do MapNpc. Ex.:
Exp no editor: 100;
Nível o MapNpc: 10;
Exp = 100 + (1 ou 2 ou 3) + 20 + 10.
E é isso, qualquer dúvida ou bug, me avisem!
~Créditos~
Kotol