Server.gd 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. extends Node
  2. var net = NetworkedMultiplayerENet.new()
  3. var api = MultiplayerAPI.new()
  4. var port = 8081
  5. var maxplayer = 4
  6. export(NodePath) var database
  7. func _ready():
  8. print('listening to port: ' + str(port))
  9. net.create_server(port, maxplayer)
  10. self.set_custom_multiplayer(api)
  11. custom_multiplayer.set_root_node(self)
  12. custom_multiplayer.set_network_peer(net)
  13. net.connect("peer_disconnected",self,"disc")
  14. net.connect("peer_connected",self,"conn")
  15. get_parent().get_node('Levelselect').loadlevel(level_to_load, true)
  16. pass # Replace with function body.
  17. func _process(_delta):
  18. custom_multiplayer.poll()
  19. var playerphsyics = preload('res://playerphysics.tscn')
  20. func conn(id):
  21. print('client connected, id: ' + str(id))
  22. yield(get_tree(),"physics_frame")
  23. rpc_id(0,'ping')
  24. rpc_id(0,'tokerequest')
  25. export var db_validation = true
  26. remote func tokenreply(token, username):
  27. var db = get_parent().get_node('PostgreSQL')
  28. var data = db.Read('validtokens_database','username',"'"+str(username)+"'")
  29. var message = 'token validated'
  30. if db_validation:
  31. if data == [] or data == null:
  32. message = "no token found"
  33. return
  34. if data[0][2] != token:
  35. message = "token is invalid"
  36. print('check tokens....')
  37. print(token)
  38. print(data)
  39. print(message)
  40. if username == null or username == "":
  41. username = 'player ' + str(api.get_rpc_sender_id()) + ' '
  42. if message == 'token validated':
  43. if game_status == 'await':
  44. player_spawn_queue[api.get_rpc_sender_id()] = {'id' : str(api.get_rpc_sender_id()), 'username':username, 'can_spawn':true}
  45. user_state_dict[str(username)] = ' ...await'
  46. usernames_dict[api.get_rpc_sender_id()] = str(username)
  47. rpc_id(0,'on_player_state_data',user_state_dict)
  48. rpc_id(api.get_rpc_sender_id(),'on_queue_spawn')
  49. rpc_id(api.get_rpc_sender_id(),'on_token_confirmed')
  50. remote func spawn_request():
  51. if player_spawn_queue.has(api.get_rpc_sender_id()):
  52. if player_spawn_queue[api.get_rpc_sender_id()].can_spawn:
  53. user_state_dict[usernames_dict[api.get_rpc_sender_id()]] = ' ready'
  54. rpc_id(0,'on_player_state_data',user_state_dict)
  55. if not user_state_dict.values().has(' ...await'):
  56. for x in player_spawn_queue.keys():
  57. player_spawn(player_spawn_queue[x],x)
  58. rpc_id(x,'on_spawn_request_reply')
  59. player_spawn_queue.erase(x)
  60. game_status = 'game_started'
  61. func player_spawn(arg, arg2):
  62. var id = arg.id
  63. var username = arg.username
  64. print('clients connected: ' + str(custom_multiplayer.get_network_connected_peers().size()))
  65. var instance = playerphsyics.instance()
  66. instance.name = id
  67. $players.add_child(instance)
  68. send_list_of_usernames(arg2, username)
  69. rpc_id(arg2,'loadlevel',level_to_load)
  70. var level_to_load = 'tankarena'
  71. var player_spawn_queue = {}
  72. func send_list_of_usernames(user, username):
  73. rpc_id(user,'_on_usernames', usernames_dict)
  74. rpc_id(0,'_on_usernames', { user : username } )
  75. var messages_array = []
  76. var messages_array_2 = []
  77. var usernames_dict = {}
  78. var user_state_dict = {}
  79. var game_status = 'await'
  80. remote func chat_messages(message):
  81. if $players.has_node(str(api.get_rpc_sender_id())):
  82. var buff = usernames_dict[api.get_rpc_sender_id()] + ': ' + str(message)
  83. messages_array.append( buff )
  84. rpc_id(0,'_On_chat_Message', str(message), api.get_rpc_sender_id())
  85. remote func connected_peer():
  86. print('syncing clients')
  87. rpc_id(0,'_On_Peer_Connected')
  88. func makedummmy():
  89. var node = api.get_rpc_sender_id()
  90. $players.get_node(str(node)).add_to_group('dummy')
  91. remote func send_clients():
  92. rpc_id(api.get_rpc_sender_id(), 'client_data', custom_multiplayer.get_network_connected_peers())
  93. # extra
  94. func disc(arg):
  95. print('client disconnected, id: ' + str(arg))
  96. rpc_id(0,'_On_Player_Disconnect',arg)
  97. remote func latency(arg):
  98. rpc_id(api.get_rpc_sender_id(), 'returnping', arg)
  99. remote func input_handler(arg,arg2):
  100. var id = api.get_rpc_sender_id()
  101. if $players.has_node(str(id)):
  102. $players.get_node(str(id)).input = arg
  103. $players.get_node(str(id)).input2 = arg2
  104. var tick = 0
  105. export var tickrate = 3
  106. func _physics_process(delta):
  107. var position_datachunk = {}
  108. for i in $players.get_children():
  109. position_datachunk[i.name] = i.global_position
  110. rpc_unreliable_id(0, 'player_position', position_datachunk)
  111. var animation_datachunk = {}
  112. for i in $players.get_children():
  113. animation_datachunk[i.name] = i.animation
  114. rpc_unreliable_id(0, 'player_animation', animation_datachunk)
  115. synnc($projectiles.get_children(), 'projectiles_sync')
  116. tick += 1
  117. if fmod(tick,tickrate) == 0:
  118. synnc(get_tree().get_nodes_in_group('enemy'), 'enemies_position_2')
  119. # var enemies_datachunk = PoolByteArray()
  120. # for i in $enemies.dict.arraypos.size():
  121. # if $enemies.dict.arrayvida[i] > 0:
  122. # var pos = $enemies.dict.arraypos[i]
  123. # enemies_datachunk.append_array( return_int16(pos.x) )
  124. # enemies_datachunk.append_array( return_int16(pos.y) )
  125. # var bytetest : PoolByteArray
  126. # bytetest.append($enemies.dict.type[i] )
  127. # enemies_datachunk.append_array( bytetest )
  128. # rpc_unreliable_id(0, 'enemies_position_2', enemies_datachunk)
  129. func _enemy_dmg(enemy_id):
  130. rpc_unreliable_id(0, 'enemy_dmg_anim', enemy_id)
  131. func pshootanim(arg):
  132. rpc_unreliable_id(0, 'aimanim', arg)
  133. func synnc(arg,arg1):
  134. var projectile_datachunk = PoolByteArray()
  135. for i in arg:
  136. var pos = i.global_position
  137. projectile_datachunk.append_array( return_int16(pos.x) )
  138. projectile_datachunk.append_array( return_int16(pos.y) )
  139. var bytetest : PoolByteArray
  140. bytetest.append(i.type)
  141. bytetest.append(i.fliph)
  142. projectile_datachunk.append_array( bytetest )
  143. rpc_unreliable_id(0, arg1, projectile_datachunk)
  144. func return_int16(number):
  145. var int16 = number + 32768
  146. var bytetest : PoolByteArray
  147. var byte1:int = int(int16/255)
  148. var byte2:int = int(fmod(int16,255))
  149. bytetest.append(byte1)
  150. bytetest.append(byte2)
  151. return bytetest
  152. func player_anim(attack,arg):
  153. rpc_id( 0,'attack_anim', attack, int(arg) )
  154. func hp_update(vida, id):
  155. rpc_id( 0,'atr_update', {id:{'hp':vida}})
  156. func player_death(id):
  157. rpc_id( 0,'player_death_update', id)
  158. func kill_update(kill, xp, lv, nxt, id):
  159. rpc_id( 0,'atr_update', {id:{'k':kill, 'xp':xp, 'lv':lv, 'nxt':nxt}})
  160. func level_up(lv, maxhp, gain, dmgup, id):
  161. rpc_id( 0,'level_up', lv, id)
  162. $players.get_node(str(id)).regenhp(gain)
  163. $players.get_node(str(id)).dmg += dmgup
  164. rpc_id( 0,'atr_update', {id:{'maxhp':maxhp}})
  165. func spriter_request(anim, pos, id, auto):
  166. rpc_id( 0,'add_sprite', anim, pos, id, auto)
  167. func spriter_nuke_request(time, id):
  168. yield(get_tree().create_timer(time),"timeout")
  169. rpc_id( 0,'nuke_sprite', id)
  170. func flash_spriter(id):
  171. print('flash')
  172. rpc_id( 0,'flash_spriter', id)
  173. var enemy_counter