Cześć, napisałem prostą grę online w pygame i socket w lan wszystko śmiga elegancko, ale jak już wypuszczam serwer na zewnątrz za pomocą port forwarding (hostuje serwer na moim komputerze), to jest gigantyczny ping ma ktoś pomysły, od czego może być to zależne z góry dzięki.
class SendData:
def send(self, client, data):
encoded_data = pickle.dumps(data)
client.send(encoded_data)
class RecvData:
def __init__(self):
self.last_data = None
def recv(self, client):
try:
data = client.recv(4096 * 24)
decoded_data = pickle.loads(data)
print(decoded_data)
if decoded_data is not None:
self.last_data = decoded_data
return decoded_data
except Exception as e:
print(self.last_data)
return self.last_data
Client skrypt:
def main(server_ip, port=5050):
connection = ConnectionToGame(server_ip, port)
senddata = SendData()
recvdata = RecvData()
player = Player()
player_hand = PlayerHand()
inventory = Inventory(player)
bars = Bars(player)
ui = UI()
attack = Atack(inventory, player, player_hand)
draw_players = DrawPlayers(player)
draw_hands = DrawHands(inventory.items_images, player)
handle_drop_items = HandleDropItems(inventory.items_images, player)
draw_bullets = DrawBullets(player)
draw_npces = DrawNpces(player)
get_damage = GetDamage()
draw_damage_hits = DrawDamageHits()
draw_hit_animation = DrawHitAnimation(draw_npces.npces_image, player)
draw_particles = DrawParticles(player)
screen_shake = ScreenShake()
timetext_list = []
recived_get_damage = []
recived_draw_damage_hits = []
client = connection.client
connection.connect()
uuid = get_client_information()["uuid"]
nick = get_client_information()["nick"]
offset = repeat((0, 0))
while True:
events = pygame.event.get()
keys = pygame.key.get_pressed()
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
if keys[pygame.K_c]:
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.type == pygame.KEYDOWN:
if keys[pygame.K_e]:
inventory.open = not inventory.open
if connection.Connection_complete:
player_data = {
"client_information": [uuid, nick],
"player_possition": [player.x, player.y, draw_players.center_player_image[0],
draw_players.center_player_image[1]],
"player_direction": player.direction,
"player_move_animation": player.animation_frame,
"player_hand": [player_hand.hand_x - draw_players.center_player_image[0],
player_hand.hand_y - draw_players.center_player_image[1], player_hand.hand_item_angle,
player_hand.hand_item_image_filp, inventory.atack_slot],
"drop_item": inventory.drop_item,
"attack": attack_,
"take_item": handle_drop_items.take_item,
"recived_get_damage": recived_get_damage,
"recived_draw_damage_hits": recived_draw_damage_hits
}
inventory.drop_item = None
handle_drop_items.take_item = None
senddata.send(client, player_data)
recived_get_damage = []
recived_draw_damage_hits = []
received_data = recvdata.recv(client)
server_data = received_data["server"]
players_data = received_data["players"]
pygame.display.update()
else:
connection.connect()
Serwer skrpyt:
def main(client, address, connection):
senddata = SendData()
recvdata = RecvData()
serverinformation = ServerInformation()
handleplayer = HandlePlayer()
handledropitem = HandleDropItem()
handle_particles = HandlePartilces()
handledistanceitems = HandleDistanceItems(handle_particles)
print(f"{get_time()} New connection to {address}")
connection.append(client)
first_iteration = True
time_to_add_move_particle = 0
#try:
while True:
sleep(1 / tickrate)
client_response = recvdata.recv(client)
uuid = client_response["client_information"][0]
nick = client_response["client_information"][1]
x, y = client_response["player_possition"][0], client_response["player_possition"][1]
direction = client_response["player_direction"]
move_animation = client_response["player_move_animation"]
hand_x, hand_y, hand_item_angle, hand_item_image_filp, hand_item = client_response["player_hand"][0], client_response["player_hand"][1], client_response["player_hand"][2], client_response["player_hand"][3], client_response["player_hand"][4]
drop_item = client_response["drop_item"]
attack = client_response["attack"]
take_item = client_response["take_item"]
recived_get_damage = client_response["recived_get_damage"]
recived_draw_damage_hits = client_response["recived_draw_damage_hits"]
if first_iteration:
handleplayer.add_to_players_list(uuid, client_response)
first_iteration = False
handleplayer.update_player_data(uuid, client_response)
if attack != None:
move_y = 0
if not "bow" in attack["Attack Item"]:
move_y = 48
handledistanceitems.atack(["Player", uuid], {"item": attack["Attack Item"], "damage": attack["Attack Damage"], "bullet direction": attack["Bullet Direction"]}, hand_x + x, hand_y + y - move_y, hand_x + x, hand_y + y - move_y)
handledropitem.add_drop_item(drop_item, x, y)
handledropitem.remove_drop_item(take_item)
ready_message = serverinformation.prepare_message()
handleplayer.remove_player_from_get_damages_list(uuid, recived_get_damage)
handleplayer.remove_player_from_draw_damage_hits_list(uuid, recived_draw_damage_hits)
handleplayer.move_particles(uuid, time_to_add_move_particle, handle_particles)
if move_animation[0] == "move":
time_to_add_move_particle += 1
if time_to_add_move_particle > 30:
time_to_add_move_particle = 0
senddata.send(client, ready_message)
Są to tylko urywki kody sam kod jest bardzo długi wiec wyrzuciłem niepotrzebne rzeczy.