space.gd 13,7 КБ
Newer Older
magcourier's avatar
magcourier включено в состав коммита
1
2
3
extends Spatial


magcourier's avatar
magcourier включено в состав коммита
4
5
6
const QueryObject = preload("queries.gd")


magcourier's avatar
magcourier включено в состав коммита
7
# warning-ignore:unused_signal
magcourier's avatar
magcourier включено в состав коммита
8
9
signal load_objektoj

magcourier's avatar
#118    
magcourier включено в состав коммита
10
# список id запросов, отправленных на сервер
magcourier's avatar
magcourier включено в состав коммита
11
var id_projekto_direkt_del = [] # список проектов на удаление
magcourier's avatar
#118    
magcourier включено в состав коммита
12
13
var subscription_id # id сообщения, по какому объекту, в каком проекте, какая задача изменена
var id_net = [] # список пустых id запросов (ответы не анализируются, а удаляются)
magcourier's avatar
magcourier включено в состав коммита
14

magcourier's avatar
#118    
magcourier включено в состав коммита
15
16
# пока сервер не закрывает выстрел, закрывает сам клиент
var id_pafo = []
magcourier's avatar
magcourier включено в состав коммита
17

magcourier's avatar
magcourier включено в состав коммита
18

magcourier's avatar
magcourier включено в состав коммита
19
func _ready():
magcourier's avatar
magcourier включено в состав коммита
20
21
	$Control.camera = $camera

magcourier's avatar
magcourier включено в состав коммита
22
23
24
25
26
	# подключаем сигнал для обработки входящих данных
	var err = Net.connect("input_data", self, "_on_data")
	if err:
		print('error = ',err)

magcourier's avatar
magcourier включено в состав коммита
27
	Global.fenestro_kosmo = self
magcourier's avatar
magcourier включено в состав коммита
28
29
30
	# считываем размер экрана и задаём затемнение на весь экран
	$ui/loading.margin_right = get_node("/root").get_viewport().size.x
	$ui/loading.margin_bottom = get_node("/root").get_viewport().size.y
magcourier's avatar
magcourier включено в состав коммита
31
32
33
34
	# создаём свой корабль
	var ship = create_ship(Global.direktebla_objekto[Global.realeco-2])
	#если корабль игрока, то брать данные из direktebla_objekto

magcourier's avatar
magcourier включено в состав коммита
35
	$camera.translation=Vector3(
magcourier's avatar
magcourier включено в состав коммита
36
37
38
39
40
		Global.direktebla_objekto[Global.realeco-2]['koordinatoX'],
		Global.direktebla_objekto[Global.realeco-2]['koordinatoY'], 
		Global.direktebla_objekto[Global.realeco-2]['koordinatoZ']+22
	)
	add_child(ship,true)
magcourier's avatar
magcourier включено в состав коммита
41
	$camera.point_of_interest = ship
magcourier's avatar
magcourier включено в состав коммита
42

magcourier's avatar
magcourier включено в состав коммита
43
	for i in get_children():
magcourier's avatar
magcourier включено в состав коммита
44
		if has_signal_custom(i,"new_way_point"):
magcourier's avatar
magcourier включено в состав коммита
45
			i.connect("new_way_point",self,"set_way_point")
magcourier's avatar
magcourier включено в состав коммита
46
47
	
	subscribtion_kubo()
magcourier's avatar
magcourier включено в состав коммита
48

magcourier's avatar
magcourier включено в состав коммита
49
50
51
52
53
54
55
56
	# тест на отправку сервером данных
	if Global.server:
		var celo = Transform(Basis.IDENTITY, Vector3(50000, 100,100))
		Global.fenestro_itinero.okazigi_itinero(
			'', '', celo.origin.x, celo.origin.y, celo.origin.z, 
			celo, -1, Net.kategorio_movado, true
		)
#		отправляем закрытие задачи выстрела 
magcourier's avatar
magcourier включено в состав коммита
57

magcourier's avatar
magcourier включено в состав коммита
58
59
func _on_data():
	var i_data_server = 0
magcourier's avatar
#118    
magcourier включено в состав коммита
60
	var q = QueryObject.new()
magcourier's avatar
magcourier включено в состав коммита
61
	for on_data in Net.data_server:
magcourier's avatar
magcourier включено в состав коммита
62
63
#		print('on_data=', on_data)
#		print('on_data[id] =',on_data['id'],' id_projekto_direkt_del=',id_projekto_direkt_del)
magcourier's avatar
magcourier включено в состав коммита
64
		var index = id_projekto_direkt_del.find(int(on_data['id']))
magcourier's avatar
magcourier включено в состав коммита
65
#		print('index=',index,' ::: ', typeof(index), " == ", typeof(on_data['id']))
magcourier's avatar
#118    
magcourier включено в состав коммита
66
67
		var index_net = id_net.find(int(on_data['id']))
		var index_pafo = id_pafo.find(int(on_data['id']))
magcourier's avatar
magcourier включено в состав коммита
68
#		print('====on_data=',on_data)
magcourier's avatar
#118    
magcourier включено в состав коммита
69
70
71
72
73
		if index_net > -1: # находится в списке отправленных запросов
			# удаляем из списка
			id_net.remove(index_net)
			Net.data_server.remove(i_data_server)
		elif index > -1: # находится в списке удаляемых объектов
magcourier's avatar
magcourier включено в состав коммита
74
#			print('=== Удалили проект управляемого объекта')
magcourier's avatar
magcourier включено в состав коммита
75
76
77
78
79
80
81
82
			# удаляем из списка
			var idx_prj = 0 #индекс массива для удаления
			for prj in Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']:
				if prj['node']['uuid']==on_data['payload']['data']['redaktuUniversoProjekto']['universoProjekto']['uuid']:
					Global.direktebla_objekto[Global.realeco-2]['projekto']['edges'].remove(idx_prj)
				idx_prj += 1
			id_projekto_direkt_del.remove(index)
			Net.data_server.remove(i_data_server)
magcourier's avatar
magcourier включено в состав коммита
83
84
85
		elif index_pafo > -1: # находится в списке выстрелов, закрываем задачу
#			print('закрываем задачу стрельбы = ',on_data['payload']['data']['redaktuUniversoTaskoj']['universoTaskoj']['uuid'])
			# пользователь не может закрыть, т.к. владелец лазера объект, а не пользователь
magcourier's avatar
#118    
magcourier включено в состав коммита
86
87
88
89
90
			var id = Net.get_current_query_id()
			Global.fenestro_kosmo.id_net.push_back(id)
			Net.send_json(q.finado_tasko(on_data['payload']['data']['redaktuUniversoTaskoj']['universoTaskoj']['uuid'],Net.statuso_fermo,id))
			id_pafo.remove(index_pafo)
			Net.data_server.remove(i_data_server)
magcourier's avatar
magcourier включено в состав коммита
91
92
93
		elif int(on_data['id']) == subscription_id:
			# пришло сообщение, по какому объекту, в каком проекте, какая задача изменена
			sxangxi_tasko(on_data['payload']['data'])
magcourier's avatar
magcourier включено в состав коммита
94
			Net.data_server.remove(i_data_server)
magcourier's avatar
magcourier включено в состав коммита
95
96
#		else:
#			print('on_data else=', on_data)
magcourier's avatar
magcourier включено в состав коммита
97
98
99
100
101
#		elif on_data['payload']['data'].get('filteredUniversoObjekto'):
#			pass
#			Net.data_server.remove(i_data_server)
		i_data_server += 1

magcourier's avatar
magcourier включено в состав коммита
102

magcourier's avatar
#118    
magcourier включено в состав коммита
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# проверка, входит ли uuid в данный объект
#проверка по нисходящий (по всем детям-объектам)
func sercxado_uuid(uuid, objekt):
	var result = null
	if objekt.get('uuid'):
		if uuid == objekt.uuid:
			return objekt
	for ch in objekt.get_children():
		result = sercxado_uuid(uuid, ch)
		if result:
			return result
	return result


magcourier's avatar
magcourier включено в состав коммита
117
118
119
120
121
122
123
124
125
# поиск объекта по uuid
func sercxo_objekto_uuid(uuid):
	for ch in get_children():
		if ch.is_in_group('create'):
			if ch.uuid == uuid:
				return ch
	return null


magcourier's avatar
magcourier включено в состав коммита
126
127
128
129
# меняем задачу объекту
func sxangxi_tasko(on_data):
	# пометка о нахождении нужного объекта
	var objekto = false
magcourier's avatar
#118    
magcourier включено в состав коммита
130
131
	var uuid = on_data['universoObjektoEventoj']['tasko']['posedanto']['edges'].front()['node']['posedantoObjekto']['uuid']
	for ch in get_children(): # проходим по всем созданным объектам (кроме управляемого корабля) в поисках нужного
magcourier's avatar
magcourier включено в состав коммита
132
		if ch.is_in_group('create') and ('objekto' in ch):
magcourier's avatar
#118    
magcourier включено в состав коммита
133
134
135
136
137
138
139
140
			if sercxado_uuid(uuid,ch):
#			отправляю астероиду - ха-ха-ха
#			if on_data['universoObjektoEventoj']['objekto']['uuid']==ch.uuid:
				# если это задача категории движения
				if on_data['universoObjektoEventoj']['projekto']['kategorio']['edges'].front()['node']['objId']==Net.kategorio_movado:
					# изменение маршрута движения
					ch.sxangxi_itinero(on_data['universoObjektoEventoj']['projekto'],
						on_data['universoObjektoEventoj']['tasko'])
magcourier's avatar
magcourier включено в состав коммита
141
142
				# если проект стрельбы
				elif on_data['universoObjektoEventoj']['projekto']['kategorio']['edges'].front()['node']['objId']==Net.projekto_kategorio_pafado:
magcourier's avatar
#118    
magcourier включено в состав коммита
143
144
					ch.pafo(on_data['universoObjektoEventoj']['projekto'],
						on_data['universoObjektoEventoj']['tasko'])
magcourier's avatar
magcourier включено в состав коммита
145
146
147
					if on_data['universoObjektoEventoj']['tasko']['kategorio']['edges'].front()['node']['objId']==Net.tasko_kategorio_celilo:
						# сообщаем кораблю игрока о прицеливании в него
						pass
magcourier's avatar
magcourier включено в состав коммита
148
				objekto = true
magcourier's avatar
#118    
magcourier включено в состав коммита
149
	if !objekto: # если объект не найден, то нужно его добавить (если он не часть своего корабля)
magcourier's avatar
magcourier включено в состав коммита
150
		print('===найден новый объект!!! uuid=',uuid,'===on_data=',on_data)
magcourier's avatar
magcourier включено в состав коммита
151
152
153
154
155
156
		pass


# подписка на действие в кубе нахождения
func subscribtion_kubo():
	var q = QueryObject.new()
magcourier's avatar
magcourier включено в состав коммита
157
	subscription_id = Net.get_current_query_id()
magcourier's avatar
magcourier включено в состав коммита
158
159
160
161
#	Net.send_json(q.test_json(subscription_id))
	Net.send_json(q.kubo_json(subscription_id))


magcourier's avatar
magcourier включено в состав коммита
162
163
164
165
166
167
168
169
170
171
#func set_way_point(position,dock):
#	#останавливаем таймер
#	$timer.stop()
#	$ship.set_way_point(position,dock)
#	$way_point.set_way_point(position)
#	get_node("ship").add_itinero('',position.x, position.y, position.z,-1)
#	#передаём текущие координаты
#	$ship.vojkomenco()#начинаем движение
#	#запускаем таймер
#	$timer.start()
magcourier's avatar
magcourier включено в состав коммита
172

magcourier's avatar
magcourier включено в состав коммита
173
func has_signal_custom(node, sgnl) ->bool:
magcourier's avatar
magcourier включено в состав коммита
174
175
	if node == null:
		return false
magcourier's avatar
magcourier включено в состав коммита
176
	for i in node.get_signal_list():
magcourier's avatar
magcourier включено в состав коммита
177
178
179
180
181
		if i.name == sgnl:
			return true
	return false


magcourier's avatar
magcourier включено в состав коммита
182
183
184
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
185
186
187
func _on_http_tasko_request_completed(result, response_code, headers, body):
	var resp = body.get_string_from_utf8()
	var parsed_resp = parse_json(resp)
magcourier's avatar
magcourier включено в состав коммита
188
	var simpled_data = parsed_resp['data']['redaktuUniversoTaskoj']['universoTaskoj']
magcourier's avatar
magcourier включено в состав коммита
189
#	print('===_on_http_tasko_request_completed===',parsed_resp)
magcourier's avatar
magcourier включено в состав коммита
190
	# получаем uuid задачи и помещаем в itinero
magcourier's avatar
magcourier включено в состав коммита
191
	Global.itineroj[0]['uuid_tasko']=simpled_data['uuid']
magcourier's avatar
magcourier включено в состав коммита
192
193


magcourier's avatar
magcourier включено в состав коммита
194
195
196
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
197
198
func _on_http_posedanto_request_completed(result, response_code, headers, body):
	var resp = body.get_string_from_utf8()
magcourier's avatar
magcourier включено в состав коммита
199
# warning-ignore:unused_variable
magcourier's avatar
magcourier включено в состав коммита
200
201
202
203
	var parsed_resp = parse_json(resp)
	pass


magcourier's avatar
magcourier включено в состав коммита
204
205
206
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
207
208
func _on_http_finado_request_completed(result, response_code, headers, body):
	var resp = body.get_string_from_utf8()
magcourier's avatar
magcourier включено в состав коммита
209
# warning-ignore:unused_variable
magcourier's avatar
magcourier включено в состав коммита
210
211
	var parsed_resp = parse_json(resp)
	pass # Replace with function body.
magcourier's avatar
magcourier включено в состав коммита
212
213


magcourier's avatar
magcourier включено в состав коммита
214
215
216
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
217
218
219
220
221
222
223
func _on_http_taskoj_request_completed(result, response_code, headers, body):
	var resp = body.get_string_from_utf8()
	var parsed_resp = parse_json(resp)
	var simpled_data = parsed_resp['data']['redaktuKreiUniversoTaskojPosedanto']['universoTaskoj']
	# получаем список задач и помещаем в itinero
	var i = 0
	for tasko in simpled_data:
magcourier's avatar
magcourier включено в состав коммита
224
225
		if len(Global.itineroj)>i:
			Global.itineroj[i]['uuid_tasko']=tasko['uuid']
magcourier's avatar
magcourier включено в состав коммита
226
227
		i += 1

magcourier's avatar
magcourier включено в состав коммита
228

magcourier's avatar
magcourier включено в состав коммита
229
230
const sxipo = preload("res://blokoj/kosmosxipoj/scenoj/sxipo_fremdulo.tscn")
const sxipo_modulo = preload("res://blokoj/kosmosxipoj/skriptoj/moduloj/sxipo.gd")
magcourier's avatar
magcourier включено в состав коммита
231
const base_ship = preload("res://blokoj/kosmosxipoj/scenoj/base_ship.tscn")
magcourier's avatar
magcourier включено в состав коммита
232
const espero = preload("res://blokoj/kosmostacioj/espero/espero_ekster.tscn")
tigisae's avatar
tigisae включено в состав коммита
233
const asteroido = preload("res://blokoj/asteroidoj/ast_1.tscn")
magcourier's avatar
magcourier включено в состав коммита
234

magcourier's avatar
magcourier включено в состав коммита
235
236
237
const AnalizoProjekto = preload("res://blokoj/kosmosxipoj/skriptoj/itineroj.gd")


magcourier's avatar
magcourier включено в состав коммита
238
239
240
# функция создания корабля
func create_ship(objecto):
	var ship = null
magcourier's avatar
magcourier включено в состав коммита
241
	
magcourier's avatar
magcourier включено в состав коммита
242
243
	if (objecto['resurso']['objId'] == 3):# это корабль "Vostok U2" "Базовый космический корабль"
		ship = base_ship.instance()
magcourier's avatar
magcourier включено в состав коммита
244
		var sh = sxipo_modulo.new()
magcourier's avatar
magcourier включено в состав коммита
245
		sh.create_sxipo(ship, objecto)
magcourier's avatar
magcourier включено в состав коммита
246
	if not ship: # проверка, если такого корабля нет в программе
magcourier's avatar
magcourier включено в состав коммита
247
		return null
magcourier's avatar
magcourier включено в состав коммита
248
249
	ship.translation=Vector3(objecto['koordinatoX'],
		objecto['koordinatoY'], objecto['koordinatoZ'])
magcourier's avatar
magcourier включено в состав коммита
250
251
252
	if objecto['rotaciaX']:
		ship.rotation=Vector3(objecto['rotaciaX'],
			objecto['rotaciaY'], objecto['rotaciaZ'])
magcourier's avatar
magcourier включено в состав коммита
253
254
255
	ship.visible=true
	ship.uuid=objecto['uuid']
	ship.add_to_group('create')
magcourier's avatar
magcourier включено в состав коммита
256
	$camera.set_privot(ship)
magcourier's avatar
magcourier включено в состав коммита
257
258
259
	return ship


magcourier's avatar
magcourier включено в состав коммита
260
func _on_space_load_objektoj():
magcourier's avatar
magcourier включено в состав коммита
261
	Title.get_node("CanvasLayer/UI/Objektoj/Window").distance_to($ship.translation)
magcourier's avatar
magcourier включено в состав коммита
262
263
264

	# и теперь по uuid нужно найти проект и задачу
	var projektoj = Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']
magcourier's avatar
magcourier включено в состав коммита
265
266
267
268
269
	var analizo = AnalizoProjekto.new()
	analizo.analizo_projekto(projektoj,get_node("ship"),Global.fenestro_itinero)
	# если корабль полетел, то включаем таймер
	if len(Global.fenestro_itinero.itineroj)>0 and (not Global.fenestro_itinero.itinero_pause):
		$timer.start()
magcourier's avatar
magcourier включено в состав коммита
270
	# создаём остальные объекты в космосе
magcourier's avatar
magcourier включено в состав коммита
271
	for item in Global.objektoj:
magcourier's avatar
magcourier включено в состав коммита
272
273
		if item['resurso']['objId'] == 1:#объект станция Espero
			var state = espero.instance()
magcourier's avatar
magcourier включено в состав коммита
274
275
			state.translation=Vector3(item['koordinatoX'],
				item['koordinatoY'], item['koordinatoZ'])
magcourier's avatar
magcourier включено в состав коммита
276
			state.uuid = item['uuid']
magcourier's avatar
magcourier включено в состав коммита
277
			state.objekto = item.duplicate(true)
magcourier's avatar
magcourier включено в состав коммита
278
279
280
			add_child(state)
			state.add_to_group('state')
			state.add_to_group('create')
magcourier's avatar
magcourier включено в состав коммита
281
		elif (item['resurso']['tipo']['objId'] == 2)and(item['koordinatoX']):# тип - корабль
magcourier's avatar
magcourier включено в состав коммита
282
283
284
			var s = sxipo.instance()
			var sh = sxipo_modulo.new()
			sh.create_sxipo(s, item)
magcourier's avatar
magcourier включено в состав коммита
285
			s.uuid = item['uuid']
magcourier's avatar
magcourier включено в состав коммита
286
			s.objekto = item.duplicate(true)
magcourier's avatar
magcourier включено в состав коммита
287
288
289
290
			s.translation=Vector3(item['koordinatoX'],
				item['koordinatoY'], item['koordinatoZ'])
			s.rotation=Vector3(item['rotaciaX'],
				item['rotaciaY'], item['rotaciaZ'])
magcourier's avatar
magcourier включено в состав коммита
291
292
			# добавляем маршрут движения
			projektoj = item['projekto']['edges']
magcourier's avatar
magcourier включено в состав коммита
293
			analizo.analizo_projekto(projektoj,s,s)
magcourier's avatar
magcourier включено в состав коммита
294
295
296
297
298
299
300
301
302
			add_child(s)
			s.add_to_group('create')
			s.add_to_group('enemies')
		elif (item['resurso']['objId'] == 7)and(item['koordinatoX']):# тип - астероид
			var ast = asteroido.instance()
			ast.translation=Vector3(item['koordinatoX'],
				item['koordinatoY'], item['koordinatoZ'])
			ast.rotation=Vector3(item['rotaciaX'],
				item['rotaciaY'], item['rotaciaZ'])
magcourier's avatar
magcourier включено в состав коммита
303
			ast.uuid = item['uuid']
magcourier's avatar
magcourier включено в состав коммита
304
			ast.objekto = item.duplicate(true)
magcourier's avatar
magcourier включено в состав коммита
305
306
307
			add_child(ast)
			ast.add_to_group('create')
			ast.add_to_group('asteroidoj')
magcourier's avatar
magcourier включено в состав коммита
308
309
310
311
312


func _on_Timer_timeout():
	var q = QueryObject.new()
	# Делаем запрос к бэкэнду
magcourier's avatar
magcourier включено в состав коммита
313
314
315
316
317
318
	Global.direktebla_objekto[Global.realeco-2]['koordinatoX'] = $ship.translation.x
	Global.direktebla_objekto[Global.realeco-2]['koordinatoY'] = $ship.translation.y
	Global.direktebla_objekto[Global.realeco-2]['koordinatoZ'] = $ship.translation.z
	Global.direktebla_objekto[Global.realeco-2]['rotationX'] = $ship.rotation.x
	Global.direktebla_objekto[Global.realeco-2]['rotationY'] = $ship.rotation.y
	Global.direktebla_objekto[Global.realeco-2]['rotationZ'] = $ship.rotation.z
magcourier's avatar
magcourier включено в состав коммита
319
320
321
322
323
324
325
326
327
328
329
330
331
	$http_mutate.request(q.URL, Global.backend_headers, true, 2, 
		q.objecto_mutation($ship.uuid, $ship.translation.x, 
			$ship.translation.y, $ship.translation.z,
			$ship.rotation.x, 
			$ship.rotation.y, $ship.rotation.z)
	)


func _on_space_tree_exiting():
	#разрушаем все созданные объекты в этом мире
	for ch in get_children():
		if ch.is_in_group('create'):
			ch.free()
magcourier's avatar
magcourier включено в состав коммита
332
	Global.fenestro_kosmo = null
magcourier's avatar
#118    
magcourier включено в состав коммита
333
334
335
336