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.