Albus70007

Untitled

Jan 8th, 2020
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import net, json, strutils, sequtils, sugar, PlayerInput
  2.  
  3.  
  4. type Bot* = object
  5.     name*: string
  6.     rootsocket*: Socket
  7.     inputs*: PlayerInputs
  8.  
  9. type PlayerInputs* = object
  10.     steer*: float
  11.     throttle*: float
  12.     roll*: float
  13.     pitch*: float
  14.     yaw*: float
  15.     jump*: bool
  16.     boost*: bool
  17.     use_item*: bool
  18.     chat*: int
  19.  
  20.  
  21. proc tojson(inputs: PlayerInputs): JsonNode =
  22.     ## Quick wrapper around the generic JObject constructor.
  23.     result = %[
  24.     ("steer", %inputs.steer),
  25.     ("throttle", %inputs.throttle),
  26.     ("roll", %inputs.roll),
  27.     ("pitch", %inputs.pitch),
  28.     ("yaw", %inputs.yaw),
  29.     ("jump", %inputs.jump),
  30.     ("boost", %inputs.boost),
  31.     ("use_item", %inputs.use_item),
  32.     ("chat", %inputs.chat)
  33.     ]
  34.     return result
  35.  
  36.  
  37. proc unrollBytes(n : uint16) : string =
  38.     let shifts : seq[uint16] = @[0'u16, 8'u16]
  39.     # shift each byte right by a certain amount and mask off the least-significant byte
  40.     map(shifts, shift => $char((n shr shift) and 0x000000ff)).join
  41.    
  42.    
  43. proc rollBytes(bs : string) : uint16 =
  44.     let shifts : seq[uint16] = @[0'u16, 8'u16]
  45.     var n : uint16
  46.     for pair in zip(shifts, bs):
  47.         n = n or pair.b.uint16 shl pair.a
  48.     return n
  49.  
  50. proc try_connect(bot: Bot, add: string = "localhost", port: Port) =
  51.     bot.rootsocket.connect(add, port)
  52.     echo("Bot: ", bot.name, " connected to server on address: localhost, on port: ", port)
  53.  
  54. proc get_inputs(inputs: var PlayerInputs, game_info: JsonNode) =
  55.     var
  56.         steer: float = 0.0
  57.         throttle: float = 0.0
  58.         roll: float = 0.0
  59.         pitch: float = 0.0
  60.         yaw: float = 0.0
  61.         jump: bool = false
  62.         boost: bool = false
  63.         use_item: bool = false
  64.         chat: int = 0
  65.  
  66.     inputs = PlayerInputs(steer: steer,
  67.                     throttle: throttle,
  68.                     roll: roll,
  69.                     pitch: pitch,
  70.                     yaw: yaw,
  71.                     jump: jump,
  72.                     boost: boost,
  73.                     use_item: use_item,
  74.                     chat: chat)
  75.  
  76. proc recievePacket(bot: Bot): JsonNode =
  77.     var recieved: string = bot.rootsocket.recv(1024)
  78.     echo(recieved)#, "     |     ", recieved[2..^1], "     |     ", rollBytes(recieved[2..^2]), "     |     ", recieved.toHex()[2..3], recieved.toHex()[0..1])
  79.     #var full_length: int = len("""[{"type":"Game","frame":0,"score":[0,0],"ball":{"position":[0.0,0.0,0.0],"velocity":[0.0,0.0,0.0],"euler_angles":[0.0,0.0,0.0],"angular_velocity":[0.0,0.0,0.0],"damage":0.0,"shape":0,"radius":-1.0,"height":-1.0},"cars":[{"position":[0.0,0.0,0.0],"velocity":[0.0,0.0,0.0],"euler_angles":[0.0,0.0,0.0],"angular_velocity":[0.0,0.0,0.0],"boost":0.0,"on_ground":true,"jumped":false,"double_jumped":false,"demolished":false,"is_bot":true,"team":-1,"name":"","body_type":0,"hitbox_offset":[0.0,0.0,0.0],"hitbox_dimensions":[0.0,0.0,0.0]},{"position":[0.0,0.0,0.0],"velocity":[0.0,0.0,0.0],"euler_angles":[0.0,0.0,0.0],"angular_velocity":[0.0,0.0,0.0],"boost":0.0,"on_ground":true,"jumped":false,"double_jumped":false,"demolished":false,"is_bot":true,"team":-1,"name":"","body_type":0,"hitbox_offset":[0.0,0.0,0.0],"hitbox_dimensions":[0.0,0.0,0.0]}],"goals":[],"pads":[],"time_left":0.0,"time_elapsed":0.0,"is_overtime":true,"is_round_active":true,"is_kickoff_paused":false,"is_match_ended":false,"is_unlimited_time":false,"gravity":0.0,"map":0,"mode":0}]""")
  80.     let header: uint16 = rollBytes(recieved[0..2])
  81.     recieved = recieved[2..^1]
  82.     #echo(header, ", ", len(recieved).uint16)
  83.     #echo("reciving data...  data recieved so far: ", len(recieved), "  data to recieve: ", header, " collecting: ", header.int - len(recieved) - 4, " bytes")
  84.     recieved.add(bot.rootsocket.recv(header.int - len(recieved)))#((header2.parseHexInt() - len(recieved)) - 1))
  85.  
  86.     let packet: JsonNode = json.parseJson("{\"Game\":" & recieved & "}")
  87.     #echo("data recieved: ")
  88.     #echo(packet)
  89.     return packet
  90.  
  91.  
  92. var Mybot: Bot = Bot(name: "Nimbot")
  93. var port: Port = Port(8085)
  94. Mybot.rootsocket = newSocket(AF_INET, SOCK_STREAM)
  95. MyBot.inputs = PlayerInputs(steer: 0.0,
  96.                             throttle: 0.0,
  97.                             roll: 0.0,
  98.                             pitch: 0.0,
  99.                             yaw: 0.0,
  100.                             jump: false,
  101.                             boost: false,
  102.                             use_item: false,
  103.                             chat: 0)
  104.  
  105.  
  106. proc send_inputs(bot: Bot, game_info: JsonNode) =
  107.     var inputs = bot.inputs
  108.     inputs.get_inputs(game_info)
  109.     let strinputs: string = $tojson(inputs)
  110.     let header: string = (strinputs.len + 2).uint16.unrollBytes
  111.     let buffer: string = header & strinputs
  112.     echo(buffer, "    |    ", len(strinputs), "    |    ", header, "    |    ")
  113.     bot.rootsocket.send(buffer)
  114.  
  115. proc recieve_and_respond(bot: Bot) =
  116.     let game_info: JsonNode = recievePacket(bot)
  117.     #echo(game_info)
  118.     if game_info["Game"][0]["is_match_ended"].getBool() == true:
  119.         raise newException(Exception, "Match Eneded")
  120.     else:
  121.         bot.send_inputs(game_info)
  122.  
  123.  
  124. Mybot.try_connect(port = port)
  125. var i: int = 0
  126. while true:
  127.     echo(i)
  128.     Mybot.recieve_and_respond()
  129.     inc(i)
Add Comment
Please, Sign In to add comment