space.gd 14,1 КБ
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

magcourier's avatar
magcourier включено в состав коммита
50
51
func _on_data():
	var i_data_server = 0
magcourier's avatar
#118    
magcourier включено в состав коммита
52
	var q = QueryObject.new()
magcourier's avatar
magcourier включено в состав коммита
53
	for on_data in Net.data_server:
magcourier's avatar
magcourier включено в состав коммита
54
		var index = id_projekto_direkt_del.find(int(on_data['id']))
magcourier's avatar
#118    
magcourier включено в состав коммита
55
56
57
58
59
60
61
		var index_net = id_net.find(int(on_data['id']))
		var index_pafo = id_pafo.find(int(on_data['id']))
		if index_net > -1: # находится в списке отправленных запросов
			# удаляем из списка
			id_net.remove(index_net)
			Net.data_server.remove(i_data_server)
		elif index > -1: # находится в списке удаляемых объектов
magcourier's avatar
magcourier включено в состав коммита
62
63
64
65
66
67
68
69
			# удаляем из списка
			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 включено в состав коммита
70
71
		elif index_pafo > -1: # находится в списке выстрелов, закрываем задачу
			# пользователь не может закрыть, т.к. владелец лазера объект, а не пользователь
magcourier's avatar
#118    
magcourier включено в состав коммита
72
73
74
75
76
			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 включено в состав коммита
77
		elif int(on_data['id']) == subscription_id:
magcourier's avatar
magcourier включено в состав коммита
78
79
80
81
82
83
			if on_data['payload']['data']['universoObjektoEventoj']['evento']=='kubo_tasko':
				# пришло сообщение, по какому объекту, в каком проекте, какая задача изменена
				sxangxi_tasko(on_data['payload']['data'])
			elif on_data['payload']['data']['universoObjektoEventoj']['evento']=='kubo_objekto':
				# изменение по объекту
				sxangxi_objekto(on_data['payload']['data'])
magcourier's avatar
magcourier включено в состав коммита
84
			Net.data_server.remove(i_data_server)
magcourier's avatar
magcourier включено в состав коммита
85
86
		i_data_server += 1

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

magcourier's avatar
#118    
magcourier включено в состав коммита
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# проверка, входит ли 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 включено в состав коммита
102
103
104
105
106
107
108
109
110
# поиск объекта по 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 включено в состав коммита
111
112
113
114
# меняем задачу объекту
func sxangxi_tasko(on_data):
	# пометка о нахождении нужного объекта
	var objekto = false
magcourier's avatar
magcourier включено в состав коммита
115
116
117
	# если эти изменения не по задаче
	if not on_data['universoObjektoEventoj']['tasko']:
		return
magcourier's avatar
#118    
magcourier включено в состав коммита
118
119
	var uuid = on_data['universoObjektoEventoj']['tasko']['posedanto']['edges'].front()['node']['posedantoObjekto']['uuid']
	for ch in get_children(): # проходим по всем созданным объектам (кроме управляемого корабля) в поисках нужного
magcourier's avatar
magcourier включено в состав коммита
120
		if ch.is_in_group('create') and ('objekto' in ch):
magcourier's avatar
#118    
magcourier включено в состав коммита
121
122
123
124
125
126
127
128
			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 включено в состав коммита
129
130
				# если проект стрельбы
				elif on_data['universoObjektoEventoj']['projekto']['kategorio']['edges'].front()['node']['objId']==Net.projekto_kategorio_pafado:
magcourier's avatar
#118    
magcourier включено в состав коммита
131
132
					ch.pafo(on_data['universoObjektoEventoj']['projekto'],
						on_data['universoObjektoEventoj']['tasko'])
magcourier's avatar
magcourier включено в состав коммита
133
134
135
					if on_data['universoObjektoEventoj']['tasko']['kategorio']['edges'].front()['node']['objId']==Net.tasko_kategorio_celilo:
						# сообщаем кораблю игрока о прицеливании в него
						pass
magcourier's avatar
magcourier включено в состав коммита
136
				objekto = true
magcourier's avatar
#118    
magcourier включено в состав коммита
137
	if !objekto: # если объект не найден, то нужно его добавить (если он не часть своего корабля)
magcourier's avatar
magcourier включено в состав коммита
138
139
140
141
142
143
144
145
146
147
148
149
150
		if sercxado_uuid(uuid,$ship):
			print('часть управляемого корабля')
		else:
			print('===найден новый объект!!! uuid=',uuid,' ===on_data=',on_data)


# изменяем характеристики объекта
func sxangxi_objekto(on_data):
	print('пора менять характеристики объекта = ',on_data['universoObjektoEventoj']['objekto']['uuid'])
	var uuid = on_data['universoObjektoEventoj']['objekto']['uuid']
	var objekt = sercxo_objekto_uuid(uuid)
	if objekt:
		print('нашли объект uuid=',uuid)
magcourier's avatar
magcourier включено в состав коммита
151
152
153
154
155


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


magcourier's avatar
magcourier включено в состав коммита
161
162
163
164
165
166
167
168
169
170
#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 включено в состав коммита
171

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


magcourier's avatar
magcourier включено в состав коммита
181
182
183
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
184
185
186
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 включено в состав коммита
187
	var simpled_data = parsed_resp['data']['redaktuUniversoTaskoj']['universoTaskoj']
magcourier's avatar
magcourier включено в состав коммита
188
	# получаем uuid задачи и помещаем в itinero
magcourier's avatar
magcourier включено в состав коммита
189
	Global.itineroj[0]['uuid_tasko']=simpled_data['uuid']
magcourier's avatar
magcourier включено в состав коммита
190
191


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


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


magcourier's avatar
magcourier включено в состав коммита
212
213
214
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
magcourier's avatar
magcourier включено в состав коммита
215
216
217
218
219
220
221
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 включено в состав коммита
222
223
		if len(Global.itineroj)>i:
			Global.itineroj[i]['uuid_tasko']=tasko['uuid']
magcourier's avatar
magcourier включено в состав коммита
224
225
		i += 1

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

magcourier's avatar
magcourier включено в состав коммита
227
228
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 включено в состав коммита
229
const base_ship = preload("res://blokoj/kosmosxipoj/scenoj/base_ship.tscn")
magcourier's avatar
magcourier включено в состав коммита
230
const espero = preload("res://blokoj/kosmostacioj/espero/espero_ekster.tscn")
magcourier's avatar
magcourier включено в состав коммита
231
232
233
234
const ast_1 = preload("res://blokoj/asteroidoj/ast_1.tscn")
const ast_1_cr = preload("res://blokoj/asteroidoj/ast_1_cr.tscn")
const ast_shards_0 = preload("res://blokoj/asteroidoj/ast_shards_0.tscn")
const ast_shards_2 = preload("res://blokoj/asteroidoj/ast_shards_2.tscn")
magcourier's avatar
magcourier включено в состав коммита
235

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


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


magcourier's avatar
magcourier включено в состав коммита
261
func _on_space_load_objektoj():
magcourier's avatar
magcourier включено в состав коммита
262
	Title.get_node("CanvasLayer/UI/Objektoj/Window").distance_to($ship.translation)
magcourier's avatar
magcourier включено в состав коммита
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
			add_child(s)
			s.add_to_group('create')
			s.add_to_group('enemies')
		elif (item['resurso']['objId'] == 7)and(item['koordinatoX']):# тип - астероид
magcourier's avatar
magcourier включено в состав коммита
298
299
300
301
302
303
304
305
306
307
308
309
#			подгружаем в зависимости от состояния модификации астероида грузим картинку
			var ast
			if item['stato']['objId']==1:
				ast = ast_1.instance()
			elif item['stato']['objId']==2:
				ast = ast_1_cr.instance()
			elif item['stato']['objId']==3:
				ast = ast_shards_0.instance()
			else:
#				if item['stato']['objId']==4:
				ast = ast_shards_2.instance()

magcourier's avatar
magcourier включено в состав коммита
310
311
312
313
			ast.translation=Vector3(item['koordinatoX'],
				item['koordinatoY'], item['koordinatoZ'])
			ast.rotation=Vector3(item['rotaciaX'],
				item['rotaciaY'], item['rotaciaZ'])
magcourier's avatar
magcourier включено в состав коммита
314
			ast.uuid = item['uuid']
magcourier's avatar
magcourier включено в состав коммита
315
			ast.integreco = item['integreco']
magcourier's avatar
magcourier включено в состав коммита
316
			ast.objekto = item.duplicate(true)
magcourier's avatar
magcourier включено в состав коммита
317
318
319
			add_child(ast)
			ast.add_to_group('create')
			ast.add_to_group('asteroidoj')
magcourier's avatar
magcourier включено в состав коммита
320
321
322
323
324


func _on_Timer_timeout():
	var q = QueryObject.new()
	# Делаем запрос к бэкэнду
magcourier's avatar
magcourier включено в состав коммита
325
326
327
328
329
330
	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 включено в состав коммита
331
332
333
334
335
336
337
338
339
340
341
342
343
	$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 включено в состав коммита
344
	Global.fenestro_kosmo = null
magcourier's avatar
#118    
magcourier включено в состав коммита
345
346
347
348