How would it be possible to get agility to actually make people faster?

How would it be possible to get agility to actually make people faster? :wacko:

Yes it is possible. I think there’s a tutorial on that too might.

Yes it is possible. I think there’s a tutorial on that too might.

How and is have completely two different meanings.

But yea check the tutorials board. There might be a tutorial on it.

Zhavier,

Assuming walk speed? “Faster” is fairly ambiguous. Here’s some code, and I’ll explore attack speed after.

If you haven’t found the tutorial, it’s quite simple. Search for the following client-side under modConstants```

' Check if player is walking, and if so process moving them over

Select Case Player(Index).Moving

    Case MOVING_WALKING: MovementSpeed = ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))

    Case MOVING_RUNNING: MovementSpeed = ((ElapsedTime / 1000) * (RUN_SPEED * SIZE_X))

    Case Else: Exit Sub

End Select

Where you see WALK_SPEED * SIZE_X and RUN_SPEED * SIZE_X use some algebra involving GetPlayerStat(Index, Agility). Note that the default walk speed is 4, run speed is 6, and anything past 12 seems to become buggy in certain situations. Since twelve is very fast I recommend it or something slightly lower as your upper limit for your formula.

For example:

' Check if player is walking, and if so process moving them over

Select Case Player(Index).Moving

    dim m as long

    m = (GetPlayerStat(Index, Agility) + 180 / 200)

    If m < 1 Then m = 1

    If m > 2 Then m = 2

    Case MOVING_WALKING: MovementSpeed = ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X) * m)

    Case MOVING_RUNNING: MovementSpeed = ((ElapsedTime / 1000) * (RUN_SPEED * SIZE_X) * m)

    Case Else: Exit Sub

End Select

The Dim m As Long should be moved to the top of the Sub.

This should fluctuate movement speed between 4-8/6-12 for walk/run based on agility. The formula up there will begin increasing speed at 20 agility and max out at 220, when it doubles walk and run speed. Each point in agility should increase movement speed by .5%, but I'm not sure if you'd see it gradual or in steps. Play around with it. You want a formula with an input of player agility and an output between 1 and 2.

As a side note, I always found it funny that you can do client-side this to player speed. Try to do this to NPC speed and it's like a strange game of hopscotch or chicken-walk. Ah the difference ServerLoop makes.

Now, if you meant faster in terms of, say, attack speed…

_**Server-side**_ under Sub CanPlayerAttackNPC change

    ' attack speed from weapon

    If GetPlayerEquipment(attacker, weapon) > 0 Then

	    attackspeed = Item(GetPlayerEquipment(attacker, weapon)).speed

    Else

	    attackspeed = 1000

    End If
to something like

    ' attack speed from weapon

    If GetPlayerEquipment(attacker, weapon) > 0 Then

	    attackspeed = Item(GetPlayerEquipment(attacker, weapon)).speed - GetPlayerStat(attacker,Agility)

    Else

	    attackspeed = 1000 - GetPlayerStat(attacker,Agility)

    End If

To make your attack speed 1ms faster per AGI. You may want to increase. Although with AGI already having huge benefits in-game, you could easily make it imbalanced.

In Sub CanPlayerAttackPlayer

If Not IsSpell Then

    ' Check attack timer

    If GetPlayerEquipment(attacker, weapon) > 0 Then

	    If GetTickCount < TempPlayer(attacker).AttackTimer + Item(GetPlayerEquipment(attacker, weapon)).speed Then Exit Function

    Else

	    If GetTickCount < TempPlayer(attacker).AttackTimer + 1000 Then Exit Function

    End If

End If
to something like```

    If Not IsSpell Then

	    ' Check attack timer

	    If GetPlayerEquipment(attacker, weapon) > 0 Then

		    If GetTickCount < TempPlayer(attacker).AttackTimer + Item(GetPlayerEquipment(attacker, weapon)).speed - GetPlayerStat(attacker,Agility) Then Exit Function

	    Else

		    If GetTickCount < TempPlayer(attacker).AttackTimer + 1000 - GetPlayerStat(attacker,Agility) Then Exit Function

	    End If

    End If

As above, 1ms per agi - but this time against players.

Client-side in modGameLogic’s Sub CheckAttack


	    ' speed from weapon

	    If GetPlayerEquipment(MyIndex, Weapon) > 0 Then

		    attackspeed = Item(GetPlayerEquipment(MyIndex, Weapon)).speed

	    Else

		    attackspeed = AttTimeNoWep

	    End If

to something like


	    ' speed from weapon

	    If GetPlayerEquipment(MyIndex, Weapon) > 0 Then

		    attackspeed = Item(GetPlayerEquipment(MyIndex, Weapon)).speed - GetPlayerStat(MyIndex, Agility)

	    Else

		    attackspeed = AttTimeNoWep - GetPlayerStat(MyIndex, Agility)

	    End If

This will line up your attack checks with your changed attack speed. The changes here should mirror those in the server’s CanAttack subs. If they don’t, the timers won’t line up and you might actually be slower. Womp.

And in Sub DrawPlayer


    ' speed from weapon

    If GetPlayerEquipment(Index, Weapon) > 0 Then

	    attackspeed = Item(GetPlayerEquipment(Index, Weapon)).speed

    Else

	    attackspeed = 1000

    End If

to something like```

' speed from weapon

If GetPlayerEquipment(Index, Weapon) > 0 Then

    attackspeed = Item(GetPlayerEquipment(Index, Weapon)).speed - GetPlayerStat(Index,Agility)

Else

    attackspeed = 1000 - GetPlayerStat(Index,Agility)

End If

So that the graphics updates the attack speed too. This should also match the other formulas, and again is here at 1ms per agi.

Very nicely done Zeno. I’m impressed.

That is just amazing O:

Way to go the extra mile Zeno! Please mark the topic as “Solved” if your problem is solved Zhavier.

Oh, I forgot one. So, just for kicks, spells.

If you want player AGI to impact spell cooldown, it’s the same deal in another place.

Server-side under Sub CastSpell in modCombat, find```

If DidCast Then

 Call SetPlayerVital(index, Vitals.MP, GetPlayerVital(index, Vitals.MP) - MPCost)

 Call SendVital(index, Vitals.MP)

 ' send vitals to party if in one

 If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index

 TempPlayer(index).SpellCD(spellslot) = GetTickCount + (Spell(spellnum).CDTime * 1000)

 Call SendCooldown(index, spellslot)

 SendActionMsg mapnum, Trim$(Spell(spellnum).Name) & "!", BrightRed, ACTIONMSG_SCROLL, GetPlayerX(index) * 32, GetPlayerY(index) * 32

End If


replace with something like```

If DidCast Then

	 Call SetPlayerVital(index, Vitals.MP, GetPlayerVital(index, Vitals.MP) - MPCost)

	 Call SendVital(index, Vitals.MP)

	 ' send vitals to party if in one

	 If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index

	 TempPlayer(index).SpellCD(spellslot) = GetTickCount + ((Spell(spellnum).CDTime - GetPlayerStat(Index,Agility)) * 1000)

	 Call SendCooldown(index, spellslot)

	 SendActionMsg mapnum, Trim$(Spell(spellnum).Name) & "!", BrightRed, ACTIONMSG_SCROLL, GetPlayerX(index) * 32, GetPlayerY(index) * 32

End If

Here again “- GetPlayerStat(Index,Agility)” is inserted to lower the timer by 1 ms per agility point per second of cooldown. So a character with 25 agi casting a spell with a 5sec cooldown will see a 125ms reduction in the cooldown timer. A 100 AGI character casting a 1.5 second spell will see a 150ms reduction. A 150 AGI character casting a 3s spell will see a 450ms reduction. And so on.

Now client-side to allow them to send casts quicker, change


If PlayerSpells(spellSlot) > 0 Then

	 If GetTickCount > Player(MyIndex).AttackTimer + 1000 Then

		 If Player(MyIndex).Moving = 0 Then

			 Set buffer = New clsBuffer

			 buffer.WriteLong CCast

			 buffer.WriteLong spellSlot

			 SendData buffer.ToArray()

			 Set buffer = Nothing

			 SpellBuffer = spellSlot

			 SpellBufferTimer = GetTickCount

		 Else

			 Call AddText("Cannot cast while walking!", BrightRed)

		 End If

	 End If

Else

	 Call AddText("No spell here.", BrightRed)

End If

to something like```

If PlayerSpells(spellSlot) > 0 Then

 If GetTickCount > Player(MyIndex).AttackTimer + 1000 - GetPlayerStat(Index,Agility) Then

	 If Player(MyIndex).Moving = 0 Then

		 Set buffer = New clsBuffer

		 buffer.WriteLong CCast

		 buffer.WriteLong spellSlot

		 SendData buffer.ToArray()

		 Set buffer = Nothing

		 SpellBuffer = spellSlot

		 SpellBufferTimer = GetTickCount

	 Else

		 Call AddText("Cannot cast while walking!", BrightRed)

	 End If

 End If

Else

 Call AddText("No spell here.", BrightRed)

End If

Again at 1ms per agi. This is essentially the spell-side version of Sub CheckAttack(). If, for example, your spell cooldown is at 900ms (say with 100AGI) and you can only cast one spell a second, it's kind of pointless, so you need to change this too.

Any other cooldown-related timer (icon, permissions) should be handled by the variable SpellCD got in client-side Sub HandleCooldown, which you get from server-side Sub SendCooldown. I don't think you should change these.

If you want AGI to influence spell casting time… **server-side** under Sub ServerLoop in modServerLoop, change```

				 If TempPlayer(i).spellBuffer.Spell > 0 Then

					 If GetTickCount > TempPlayer(i).spellBuffer.Timer + (Spell(Player(i).Spell(TempPlayer(i).spellBuffer.Spell)).CastTime * 1000) Then

						 CastSpell i, TempPlayer(i).spellBuffer.Spell, TempPlayer(i).spellBuffer.target, TempPlayer(i).spellBuffer.tType

						 TempPlayer(i).spellBuffer.Spell = 0

						 TempPlayer(i).spellBuffer.Timer = 0

						 TempPlayer(i).spellBuffer.target = 0

						 TempPlayer(i).spellBuffer.tType = 0

					 End If

				 End If

to something like```

			 If TempPlayer(i).spellBuffer.Spell > 0 Then

				 If GetTickCount > TempPlayer(i).spellBuffer.Timer + ((Spell(Player(i).Spell(TempPlayer(i).spellBuffer.Spell)).CastTime - GetPlayerStat(i, Agility))* 1000) Then

					 CastSpell i, TempPlayer(i).spellBuffer.Spell, TempPlayer(i).spellBuffer.target, TempPlayer(i).spellBuffer.tType

					 TempPlayer(i).spellBuffer.Spell = 0

					 TempPlayer(i).spellBuffer.Timer = 0

					 TempPlayer(i).spellBuffer.target = 0

					 TempPlayer(i).spellBuffer.tType = 0

				 End If

			 End If

Then adjust the **client-side** timer under modGameLoop```

		 ' check if we need to unlock the player's spell casting restriction

		 If SpellBuffer > 0 Then

			 If SpellBufferTimer + (Spell(PlayerSpells(SpellBuffer)).CastTime * 1000) < tick Then

				 SpellBuffer = 0

				 SpellBufferTimer = 0

			 End If

		 End If

to something like


		 ' check if we need to unlock the player's spell casting restriction

		 If SpellBuffer > 0 Then

			 If SpellBufferTimer + ((Spell(PlayerSpells(SpellBuffer)).CastTime - GetPlayerStat(i, Agility)) * 1000) < tick Then

				 SpellBuffer = 0

				 SpellBufferTimer = 0

			 End If

		 End If

To adjust the graphics client-side, find this under modGraphics```

	 ' calculate the width to fill

	 barWidth = (GetTickCount - SpellBufferTimer) / ((Spell(PlayerSpells(SpellBuffer)).CastTime * 1000)) * sWidth
and replace with something like```

		 ' calculate the width to fill

		 barWidth = (GetTickCount - SpellBufferTimer) / (((Spell(PlayerSpells(SpellBuffer)).CastTime - GetPlayerStat(MyIndex,Agility)) * 1000)) * sWidth

That will adjust the spell-casting bar. The actual animations of spell casting are handled between server and client. Here again, previous variable changes should be enough and you should not edit the relevant subs in modHandleData, modClientTCP, or modServerTCP.

So there you have it! Experiment with the formula. Try to keep it balanced. Use the same formula for each type (one formula for all attacks; one formula for all spells). Have fun!

DISCLAIMER: Kindly note that I haven’t actually tested these codes. All I did was add in GetPlayerStat(#,Agility) with appropriate algebra. Also where that coding was done in a forum post and not in VB6, it’s possible that I made syntax errors such as a small typo or forgetting a bracket. It is also possible that I goofed up and used the wrong index (e.g. MyIndex where I needed Index, Index instead of I, etc.). I did try to be careful though, and while I’m pretty sure there’s no need to debug, I’m not 100% positive. At any rate, those mistakes should be an easy debug. Let me know if it works out. If there are any errors, post them and I will update my posts so others can benefit from working code.

All I can say is good work lol.

Good job i will test :D Thanks

Log in to reply