#!/usr/bin/python MAXTRANS = 5000 SV_INITS2C = 0 SV_MAPCHANGE = 11 SV_ITEMLIST = 21 PROTOCOL_VERSION = 249 DMF = 16 import enet import weakref connections = {} ents = {} peers = {} class player: hp = 100 peer = enet.ENetPeer() def getStr(d, i): s = unicode("") while(d[i] != 0): s = s + unichr(d[i]) i = i+1; return s; def handleInput(player, packet): i = 0; d = enet.IntVector(enet.parsepacket(packet)) end = len(d) - 1 while(i <= end): # SV_POS if d[i] == 2: d[i+2], d[i+3], d[i+4] if(d[i+12]&0x10 == 0): print "-- got short pos" i = i + 13 else: print "-- got long" i = i + 38 #raise SystemExit elif d[i] == 1: print "-- got info" i = i + 1 name = getStr(d, i) i = i + len(name) + 1 team = getStr(d, i) i = i + len(team) + 1 i = i + 6 elif d[i] == 3: text = getStr(d, i+1) i = i + len(text) + 2 print "TEXT FROM PLAYER" print text elif d[i] == 14: print "-- got ping" # client ping i = i + 1 else: print "Unknown packet type %d." % d[i] x = enet.msgsize(d[i]) * 2 if(x > 0 & d[i] != 0): print "Recovered, skipping %d bytes" % x i = i + x else: print "Non-fixed packet size, thus non-recoverable." print d[i] print d[i+1] print d[i+2] print "----" for a in d: print a raise SystemExit def sendwelcome(peer): n = 1 #packet = enet.mint_packet(1, "iiiiisiii", SV_INITS2C, n, PROTOCOL_VERSION, 1, SV_MAPCHANGE, "TEStmAP", 1, SV_ITEMLIST,-1); packet = enet.mint_welcomePacket(n) enet.enet_peer_send(peer, 0, packet); if(packet.referenceCount==0): enet.enet_packet_destroy(packet); packet = enet.mint_mapChangePacket("login_room") enet.enet_peer_send(peer, 0, packet); if(packet.referenceCount==0): enet.enet_packet_destroy(packet); packet = enet.mint_itemList(); enet.enet_peer_send(peer, 0, packet); if(packet.referenceCount==0): enet.enet_packet_destroy(packet); if(enet.enet_initialize()<0): print("Unable to initialise network module"); serverAddress = enet.ENetAddress() serverAddress.host = 0 #ENET_HOST_ANY serverAddress.port = 28785 #SAUERBRATEN_SERVER_PORT server = enet.enet_host_create(serverAddress, 32, 0, 0) event = enet.ENetEvent() while(1): enet.enet_host_service(server, event, 1000) if event.type == 1: print "Connect" # instantiate i to first free integer entry in dictionary i = 0; for j in range(0, len(ents)+1): if(not ents.has_key(j)): i = j break # add to the list of ents new_player = player() new_player.peer = event.peer new_player.entnum = i ents[i] = new_player connections[event.peer.incomingPeerID] = new_player sendwelcome(event.peer) elif event.type == 2: print "Disconnect" del ents[connections[event.peer.incomingPeerID].entnum] del connections[event.peer.incomingPeerID] enet.enet_peer_disconnect(event.peer, 0); elif event.type == 3: handleInput(ents[connections[event.peer.incomingPeerID].entnum], event.packet) #packet = enet.mint_message("Hello There") #peer = ents[connections[event.peer.incomingPeerID].entnum].peer #enet.enet_peer_send(peer, 0, packet); elif event.type == 10: #ignore map change break; enet.enet_deinitialize() # serverhost = enet_host_create(&address, MAXCLIENTS, 0, uprate); # if(!serverhost) fatal("could not create server host\n"); # for(int i = 0; i < MAXCLIENTS; i++) serverhost->peers[i].data = (void *)-1; # address.port = SAUERBRATEN_SERVINFO_PORT; # pongsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM, &address); # if(pongsock == ENET_SOCKET_NULL) fatal("could not create server info socket\n"); # atexit(cleanupserver); # atexit(enet_deinitialize);