por Kotol Qui Abr 25, 2024 1:22 pm
gabrielcpv escreveu:Alguém teria como me ajudar a criar um item que proteja o player de perder seus itens quando morre? Quero que seja um ring, que só funcione se estiver equipado e que seja destruído quando morrer, protegendo apenas o drop de item, a exp perdida continuará, porque quero criar um colar na qual proteja a perda de exp quando morrer também... Tenho um conhecimento sucinto de vb6 e estou iniciando, então se alguém puder me ajudar com um norte eu talvez consiga terminar/adaptar.
Obrigado!
Abra seu SERVER~SIDE e procure por esta "Sub OnDeath" e mude ela disto:
- Spoiler:
' ToDo
Sub OnDeath(ByVal index As Long)
Dim i As Long
' Set HP to nothing
Call SetPlayerVital(index, Vitals.HP, 0)
' Drop all worn items
For i = 1 To Equipment.Equipment_Count - 1
If GetPlayerEquipment(index, i) > 0 Then
PlayerMapDropItem index, GetPlayerEquipment(index, i), 0
End If
Next
' Warp player away
Call SetPlayerDir(index, DIR_DOWN)
With Map(GetPlayerMap(index))
' to the bootmap if it is set
If .BootMap > 0 Then
PlayerWarp index, .BootMap, .BootX, .BootY
Else
Call PlayerWarp(index, START_MAP, START_X, START_Y)
End If
End With
' clear all DoTs and HoTs
For i = 1 To MAX_DOTS
With TempPlayer(index).DoT(i)
.Used = False
.Spell = 0
.Timer = 0
.Caster = 0
.StartTime = 0
End With
With TempPlayer(index).HoT(i)
.Used = False
.Spell = 0
.Timer = 0
.Caster = 0
.StartTime = 0
End With
Next
' Clear spell casting
TempPlayer(index).spellBuffer.Spell = 0
TempPlayer(index).spellBuffer.Timer = 0
TempPlayer(index).spellBuffer.target = 0
TempPlayer(index).spellBuffer.tType = 0
Call SendClearSpellBuffer(index)
' Restore vitals
Call SetPlayerVital(index, Vitals.HP, GetPlayerMaxVital(index, Vitals.HP))
Call SetPlayerVital(index, Vitals.MP, GetPlayerMaxVital(index, Vitals.MP))
Call SendVital(index, Vitals.HP)
Call SendVital(index, Vitals.MP)
' send vitals to party if in one
If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index
' If the player the attacker killed was a pk then take it away
If GetPlayerPK(index) = YES Then
Call SetPlayerPK(index, NO)
Call SendPlayerData(index)
End If
End Sub
Para isto:
- Spoiler:
' ToDo
Sub OnDeath(ByVal index As Long)
Dim i As Long
' Checa se o Jogador tem o item de prevenção de morte
If GetPlayerEquipment(index, Shield) > 0 Then
If GetPlayerEquipment(index, Shield) = 2 Then
PlayerMsg index, "Você foi revivido ao custo de sua relíquia de ressurreição!", White
'Remove o equipamento
Call SetPlayerEquipment(index, 0, Shield)
Call SendWornEquipment(index)
Call SendMapEquipment(index)
Call SendStats(index)
'Cura
For i = 1 To Vitals.Vital_Count - 1
Call SetPlayerVital(index, i, GetPlayerMaxVital(index, i))
Call SendVital(index, i)
Next
'Animação
Call SendAnimation(GetPlayerMap(index), 1, GetPlayerX(index), GetPlayerY(index))
Exit Sub
End If
End If
' Set HP to nothing
Call SetPlayerVital(index, Vitals.HP, 0)
' Drop all worn items
For i = 1 To Equipment.Equipment_Count - 1
If GetPlayerEquipment(index, i) > 0 Then
PlayerMapDropItem index, GetPlayerEquipment(index, i), 0
End If
Next
' Warp player away
Call SetPlayerDir(index, DIR_DOWN)
With Map(GetPlayerMap(index))
' to the bootmap if it is set
If .BootMap > 0 Then
PlayerWarp index, .BootMap, .BootX, .BootY
Else
Call PlayerWarp(index, START_MAP, START_X, START_Y)
End If
End With
' clear all DoTs and HoTs
For i = 1 To MAX_DOTS
With TempPlayer(index).DoT(i)
.Used = False
.Spell = 0
.Timer = 0
.Caster = 0
.StartTime = 0
End With
With TempPlayer(index).HoT(i)
.Used = False
.Spell = 0
.Timer = 0
.Caster = 0
.StartTime = 0
End With
Next
' Clear spell casting
TempPlayer(index).spellBuffer.Spell = 0
TempPlayer(index).spellBuffer.Timer = 0
TempPlayer(index).spellBuffer.target = 0
TempPlayer(index).spellBuffer.tType = 0
Call SendClearSpellBuffer(index)
' Restore vitals
Call SetPlayerVital(index, Vitals.HP, GetPlayerMaxVital(index, Vitals.HP))
Call SetPlayerVital(index, Vitals.MP, GetPlayerMaxVital(index, Vitals.MP))
Call SendVital(index, Vitals.HP)
Call SendVital(index, Vitals.MP)
' send vitals to party if in one
If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index
' If the player the attacker killed was a pk then take it away
If GetPlayerPK(index) = YES Then
Call SetPlayerPK(index, NO)
Call SendPlayerData(index)
End If
End Sub
E pronto!
Esse tutorial funciona desde o E.O 2.0, na engine zerada base.
Caso queira mudar algo, dê enfase nessa parte do código:
- Spoiler:
' Checa se o Jogador tem o item de prevenção de morte
If GetPlayerEquipment(index, Shield) > 0 Then
If GetPlayerEquipment(index, Shield) = 2 Then
PlayerMsg index, "Você foi revivido ao custo de sua relíquia de ressurreição!", White
'Remove o equipamento
Call SetPlayerEquipment(index, 0, Shield)
Call SendWornEquipment(index)
Call SendMapEquipment(index)
Call SendStats(index)
'Cura
For i = 1 To Vitals.Vital_Count - 1
Call SetPlayerVital(index, i, GetPlayerMaxVital(index, i))
Call SendVital(index, i)
Next
'Animação
Call SendAnimation(GetPlayerMap(index), 1, GetPlayerX(index), GetPlayerY(index))
Exit Sub
End If
End If
Ele está checando se existe um escudo equipado:
- Código:
If GetPlayerEquipment(index, Shield) > 0 Then
E se o número do escudo é o item número "02":
- Código:
If GetPlayerEquipment(index, Shield) = 2 Then
Ou seja, pode estar equipado com o escudo de numero 1 ou 3 que não funciona, somente o escudo do editor 2. (Tem outras formas de você fazer mais dinâmico adicionando no editor, mas o tutorial ficar mais extenso e completinho)
E lembra de tirar o escudo e atualizar o jogador e os outros jogadores (caso seu escudo tenha uma skin):
- Código:
'Remove o equipamento
Call SetPlayerEquipment(index, 0, Shield)
Call SendWornEquipment(index)
Call SendMapEquipment(index)
Call SendStats(index)
No mais, sucesso!!