| Introdução |
Apesar da minha explicação sobre a DB do jogo ser enviada para o servidor, muitos que verificaram o código ficaram em dúvida sobre o forma como ela é enviada, é uma questão interessante, e por isso esse tópico está surgindo.
| Vamos lá! |
/t1271-programacao-udp-e-tcp-sobre-sockets-de-berkeley
Basicamente, em uma conexão, nunca podemos assumir que TODOS os dados vão chegar inteiros quando se envia uma informação, existem vários fatores internos e externos que sempre irão gerar a chance de informação fragmentada.
O melhor exemplo é sem dúvidas o mapa.
O mapa é relativamente grande, e envia-lo de uma vez ao servidor fazia com que ele recebesse informações fragmentadas sobre o mapa e não conseguisse realizar o trabalho de salvar corretamente.
Pensando nisso, a solução para o envio de mapas foi simples, eu simplesmente dividi o envio do mapa em 4 pacotes, como podemos ver aqui:
- Código:
def self.formatpart(part)
@cache ||= self.scan_map
str = String_Builder.new
if part == 1
startx = 0
startxend = 4
starty = 0
startyend = 14
end
if part == 2
startx = 5
startxend = 9
starty = 0
startyend = 14
end
if part == 3
startx = 10
startxend = 14
starty = 0
startyend = 14
end
if part == 4
startx = 15
startxend = 19
starty = 0
startyend = 14
end
str.write(part)
str.write(startx)
str.write(startxend)
str.write(starty)
str.write(startyend)
str.write($game_map.display_name)
for x in startx..startxend
for y in starty..startyend
str.write(@cache[x][y][:event])
str.write(@cache[x][y][:data1])
str.write(@cache[x][y][:data2])
str.write(@cache[x][y][:data3])
str.write(@cache[x][y][:data4])
str.write($game_map.passable?(x, y, 2))
str.write($game_map.passable?(x, y, 4))
str.write($game_map.passable?(x, y, 6))
str.write($game_map.passable?(x, y, 8))
end
end
@cache = nil
return str.to_s
end
Note que essa função recebe a parte do mapa pedida, e envia. Como ela não é automatizada, ela tem um simples padrão de enviar apenas mapas no limite de 19x14. (tamanho padrão do Wing)
Essa divisão não apenas acontece com os mapas, vamos ver outro exemplo.
- Código:
def self.format50(start)
str = String_Builder.new
startend = start + 50
startend = $data_enemies.size - 1 if startend > $data_enemies.size - 1
str.write(start)
str.write(startend)
for i in start..startend
p i
str.write($data_enemies[i].name)
str.write($data_enemies[i].battler_hue)
str.write($data_enemies[i].exp)
str.write($data_enemies[i].gold)
str.write($data_enemies[i].note)
str.write($data_enemies[i].params.size - 1)
for i2 in 0..$data_enemies[i].params.size - 1
str.write($data_enemies[i].params[i2])
end
str.write($data_enemies[i].drop_items.size - 1)
for i2 in 0..$data_enemies[i].drop_items.size - 1
str.write($data_enemies[i].drop_items[i2].kind)
str.write($data_enemies[i].drop_items[i2].data_id)
str.write($data_enemies[i].drop_items[i2].denominator)
print $data_enemies[i].drop_items[i2].kind
end
end
return str.to_s
end
Esse é o envio de monstros, como são 1000 monstros enviados, eu também precisei dividir em vários lotes de 50 monstros. Assim, ele envia de 50 em 50 até chegar no 1000.
| Conclusão |




Portal










