Bem fácil entender o que ocorre.
#Entendendo o Sistema:
O Sistema aplica a adição direta no RawStat (Atributo Cru) isso para não ter muito trabalho de edição, o que é digamos meio errado, mas não vamos por esse ponto.
A Cada segundo ele verifica se o jogador ainda tem a transformação, caso o tempo tenha acabado ele chama a Sub para Remover o Valor dado no RawStat do Player.
#O que acontece?
Acontece que o jogo salva as contas a cada X segundos, ele acaba salvando o Player 1/2/3.... como tendo o Atributo RawStat Acima do Normal.. no caso RawStat Verdadeiro + Transformação.
Quando você taca o foda-se e fecha o Servidor no X [ Fechar ], ele interrompe todos os Sockets e fim.
Logo não ocorre a verificação de que ocorre normalmente de segundo a Segundo, que verifica o tempo da transformação do Player, e normalmente retiraria o Valor da Transformação do rawStat, fazendo o player ficar normal.
O Player Ficou salvo como tendo um RawStat + Transformação, e não ouve a Interrupção Natural do sistema que o deixaria com os Stats Normal e Naturais.
#Como resolvo isso minha donzela perfeita?
Ah, infinitas formas amoreco;
A forma mais fácil e bruta seria essa aqui:
No Servidor / ModTypes -> Procure por : "PlayerRec"
Dentro dele, no final, adicione:
- Código:
Dim inTrans as Byte 'Se conter valor então o player está transformado
Dim inTransNum as Long 'Armazena o valor da Transformação
Sim, vamos trabalhar com byte ou long, mesmo sendo uma Boolean, Byte e Long são mais estáveis.
Colocando isso ali, vamos procurar por:
- Código:
Sub JoinGame(ByVal Index As Long)
Essa Sub recebe os valores do player e faz a load dele, e coloca ele parcialmente em jogo.
É ela que a gente quer, e ela que vamos trabalhar.
Em qualquer lugar dela, que não seja no começo, mas de preferencia do Meio para o Fim,
ou depois disso aqui:
- Código:
' Send the flag so they know they can start doing stuff
SendInGame Index
Adicione isso aqui:
- Código:
'Verificar se o Player ainda está transformado
If Player(Index).inTrans > 0 then 'Verifica se realmente tem valor de trans
if Player(Index).inTransNum > 0 then 'Verifica se a Trans é um valor de Spell Real
'Se chegou aqui é porque ta transformado e temos armazenada qual é a transformacao.
Call AcabarTrans_InJoinGame(Index)
end if
end if
Em seu ModPlayer, no final dele, cole essa sub que está abaixo.
- Código:
Public Sub AcabarTrans_inJoinGame(ByVal index As Long)
Dim TransNum as Long
If index < 1 Or index > MAX_PLAYERS Then Exit Sub
'Já verificamos mas vamos verificar novamente porque somos assim, blindão pra não deixar nada quebrar o joguinho <3
If Player(Index).inTrans > 0 then 'Verifica se realmente tem valor de trans
if Player(Index).inTransNum > 0 then 'Verifica se a Trans é um valor de Spell Real
TransNum = Player(index).inTransNum 'facilitando e ocupando menos espaço
Call SetPlayerStat(index, Stats.Strength, GetPlayerRawStat(index, Stats.Strength) - Spell(TransNum).Força)
Call SetPlayerStat(index, Stats.Endurance, GetPlayerRawStat(index, Stats.Endurance) - Spell(TransNum).Defesa)
Call SetPlayerStat(index, Stats.Agility, GetPlayerRawStat(index, Stats.Agility) - Spell(TransNum).Agilidade)
Call SetPlayerStat(index, Stats.Willpower, GetPlayerRawStat(index, Stats.Willpower) - Spell(TransNum).Willpower)
Call SetPlayerStat(index, Stats.Intelligence, GetPlayerRawStat(index, Stats.Intelligence) - Spell(TransNum).Inteligencia)
SendAnimation GetPlayerMap(index), Spell(index).Anima, 0, 0, TARGET_TYPE_PLAYER, index
Call PlayerMsg(index, "Ao voltar a este mundo, você sente que seu poder retorna ao normal...", DarkGrey)
TempPlayer(index).Trans = 0
Player(Index).IntransNum = 0 'Limpa os valores
Player(Index).Intrans = 0
SendPlayerData index
SavePlayer index
SendStats index
End if
End if
End Sub
Agora, vamos ao seu Sub CastSpell, nele você deve ter adicionado os valores da transformação; Na sub CastSpell procure por :
- Código:
'Transformaçao
With Spell(SpellNum)
If .Type = SPELL_TYPE_TRANS Then
Call SetPlayerSprite(index, Spell(index).Trans)
Isso ai, nessa área onde criou isso ai ;c você abaixo dessa call adicione:
- Código:
'Modificação de Proteção
Player(Index).Intrans = 1 'torna real a transformação para proteção ao logar
Player(Index).IntransNum = SpellNum 'armazena qual foi a transformação que gerou atributos
Dessa forma tem defesa agora.
# O que foi feito?
O Sistema estava criado com o intuito de você sempre fechar o servidor depois que todos os players possíveis estiverem deslogados e que não ocorra nenhuma falha possivel que faça o servidor cair, ou você fechar.
Isso é devido a ingenuidade do criador.
Você sem um conversor de contas terá de apagar todas as contas para que essa modificação funcione perfeitamente, isso levando em consideração que suas contas sejam salvas de da forma de Compress File, onde fica .dat ou .bin o arquivo, vulgo Lowload
Eu notei uma falha maior no sistema ;c em 1 regiãozinha, apenas de ler ele, mas se você diz que ele funciona e transforma perfeito, verifica se quando o tempo da transformação acabar, ele retira os Stats com Perfeição, na minha leitura de run mental, eu diria que não ;c
A Minha Deusa, linda, benevolente e perfeita, funcionou sim, retira os stats com perfeição. Certo agora faça o teste criando uma Spell lá pelo ID 30 ~ 40 ~, ou qualque rnumero que não seja os primeiros.
Ai você ve se vai funcionar ou não, qualquer coisa me informe. Que analisamos < 3
Bjus de Luz Escura.
Com amor, sua mais linda fadinha.