Коммит 70f852ef создал по автору magcourier's avatar magcourier
Просмотр файлов

#117 доработан для использования и в #118

владелец 25402f87
[gd_scene load_steps=14 format=2]
[gd_scene load_steps=13 format=2]
[ext_resource path="res://blokoj/kosmo/scenoj/ship.tscn" type="PackedScene" id=2]
[ext_resource path="res://blokoj/kosmo/scenoj/space_object.tscn" type="PackedScene" id=3]
[ext_resource path="res://blokoj/kosmo/scenoj/main_camera.tscn" type="PackedScene" id=4]
[ext_resource path="res://blokoj/kosmo/scenoj/star.tscn" type="PackedScene" id=5]
......@@ -93,10 +92,6 @@ script = ExtResource( 7 )
[node name="http_finado" type="HTTPRequest" parent="."]
[node name="ship1" parent="." instance=ExtResource( 2 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 129.985 )
visible = false
[node name="asteroid" type="MeshInstance" parent="."]
transform = Transform( 5, 0, 0, 0, 5, 0, 0, 0, 5, 82.0017, 0, 4.63756 )
mesh = SubResource( 1 )
......
......@@ -17,7 +17,7 @@ func _on_http_mutate_projekto_completed(result, response_code, headers, body):
var parsed_resp = parse_json(resp)
var simpled_data = parsed_resp['data']['redaktuUniversoProjekto']['universoProjekto']
var uuid = simpled_data['uuid']
$"../ship".projekto_uuid=uuid
Global.fenestro_itinero.projekto_itineroj_uuid=uuid
# теперь создаём задачу с координатами
......
extends Control
# uuid выполняемого проекта
var projekto_uuid
var projekto_itineroj_uuid
var projekto_mouse # проект запущен мышкой
# если маршрут создаётся списком, то это новый проект
......@@ -70,10 +70,14 @@ func _on_data():
Net.data_server.remove(i_data_server)
i_data_server += 1
var step = 0 #шаг времени для обновления расстояния
func _physics_process(delta):
if Global.fenestro_kosmo:
distance_to(Global.fenestro_kosmo.get_node("ship").translation)
step += delta
if step>1:
step = 0
if Global.fenestro_kosmo:
distance_to(Global.fenestro_kosmo.get_node("ship").translation)
func _on_Close_button_pressed():
......@@ -138,7 +142,7 @@ func _on_kom_itinero_pressed():
# добавить задачу в маршрут, а при отсутствии проекта - создать маршрут из одной точки
func okazigi_itinero(uuid_celo, nomo, koordinatoX, koordinatoY,
koordinatoZ, transform, distance, kategorio, mouse):
# kategorio=Global.kategorio_movado
# kategorio=Net.kategorio_movado
if len(itineroj)>1:
fermi_projekto_tasko()
elif len(itineroj)>0:
......@@ -151,7 +155,8 @@ func okazigi_itinero(uuid_celo, nomo, koordinatoX, koordinatoY,
koordinatoY,koordinatoZ))
Global.fenestro_kosmo.get_node("ship").target_rot = Quat(Global.fenestro_kosmo.get_node("ship").transform.looking_at(transform.origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
add_itinero('', uuid_celo, nomo, koordinatoX,
koordinatoY, koordinatoZ, transform, distance, kategorio)
koordinatoY, koordinatoZ, transform, distance,
kategorio, -1)
if itinero_pause:
itinero_pause = false
vojkomenco()
......@@ -159,7 +164,8 @@ func okazigi_itinero(uuid_celo, nomo, koordinatoX, koordinatoY,
# добавить точку маршрута
func add_itinero(uuid_tasko, uuid_celo, nomo, koordinatoX,
koordinatoY, koordinatoZ, transform, distance, kategorio=Global.kategorio_movado):
koordinatoY, koordinatoZ, transform, distance, kategorio,
pozicio):
itineroj.append({
'uuid_tasko':uuid_tasko,
'uuid_celo':uuid_celo,
......@@ -169,7 +175,8 @@ func add_itinero(uuid_tasko, uuid_celo, nomo, koordinatoX,
'koordinatoZ':koordinatoZ,
'transform': transform,
'distance':distance,
'kategorio':kategorio
'kategorio':kategorio,
'pozicio':pozicio
})
get_node("canvas/MarginContainer/VBoxContainer/ItemList").add_item('('+String(int(distance))+') '+nomo, null, true)
......@@ -194,29 +201,35 @@ func malmultigi_unua(mouse = false): # уменьшить первый
FillItemList()
# отправляем на сервер закрытие проекта
func send_fermi_projekto(projekto_uuid):
var q = QueryObject.new()
var id = Net.get_current_query_id()
id_net.push_back(id)
Net.send_json(q.finado_projeko_json(projekto_uuid,id))
# закрываем проект
func fermi_projekto():
if projekto_uuid:
var q = QueryObject.new()
var id = Net.get_current_query_id()
id_net.push_back(id)
Net.send_json(q.finado_projeko_json(projekto_uuid,id))
projekto_uuid = ''
if projekto_itineroj_uuid:
send_fermi_projekto(projekto_itineroj_uuid)
projekto_itineroj_uuid = ''
projekto_mouse = true
malplenigi_itinero()
# закрываем проект и первую (текущую) задачу
func fermi_projekto_tasko():
if projekto_uuid:
print('закрываем проект = ', projekto_itineroj_uuid)
if projekto_itineroj_uuid:
var q = QueryObject.new()
var id = Net.get_current_query_id()
id_net.push_back(id)
if itineroj.front()['uuid_tasko']:
Net.send_json(q.finado_projekto_tasko_json(projekto_uuid,itineroj.front()['uuid_tasko'],id))
Net.send_json(q.finado_projekto_tasko_json(projekto_itineroj_uuid,itineroj.front()['uuid_tasko'],id))
else:
Net.send_json(q.finado_projeko_json(projekto_uuid,id))
projekto_uuid = ''
Net.send_json(q.finado_projeko_json(projekto_itineroj_uuid,id))
projekto_itineroj_uuid = ''
projekto_mouse = true
malplenigi_itinero()
......@@ -278,7 +291,7 @@ func vojkomenco(): # нача́ло доро́ги
return 404
var q = QueryObject.new()
# отправляем на сервер маршрут
if !projekto_uuid:#если проекта нет, то создаём
if !projekto_itineroj_uuid:#если проекта нет, то создаём
# создание проекта с задачами идёт в два этапа:
# 1 - создаём запись проекта и получаем его uuid
# 2- создаём задачи к проекту после ответа сервера
......@@ -314,7 +327,7 @@ func vojkomenco(): # нача́ло доро́ги
Net.send_json(q.instalo_tasko_koord_json(
# если задача зарегистрирована на сервере, то мы должны передать её uuid
Global.direktebla_objekto[Global.realeco-2]['uuid'],
projekto_uuid,
projekto_itineroj_uuid,
Global.fenestro_kosmo.get_node("ship").translation.x, #kom_koordX
Global.fenestro_kosmo.get_node("ship").translation.y, #kom_koordY
Global.fenestro_kosmo.get_node("ship").translation.z, #kom_koordZ
......@@ -332,7 +345,7 @@ func vojkomenco(): # нача́ло доро́ги
# записав проект в базу, получили его uuid и теперь передаём на сервер его задачи
func taskoj_to_server(on_data):
projekto_uuid = on_data['redaktuUniversoProjekto']['universoProjekto']['uuid']
projekto_itineroj_uuid = on_data['redaktuUniversoProjekto']['universoProjekto']['uuid']
# теперь создаём задачу с координатами
var q = QueryObject.new()
var ship = Global.fenestro_kosmo.get_node("ship")
......@@ -345,7 +358,7 @@ func taskoj_to_server(on_data):
id_taskoj = Net.get_current_query_id()
Net.send_json(q.instalo_tasko_posedanto_koord(
ship.uuid,
projekto_uuid,
projekto_itineroj_uuid,
ship.translation.x, #kom_koordX
ship.translation.y, #kom_koordY
ship.translation.z, #kom_koordZ
......@@ -354,3 +367,145 @@ func taskoj_to_server(on_data):
))
# Добавить блокировку кнопок управления маршрутом
# редактировать маршрут
#добавить кругом содержание массива itineroj
#такие как
# transform, distance,
func sxangxi_itinero(projekto, tasko):
if !Global.fenestro_kosmo: # если космос не загружен, то и маршрут не загружаем
return false
var sxipo = Global.fenestro_kosmo.get_node("ship")
var nomo = ''
if sxipo.uuid != tasko['objekto']['uuid']:
nomo = tasko['objekto']['nomo']['enhavo']
var vector = Vector3(tasko['finKoordinatoX'],
tasko['finKoordinatoY'],
tasko['finKoordinatoZ'])
if projekto['uuid']==projekto_itineroj_uuid: # изменение по задаче в текущем проекте
var new_tasko = true # признак необходимости новой задачи
var pos = 0 # номер позиции в списке задач
for it in itineroj:# проходим по всем задачам
if tasko['uuid'] == it['uuid_tasko']: # нашли соответствующую задачу
new_tasko = false
if tasko['statuso']['objId']==Net.statuso_nova: # новая - в очередь выполнения
it['koordinatoX'] = tasko['finKoordinatoX']
it['koordinatoY'] = tasko['finKoordinatoY']
it['koordinatoZ'] = tasko['finKoordinatoZ']
elif tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
# задача должна быть первой в списке
if pos: # если не первая
itineroj.remove(pos)
itineroj.push_front({
'uuid_tasko':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'pozicio': tasko['pozicio'],
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
else:
it['koordinatoX'] = tasko['finKoordinatoX']
it['koordinatoY'] = tasko['finKoordinatoY']
it['koordinatoZ'] = tasko['finKoordinatoZ']
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
sxipo.rotate_start()
itinero_pause = false
elif tasko['statuso']['objId']==Net.statuso_fermo: # закрыта
#удаляем из списка
itineroj.remove(pos)
elif tasko['statuso']['objId']==Net.status_pauzo: # приостановлена
itinero_pause = true
pos += 1
if new_tasko: # добавляем новую задачу в проект
if tasko['statuso']['objId']==Net.statuso_nova: # новая - в очередь выполнения
# нужно выстроить по очерёдности
pass
pos = 0
var pozicio = false
for it in itineroj:# проходим по всем задачам и находим нужную позицию
if it['pozicio']>tasko['pozicio']: # вставляем перед данной записью
itineroj.insert(pos, {
'uuid_tasko':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
pozicio = true
break
pos += 1
if !pozicio: # позиция не найдены, добавляем в конце
itineroj.push_pop({
'uuid_tasko':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
elif tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
# задача должна быть первой в списке
itineroj.push_front({
'uuid_tasko':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
sxipo.rotate_start()
itinero_pause = false
elif tasko['statuso']['objId']==Net.status_pauzo: # приостановлена
itineroj.push_front({
'uuid_tasko':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
itinero_pause = true
else: # первая запись нового проекта
malplenigi_itinero()
projekto_itineroj_uuid = projekto['uuid']
itineroj.push_back({
'uuid_tasko':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': sxipo.translation.distance_to(vector)
})
if tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
sxipo.rotate_start()
itinero_pause = false
else:
itinero_pause = true
......@@ -15,7 +15,7 @@ func _input(event: InputEvent) -> void:
var celo = Transform(Basis.IDENTITY, camera.project_position(get_viewport().get_mouse_position(),z_away))
Global.fenestro_itinero.okazigi_itinero(
'', '', celo.origin.x, celo.origin.y, celo.origin.z,
celo, -1, Global.kategorio_movado, true
celo, -1, Net.kategorio_movado, true
)
if Input.is_action_just_pressed("right_click"):
......@@ -62,12 +62,12 @@ func go_kosmostacioj():
# закрываем проект
# добавляем запись в связи, что находимся внутри
var uuid_tasko = ''
if $"../ship".projekto_uuid:
uuid_tasko = Global.itineroj[0]['uuid_tasko']
if Global.fenestro_itinero.projekto_itineroj_uuid:
uuid_tasko = Global.fenestro_itinero.itineroj.front()['uuid_tasko']
var error = Title.get_node("request").request(q.URL_DATA,
Global.backend_headers,
true, 2, q.eniri_kosmostacio(
$"../ship".projekto_uuid,
Global.fenestro_itinero.projekto_itineroj_uuid,
uuid_tasko,
Global.objektoj[index_pos]['uuid']))
# Если запрос не выполнен из-за какой-то ошибки
......@@ -106,10 +106,7 @@ func _on_PopupMenu_index_pressed(index):
elif index == 3: # если выбрана стрельба по объекту
$"../ship/laser_gun".set_target(objekto)
elif index == 4: # взять в прицел
# если количество максимальных прицеливаний больше взятых в прицел, тогда берём в прицел
if ship.max_celilo>len(ship.celilo):
ship.set_celilo(objekto)
pass
ship.set_celilo(objekto)
else: # если выбрано движение к цели или добавление в маршрут
# вычисляем точку в пространстве, придвинутую на translacio ближе
# если станция, то дистанция больше
......@@ -133,7 +130,7 @@ func _on_PopupMenu_index_pressed(index):
celo.z,
Transform(Basis.IDENTITY, celo),
dist,
Global.kategorio_movado,
Net.kategorio_movado,
false
)
elif index==1: # добавление точки в маршрут
......@@ -145,6 +142,7 @@ func _on_PopupMenu_index_pressed(index):
celo.y,
celo.z,
Transform(Basis.IDENTITY, celo),
dist
dist,
Net.kategorio_movado
)
......@@ -242,8 +242,9 @@ func kubo_json(id=0):
'payload':{ 'query': 'subscription ($kuboj:[Int]!, $realeco:Int!, $kategorio:Int!)'+
'{ universoObjektoEventoj (kuboj: $kuboj, realeco:$realeco, kategorio: $kategorio) { evento '+
' objekto { uuid koordinatoX koordinatoY koordinatoZ} '+
' projekto {uuid} '+
' projekto {uuid kategorio {edges {node {objId }}}} '+
' tasko { uuid komKoordinatoX komKoordinatoY '+
" objekto{uuid nomo {enhavo}} " +
' komKoordinatoZ finKoordinatoX finKoordinatoY '+
' finKoordinatoZ pozicio statuso{objId} kategorio { '+
' edges { node { objId } } }} } '+
......
......@@ -33,7 +33,7 @@ func _physics_process(delta):
# если категория задачи равна категории движения объекта, тогда двигаемся
if !(Global.fenestro_itinero.itineroj.empty() or \
Global.fenestro_itinero.itinero_pause) and \
(Global.fenestro_itinero.itineroj.front()['kategorio']==Global.kategorio_movado): #Если цель существует, двигаемся
(Global.fenestro_itinero.itineroj.front()['kategorio']==Net.kategorio_movado): #Если цель существует, двигаемся
if !target_rot:
# print('target_rot = ',Global.fenestro_itinero.itineroj.front()['transform'].origin)
target_rot = Quat(transform.looking_at(Global.fenestro_itinero.itineroj.front()['transform'].origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
......@@ -41,7 +41,7 @@ func _physics_process(delta):
var target_dir = (Global.fenestro_itinero.itineroj.front()['transform'].origin - translation).normalized()
var distance = translation.distance_to(Global.fenestro_itinero.itineroj.front()['transform'].origin)
if (len (Global.fenestro_itinero.itineroj)>1) and \
(Global.fenestro_itinero.itineroj[1]['kategorio']==Global.kategorio_movado):
(Global.fenestro_itinero.itineroj[1]['kategorio']==Net.kategorio_movado):
# проверяем, если следующая точка является движением
if distance <1: #Если это не последняя точка, то мы не тормозим, так что завышаем расстояние, чтобы не проскочить эту точку
dec_route()
......
......@@ -52,7 +52,7 @@ func _on_data():
var index = id_projekto_direkt_del.find(int(on_data['id']))
# print('index=',index,' ::: ', typeof(index), " == ", typeof(on_data['id']))
if index > -1: # находится в списке удаляемых объектов
print('=== Удалили проект управляемого объекта')
# print('=== Удалили проект управляемого объекта')
# удаляем из списка
var idx_prj = 0 #индекс массива для удаления
for prj in Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']:
......@@ -64,10 +64,9 @@ func _on_data():
elif int(on_data['id']) == subscription_id:
# пришло сообщение, по какому объекту, в каком проекте, какая задача изменена
sxangxi_tasko(on_data['payload']['data'])
print('=== subscription_id ===',on_data)
Net.data_server.remove(i_data_server)
else:
print('on_data else=', on_data)
# else:
# print('on_data else=', on_data)
# elif on_data['payload']['data'].get('filteredUniversoObjekto'):
# pass
# Net.data_server.remove(i_data_server)
......@@ -92,22 +91,21 @@ func sxangxi_tasko(on_data):
# подписка на действие в кубе нахождения
func subscribtion_kubo():
var q = QueryObject.new()
subscription_id = Net.current_query_id
Net.current_query_id += 1
subscription_id = Net.get_current_query_id()
# Net.send_json(q.test_json(subscription_id))
Net.send_json(q.kubo_json(subscription_id))
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()
#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()
func has_signal(node, sgnl):
if node == null:
......@@ -119,34 +117,6 @@ func has_signal(node, sgnl):
return false
## записав проект в базу, получили его uuid
## warning-ignore:unused_argument
## warning-ignore:unused_argument
## warning-ignore:unused_argument
#func _on_http_projekto_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']['redaktuUniversoProjekto']['universoProjekto']
# var uuid = simpled_data['uuid']
# $"ship".projekto_uuid=uuid
# # теперь создаём задачу с координатами
# var q = QueryObject.new()
# 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
# $"http_taskoj".request(q.URL, Global.backend_headers, true, 2,
# q.instalo_tasko_posedanto_koord(
# $"ship".uuid, $"ship".projekto_uuid,
# $"ship".translation.x, #kom_koordX
# $"ship".translation.y, #kom_koordY
# $"ship".translation.z, #kom_koordZ
# Global.itineroj
# ))
# warning-ignore:unused_argument
# warning-ignore:unused_argument
# warning-ignore:unused_argument
......@@ -200,6 +170,9 @@ const base_ship = preload("res://blokoj/kosmosxipoj/scenoj/base_ship.tscn")
const espero = preload("res://blokoj/kosmostacioj/espero/espero_ekster.tscn")
const asteroido = preload("res://blokoj/asteroidoj/ast_1.tscn")
const AnalizoProjekto = preload("res://blokoj/kosmosxipoj/skriptoj/itineroj.gd")
# функция создания корабля
func create_ship(objecto):
var ship = null
......@@ -227,76 +200,11 @@ func _on_space_load_objektoj():
# и теперь по uuid нужно найти проект и задачу
var projektoj = Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']
var q = QueryObject.new()
if len(projektoj)>1:
print('нужно обнулить все проекты!!! должно быть на стороне сервера')
#нужно обнулить все проекты!!! должно быть на стороне сервера
for prj in projektoj:
var id = Net.current_query_id
Net.current_query_id += 1
id_projekto_direkt_del.push_back(id)
Net.send_json(q.finado_projeko_json(prj['node']['uuid'],id))
projektoj.clear()
if len(projektoj)>0:
if len(projektoj[0]['node']['tasko']['edges'])==0:
print('нужно закрыть проект!!!')
var id = Net.current_query_id
Net.current_query_id += 1
id_projekto_direkt_del.push_back(id)
Net.send_json(q.finado_projeko_json(projektoj[0]['node']['uuid'],id))
pass# нужно закрыть проект!!!
else:
# очищаем маршрут
Global.fenestro_itinero.malplenigi_itinero()
#заполняем маршрут
for tasko in projektoj[0]['node']['tasko']['edges']:
if tasko['node']['statuso']['objId']==2:#задачу, которая "В работе" ставим первой
Global.fenestro_itinero.add_itinero(
tasko['node']['uuid'],
'',
'координаты в космосе',
tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ'],
Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ'])),
$ship.translation.distance_to(Vector3(
tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ']
)))
break;
for tasko in projektoj[0]['node']['tasko']['edges']:
if tasko['node']['statuso']['objId']==1:# добавляем остальные задачи
Global.fenestro_itinero.add_itinero(
tasko['node']['uuid'],
'',
'координаты в космосе',
tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ'],
Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ'])),
$ship.translation.distance_to(Vector3(
tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ']
)))
if len(Global.fenestro_itinero.itineroj)>0:# есть задачи на полёт, устанавливаем uuid проекта
Global.fenestro_itinero.projekto_uuid=projektoj[0]['node']['uuid']
#отправляем корабль по координатам
Global.fenestro_itinero.itinero_pause = false
#запускаем таймер
$timer.start()
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero").disabled=true
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next").disabled=false
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin").disabled=false
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear").disabled=false
else:
Global.fenestro_itinero.projekto_uuid=''
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()
# создаём остальные объекты в космосе
for item in Global.objektoj:
if item['resurso']['objId'] == 1:#объект станция Espero
......@@ -320,32 +228,31 @@ func _on_space_load_objektoj():
item['rotaciaY'], item['rotaciaZ'])
# добавляем маршрут движения
projektoj = item['projekto']['edges']
if len(projektoj)==1:
s.projekto_itineroj=projektoj[0]['node']['uuid']
#заполняем маршрут
for tasko in projektoj[0]['node']['tasko']['edges']:
if tasko['node']['statuso']['objId']==2:#задачу, которая "В работе" ставим первой
# cam.point_of_interest.route.push_back(Transform(Basis.IDENTITY, cam.project_position(get_viewport().get_mouse_position(),z_away)))#Если кнопка нажата, то бросаем луч из камеры на глубину z_away и получаем точку, тут же устанавливаем новый вейпойнт с координатами
s.itineroj.push_front({
'uuid':tasko['node']['uuid'],
'koordinatoX':tasko['node']['finKoordinatoX'],
'koordinatoY':tasko['node']['finKoordinatoY'],
'koordinatoZ':tasko['node']['finKoordinatoZ'],
'pozicio': tasko['node']['pozicio']
})
break;
for tasko in projektoj[0]['node']['tasko']['edges']:
if tasko['node']['statuso']['objId']==1:# добавляем остальные задачи
# необходимо добавлять в порядке слодования задач
s.itineroj.push_back({
'uuid':tasko['node']['uuid'],
'koordinatoX':tasko['node']['finKoordinatoX'],
'koordinatoY':tasko['node']['finKoordinatoY'],
'koordinatoZ':tasko['node']['finKoordinatoZ'],
'pozicio': tasko['node']['pozicio']
})
s.set_route(s.itineroj.duplicate())
analizo.analizo_projekto(projektoj,s,s)
# if len(projektoj)==1:
# s.projekto_itineroj_uuid=projektoj.front()['node']['uuid']
# #заполняем маршрут
# for tasko in projektoj[0]['node']['tasko']['edges']:
# if tasko['node']['statuso']['objId']==2:#задачу, которая "В работе" ставим первой
# s.itineroj.push_front({
# 'uuid':tasko['node']['uuid'],
# 'koordinatoX':tasko['node']['finKoordinatoX'],
# 'koordinatoY':tasko['node']['finKoordinatoY'],
# 'koordinatoZ':tasko['node']['finKoordinatoZ'],
# 'pozicio': tasko['node']['pozicio']
# })
# break;
# for tasko in projektoj[0]['node']['tasko']['edges']:
# if tasko['node']['statuso']['objId']==1:# добавляем остальные задачи
# # необходимо добавлять в порядке слодования задач
# s.itineroj.push_back({
# 'uuid':tasko['node']['uuid'],
# 'koordinatoX':tasko['node']['finKoordinatoX'],
# 'koordinatoY':tasko['node']['finKoordinatoY'],
# 'koordinatoZ':tasko['node']['finKoordinatoZ'],
# 'pozicio': tasko['node']['pozicio']
# })
# s.set_route(s.itineroj.duplicate())
add_child(s)
s.add_to_group('create')
s.add_to_group('enemies')
......
[gd_scene load_steps=4 format=2]
[ext_resource path="res://blokoj/kosmo/skriptoj/ship.gd" type="Script" id=2]
[ext_resource path="res://blokoj/kosmosxipoj/skriptoj/base_ship.gd" type="Script" id=1]
[sub_resource type="CapsuleShape" id=1]
radius = 3.29615
......@@ -11,7 +11,7 @@ flags = 7
load_path = "res://.import/violet_frame.png-87830372cca8a5ac122306709e6d8376.s3tc.stex"
[node name="ship" type="KinematicBody"]
script = ExtResource( 2 )
script = ExtResource( 1 )
[node name="CollisionShape" type="CollisionShape" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.06553, 5.3188 )
......
......@@ -15,8 +15,10 @@ export (float) var speed_rotation = 3
export (Color, RGBA) var laser_color :Color = Color(1.0,0.0,0.0,1.0)
export var x_limiter: Vector2=Vector2(0.0,90.0)
export var y_limiter: Vector2=Vector2(-90.0,90.0)
var target = null
var target = null # ведём цель
var pafo = false # производим выстрел
var livero = false # произошел выстрел и запущена перезарядка
func _ready():
# target=get_parent().route #это потом удалить, здесь тестовое получение цели.
......@@ -69,8 +71,8 @@ func _physics_process(delta):
$laser/end_point.visible = true
$laser/beam.visible = true
else:
$laser/end_point.visible = true
$laser/beam.visible = true
$laser/end_point.visible = false
$laser/beam.visible = false
else:
$laser/end_point.visible = false
$laser/beam.visible = false
......
[gd_scene format=2]
[node name="Control" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="canonadi" type="CheckButton" parent="."]
anchor_left = 0.19
anchor_top = 0.705
anchor_right = 0.19
anchor_bottom = 0.705
margin_left = 111.08
margin_top = 61.4537
margin_right = 187.08
margin_bottom = 101.454
[node name="livero" type="ProgressBar" parent="canonadi"]
margin_left = 2.15845
margin_top = 47.4862
margin_right = 75.1584
margin_bottom = 64.4862
extends KinematicBody
export var Sensitivity_X: float = 0.01
export var Sensitivity_Y: float = 0.01
const ZOOM_MIN = 1
const ZOOM_MAX = 50
const Zoom_Step: float = 1.0
#const MIN_ROT_Y = -1.55 #(89 градусов)
#const MAX_ROT_Y = 0.79 #(45 градусов)
var max_speed =500.0
# текущая скорость
var current_speed =0
var acceleration = 1
var way_point: Vector3 = Vector3() # Координаты точки, в которую летим
var target_dir: Vector3 = Vector3.ZERO #направление на эту точку от текущей позиции корабля
var target_rot = null #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation = 1
var middle_mouse_pressed = false
var docking_rotation
var uuid #uuid активного корабля игрока
# взятые в прицел, массив объектов, взятых в прицел
var pafado # uuid проекта ведения огня
# далее нужно блок переменных переделывать на массивы !!!
var pafado_id # id запроса на создание проекта ведения огня
var pafado_celo # на какой объект отправили запрос на установку цели
var livero = false # произошел выстрел и запущена перезарядка
var celilo = []
var max_celilo = 1 # максимальное количество прицелов
var armiloj = [] # ссылка на оружие корабля
func _ready():
$CollisionShape.queue_free() # что бы в процессе редактирования не выдавало ошибку есть данная нода
# подключаем сигнал для обработки входящих данных
var err = Net.connect("input_data", self, "_on_data")
if err:
print('error = ',err)
func _physics_process(delta):
# если категория задачи равна категории движения объекта, тогда двигаемся
if !(Global.fenestro_itinero.itineroj.empty() or \
Global.fenestro_itinero.itinero_pause) and \
(Global.fenestro_itinero.itineroj.front()['kategorio']==Net.kategorio_movado): #Если цель существует, двигаемся
if !target_rot:
# print('target_rot = ',Global.fenestro_itinero.itineroj.front()['transform'].origin)
target_rot = Quat(transform.looking_at(Global.fenestro_itinero.itineroj.front()['transform'].origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
var target_dir = (Global.fenestro_itinero.itineroj.front()['transform'].origin - translation).normalized()
var distance = translation.distance_to(Global.fenestro_itinero.itineroj.front()['transform'].origin)
if (len (Global.fenestro_itinero.itineroj)>1) and \
(Global.fenestro_itinero.itineroj[1]['kategorio']==Net.kategorio_movado):
# проверяем, если следующая точка является движением
if distance <1: #Если это не последняя точка, то мы не тормозим, так что завышаем расстояние, чтобы не проскочить эту точку
dec_route()
return
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else:
if distance > max_speed*delta/acceleration:#Тут сомнительная формула от фонаря, вычисляющая примерно откуда надо начинать тормозить корабль.
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
var a = Quat(transform.basis)
var c = a.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
transform.basis = Basis(c)
# transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else: #Если это последняя точка, то мы тормозим, и задаём минимальное расстояние, чтобы точнее выставить корабль
current_speed = lerp(current_speed,50,delta*acceleration)#замедляемся
if Global.fenestro_itinero.itineroj.front()['transform'].basis !=Basis.IDENTITY:
transform.basis = transform.basis.slerp(Quat(Global.fenestro_itinero.itineroj.front()['transform'].basis),speed_rotation*delta*1.5) #поворачиваем в дефолтное состояние, чтобы сесть
if distance <0.01:
if Global.fenestro_itinero.itineroj.front()['transform'].basis !=Basis.IDENTITY:
transform.basis = Global.fenestro_itinero.itineroj.front()['transform'].basis
translation = Global.fenestro_itinero.itineroj.front()['transform'].origin
clear_route()
return
# warning-ignore:return_value_discarded
move_and_slide(target_dir*delta*current_speed) #Двигаемся к цели и тут можно передать transform на сервер
Title.get_node("CanvasLayer/UI/Objektoj/Window").distance_to(translation)
# вывод целей на экран
# if get_node_or_null('Control'):
if celilo.size()>0:
if livero:
$Control/kanonadi/livero.value = $Control/kanonadi/livero.value + 1
# else:
# $Control/celilo.set_visible(false)
# $Control/celilo/label.text = ''
func _on_data():
var i_data_server = 0
for on_data in Net.data_server:
if int(on_data['id']) == pafado_id:
# пришло сообщение, по созданию проекта стрельбы
pafado = on_data['payload']['data']['redaktuUniversoProjekto']['universoProjekto']['uuid']
send_celilo(pafado_celo)
pafado_id = null
Net.data_server.remove(i_data_server)
else:
print('on_data else=', on_data)
# elif on_data['payload']['data'].get('filteredUniversoObjekto'):
# pass
# Net.data_server.remove(i_data_server)
i_data_server += 1
const QueryObject = preload("queries.gd")
# устанавливаем цель
func set_celilo(celo):
# если количество максимальных прицеливаний больше взятых в прицел, тогда берём в прицел
if max_celilo<=len(celilo):
return false
if !celo.get('uuid'):
return false
celilo.append(celo)
$Control/celilo.set_visible(true)
$Control/celilo/label.text = celilo.front().uuid
get_node("laser_gun").set_target(celilo.front())
if pafado:
send_celilo(celo)
else:
var q = QueryObject.new()
pafado_id = Net.get_current_query_id()
pafado_celo = celo
Net.send_json(q.pafado_json(
Global.direktebla_objekto[Global.realeco-2]['uuid'],pafado_id
))
# создаём проект ведения огня
pass
# отправляем на сервер установку цели
func send_celilo(celo):
var q = QueryObject.new()
var id = Net.get_current_query_id()
Net.send_json(q.celilo_json(
pafado,
Global.direktebla_objekto[Global.realeco-2]['uuid'], # uuid объекта управления
Global.fenestro_kosmo.get_node("ship").translation.x, #kom_koordX
Global.fenestro_kosmo.get_node("ship").translation.y, #kom_koordY
Global.fenestro_kosmo.get_node("ship").translation.z, #kom_koordZ
celo.uuid,
celo.translation.x, #kom_koordX
celo.translation.y, #kom_koordY
celo.translation.z, #kom_koordZ
id
))
func rotate_start():# поворачиваем корабль носом по ходу движения
var front = Transform(Basis.IDENTITY, Vector3(Global.fenestro_itinero.itineroj.front()['koordinatoX'],
Global.fenestro_itinero.itineroj.front()['koordinatoY'],
Global.fenestro_itinero.itineroj.front()['koordinatoZ']))
target_rot = Quat(transform.looking_at(front.origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
func dec_route():
target_rot = null
Global.fenestro_itinero.malmultigi_unua()
rotate_start()
func clear_route():
target_rot = null
# достигли цели, закрываем проект
Global.fenestro_itinero.fermi_projekto_tasko()
func _on_kanonadi_pressed():
if celilo.size()>0:
if $Control/kanonadi.pressed:
# постановка цели
# get_node("laser_gun").set_target(celilo.front())
get_node("laser_gun").pafo = true
livero = true
# отправляем выстрел на сервер
else:
get_node("laser_gun").pafo = false
# get_node("laser_gun").set_target('')
else:
$Control/kanonadi.pressed = false
get_node("laser_gun").pafo = false
func _on_livero_value_changed(value):
if value == 20:
get_node("laser_gun").pafo = false
# get_node("laser_gun").set_target('')
elif value == 100:
livero = false
$Control/kanonadi/livero.value = 0
_on_kanonadi_pressed()
extends Node
# модуль создания маршрутов
# - движения
# - стрельбы
# анализируем (разбираем) проект с сервера и распределяем по соответствующим направлениям
# projektoj - массив проектов, пришедший с сервера
# sxipo - указатель на корабль, которому делаем
# fenestro_itinero - форма маршрута движения
func analizo_projekto(projektoj, sxipo, fenestro_itinero):
#проходим по списку проектов и распределяем по назначениям
var one_movado = false # признак, что проект движения уже был и следующий закрываем
var i_projektoj = 0
fenestro_itinero.projekto_itineroj_uuid=''
for prj in projektoj:
for kategorio in prj['node']['kategorio']['edges']:
# выбираем проекты с категорией движения
if kategorio['node']['objId'] == Net.kategorio_movado: # это проект движения
if one_movado:
# if 'send_fermi_projekto' in sxipo: # альтернативные записи
if sxipo.get('send_fermi_projekto'):
print('закрываем проект, т.к. проект движения уже есть!!! должно быть на стороне сервера')
sxipo.send_fermi_projekto(prj['node']['uuid'])
# удаляем данный проект из списка
projektoj.remove(i_projektoj)
else:
# проверяем, что есть действующие задачи движения, если нет - закрываем проект
if len(prj['node']['tasko']['edges'])==0:
if sxipo.get('send_fermi_projekto'):
print('закрываем проект, т.к. нет задач!!! должно быть на стороне сервера')
sxipo.send_fermi_projekto(prj['node']['uuid'])
# закрываем проект, т.к. нет задач!!! должно быть на стороне сервера
else:
# очищаем маршрут
fenestro_itinero.malplenigi_itinero()
#заполняем маршрут
# var pozicio = 0
for tasko in prj['node']['tasko']['edges']:
fenestro_itinero.sxangxi_itinero(prj['node'], tasko['node'])
#задачу, которая "В работе" ставим первой
# if tasko['node']['statuso']['objId']==Net.statuso_laboranta \
# or tasko['node']['statuso']['objId']==Net.status_pauzo: # или задачу, которая на "Паузе"
# fenestro_itinero.add_itinero(
# tasko['node']['uuid'],
# '',
# 'координаты в космосе',
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'],
# Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'])),
# $ship.translation.distance_to(Vector3(
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ']),
# Net.kategorio_movado
# ))
# if tasko['node']['statuso']['objId']==Net.status_pauzo:#задачу, которая "В работе" ставим первой
# Global.fenestro_itinero.itinero_pause = true
# break;
# for tasko in prj['node']['tasko']['edges']:
# if tasko['node']['statuso']['objId']==Net.statuso_nova:# добавляем остальные задачи
# Global.fenestro_itinero.add_itinero(
# tasko['node']['uuid'],
# '',
# 'координаты в космосе',
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'],
# Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'])),
# $ship.translation.distance_to(Vector3(
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ']),
# Net.kategorio_movado
# ))
# if len(Global.fenestro_itinero.itineroj)>0:# есть задачи на полёт, устанавливаем uuid проекта
# Global.fenestro_itinero.projekto_itineroj_uuid=prj['node']['uuid']
# #отправляем корабль по координатам
# Global.fenestro_itinero.itinero_pause = false
# #запускаем таймер
# $timer.start()
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero").disabled=true
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next").disabled=false
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin").disabled=false
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear").disabled=false
# one_movado = true
# else: # закрываемп проект, т.к. в нем нет действующих задач
# pass
i_projektoj += 1
extends Node
# модель сбора корабля
const base_cabine = preload("res://blokoj/kosmosxipoj/scenoj/moduloj/cabine.tscn")
......
extends Object
# Здесь будем хранить всё для запросов к бэкэнду по блоку "Космические корабли"
# создаём проект стрельбы на сервере
func pafado_json(objektoUuid, id):
var nomo = "Pafado"
var priskribo = "Pafado de objekto"
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
' $nomo:String, $priskribo:String, $statusoId:Int, '+
' $tipoPosedantoId:Int,'+
' $statusoPosedantoId:Int, $objektoUuid:String, '+
' $realecoId:Int ) '+
'{ redaktuUniversoProjekto ( '+
' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, '+
' posedantoTipoId:$tipoPosedantoId, '+
' objektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId ,'+
' realecoId:$realecoId ) '+
' { status message '+
' universoProjekto { uuid } } }',
'variables': {"tipoId":Net.projekto_tipo_objekto,
"kategorio": Net.projekto_kategorio_pafado,
"nomo": nomo,
"priskribo": priskribo, "statusoId": Net.statuso_laboranta,
"objektoUuid":objektoUuid, "statusoPosedantoId":Net.statuso_posedanto,
"tipoPosedantoId":Net.tipo_posedanto, "realecoId":Global.realeco} }})
# print('===pafado_json===',query)
return query
# отправляем создание задачи взятия в прицел на сервер
# uuidPafado - uuid проекта стрельбы, далее кто берёт в прицел, откуда, кого и по каким координатам
func celilo_json(uuidPafado, objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
uuidCelo, fin_koordX, fin_koordY, fin_koordZ, id):
var nomo = "Celilo"
var priskribo = "Celilo de objekto"
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
' $nomo:String, $priskribo:String, $statusoId:Int, $kom_koordX:Float, '+
' $kom_koordY:Float, $kom_koordZ:Float, $fin_koordX:Float, '+
' $fin_koordY:Float, $fin_koordZ:Float, $tipoPosedantoId:Int,'+
' $statusoPosedantoId:Int, $objektoUuid:String, '+
' $realecoId:Int, $projektoUuid:String, $uuidCelo:String) '+
'{ redaktuUniversoTaskoj ( '+
' projektoUuid:$projektoUuid' +
' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, komKoordinatoX:$kom_koordX,'+
' komKoordinatoY:$kom_koordY, komKoordinatoZ:$kom_koordZ, finKoordinatoX:$fin_koordX,'+
' finKoordinatoY:$fin_koordY, finKoordinatoZ:$fin_koordZ, posedantoTipoId:$tipoPosedantoId, '+
' posedantoObjektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId, '+
' realecoId:$realecoId, objektoUuid:$uuidCelo ) '+
' { status message '+
' universoTaskoj { uuid } } }',
'variables': {"tipoId":Net.projekto_tipo_objekto,
"kategorio": Net.projekto_kategorio_pafado,
"nomo": nomo,
"priskribo": priskribo, "statusoId": Net.statuso_laboranta,
"kom_koordX": kom_koordX, "kom_koordY": kom_koordY, "kom_koordZ": kom_koordZ,
"fin_koordX":fin_koordX,
"fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
"objektoUuid":objektoUuid, "statusoPosedantoId":Net.statuso_posedanto,
"tipoPosedantoId":Net.tipo_posedanto, "realecoId":Global.realeco,
"projektoUuid":uuidPafado, "uuidCelo":uuidCelo } }})
# print('===celilo_json===',query)
return query
# отправляем выстрел на сервер
# uuidPafado - uuid проекта стрельбы, далее кто стреляет (uuid лазера или другого оружия), откуда стреляет, в кого стреляет и куда стреляет
func pafo_json(uuidPafado, objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
uuidCelo, fin_koordX, fin_koordY, fin_koordZ, id):
var nomo = "Pafo"
var priskribo = "Pafo de objekto"
if !id:
id = Net.get_current_query_id()
# var query = JSON.print({
# 'type': 'start',
# 'id': '%s' % id,
# 'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
# ' $nomo:String, $priskribo:String, $statusoId:Int, $kom_koordX:Float, '+
# ' $kom_koordY:Float, $kom_koordZ:Float, $fin_koordX:Float, '+
# ' $fin_koordY:Float, $fin_koordZ:Float, $tipoPosedantoId:Int,'+
# ' $statusoPosedantoId:Int, $objektoUuid:String, '+
# ' $realecoId:Int ) '+
# '{ redaktuUniversoProjekto ( '+
# ' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
# ' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, komKoordinatoX:$kom_koordX,'+
# ' komKoordinatoY:$kom_koordY, komKoordinatoZ:$kom_koordZ, finKoordinatoX:$fin_koordX,'+
# ' finKoordinatoY:$fin_koordY, finKoordinatoZ:$fin_koordZ, posedantoTipoId:$tipoPosedantoId, '+
# ' objektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId ,'+
# ' realecoId:$realecoId ) '+
# ' { status message '+
# ' universoProjekto { uuid } } }',
# 'variables': {"tipoId":tipoId, "kategorio": kategorio, "nomo": nomo,
# "priskribo": priskribo, "statusoId": statusoId,
# "kom_koordX": kom_koordX, "kom_koordY": kom_koordY, "kom_koordZ": kom_koordZ,
# "fin_koordX":fin_koordX,
# "fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
# "objektoUuid":objektoUuid, "statusoPosedantoId":statusoPosedantoId,
# "tipoPosedantoId":tipoPosedantoId, "realecoId":Global.realeco} }})
# # print('===instalo_projekto===',query)
# return query
......@@ -20,7 +20,7 @@ var current_speed =0
# uuid проекта маршрута
var projekto_itineroj
var projekto_itineroj_uuid
#маршрут движения корабля
var itineroj = []
# uuid - uuid задачи
......@@ -30,14 +30,14 @@ var itineroj = []
# 'koordinatoY':
# 'koordinatoZ':
# pozicio - в какой позиции должна находится задача
var pause = false # корабль стоит на паузе
var itinero_pause = false # корабль стоит на паузе
func _ready():
$CollisionShape.queue_free()
func _physics_process(delta):
if !(itineroj.empty() or pause): #Если цель существует, двигаемся
if !(itineroj.empty() or itinero_pause): #Если цель существует, двигаемся
# print('летит объект = ',uuid)
var front = Transform(Basis.IDENTITY,Vector3(itineroj.front()['koordinatoX'],
itineroj.front()['koordinatoY'], itineroj.front()['koordinatoZ']))
......@@ -101,19 +101,48 @@ func add_route(route_array):
set_route(itineroj.duplicate())
# добавить точку маршрута
func add_itinero(uuid_tasko, uuid_celo, nomo, koordinatoX,
koordinatoY, koordinatoZ, transform, distance, kategorio,
pozicio):
itineroj.append({
'uuid_tasko':uuid_tasko,
'uuid_celo':uuid_celo,
'nomo':nomo,
'koordinatoX':koordinatoX,
'koordinatoY':koordinatoY,
'koordinatoZ':koordinatoZ,
'transform': transform,
'distance':distance,
'kategorio':kategorio,
'pozicio':pozicio
})
# очищаем маршрут
func malplenigi_itinero():
route_gone()
# редактировать маршрут
func sxangxi_itinero(projekto, tasko):
if projekto['uuid']==projekto_itineroj: # изменение по задаче в текущем проекте
var nomo = ''
# if (tasko['objekto']) and (uuid != tasko['objekto']['uuid']):
if uuid != tasko['objekto']['uuid']:
nomo = tasko['objekto']['nomo']['enhavo']
var vector = Vector3(tasko['finKoordinatoX'],
tasko['finKoordinatoY'],
tasko['finKoordinatoZ'])
if projekto['uuid']==projekto_itineroj_uuid: # изменение по задаче в текущем проекте
var new_tasko = true # признак необходимости новой задачи
var pos = 0 # номер позиции в списке задач
for it in itineroj:# проходим по всем задачам
if tasko['uuid'] == it['uuid']: # нашли соответствующую задачу
new_tasko = false
if tasko['statuso']['objId']==1: # новая - в очередь выполнения
if tasko['statuso']['objId']==Net.statuso_nova: # новая - в очередь выполнения
it['koordinatoX'] = tasko['finKoordinatoX']
it['koordinatoY'] = tasko['finKoordinatoY']
it['koordinatoZ'] = tasko['finKoordinatoZ']
elif tasko['statuso']['objId']==2: # в работе
elif tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
# задача должна быть первой в списке
if pos: # если не первая
itineroj.remove(pos)
......@@ -121,7 +150,13 @@ func sxangxi_itinero(projekto, tasko):
'uuid':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ']
'koordinatoZ':tasko['finKoordinatoZ'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'pozicio': tasko['pozicio'],
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
else:
it['koordinatoX'] = tasko['finKoordinatoX']
......@@ -129,27 +164,32 @@ func sxangxi_itinero(projekto, tasko):
it['koordinatoZ'] = tasko['finKoordinatoZ']
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
rotate_start()
pause = false
elif tasko['statuso']['objId']==4: # закрыта
itinero_pause = false
elif tasko['statuso']['objId']==Net.statuso_fermo: # закрыта
#удаляем из списка
itineroj.remove(pos)
elif tasko['statuso']['objId']==6: # приостановлена
pause = true
elif tasko['statuso']['objId']==Net.status_pauzo: # приостановлена
itinero_pause = true
pos += 1
if new_tasko: # добавляем новую задачу в проект
if tasko['statuso']['objId']==1: # новая - в очередь выполнения
if tasko['statuso']['objId']==Net.statuso_nova: # новая - в очередь выполнения
# нужно выстроить по очерёдности
pass
pos = 0
var pozicio = false
for it in itineroj:# проходим по всем задачам и находим нужную позицию
if itineroj['pozicio']>tasko['pozicio']: # вставляем перед данной записью
if it['pozicio']>tasko['pozicio']: # вставляем перед данной записью
itineroj.insert(pos, {
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
pozicio = true
break
......@@ -160,42 +200,62 @@ func sxangxi_itinero(projekto, tasko):
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
elif tasko['statuso']['objId']==2: # в работе
elif tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
# задача должна быть первой в списке
itineroj.push_front({
'uuid':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
rotate_start()
pause = false
elif tasko['statuso']['objId']==6: # приостановлена
itinero_pause = false
elif tasko['statuso']['objId']==Net.status_pauzo: # приостановлена
itineroj.push_front({
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
pause = true
itinero_pause = true
else: # первая запись нового проекта
route_gone()
projekto_itineroj = projekto['uuid']
projekto_itineroj_uuid = projekto['uuid']
itineroj.push_back({
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
'pozicio': tasko['pozicio'],
'uuid_celo':tasko['objekto']['uuid'],
'nomo': nomo,
'kategorio': tasko['kategorio']['edges'].front()['node']['objId'],
'transform': Transform(Basis.IDENTITY, vector),
'distance': translation.distance_to(vector)
})
if tasko['statuso']['objId']==2: # в работе
if tasko['statuso']['objId']==Net.statuso_laboranta: # в работе
rotate_start()
pause = false
itinero_pause = false
else:
pause = true
itinero_pause = true
......@@ -29,7 +29,7 @@ func _on_connection_success():
var q = QueryObject.new()
id_direktebla_query = Net.current_query_id
Net.current_query_id += 1
Net.send_json(q.get_direktebla_json(2, 3, 2, id_direktebla_query))
Net.send_json(q.get_direktebla_json(Net.statuso_laboranta, Net.tasko_tipo_objekto, id_direktebla_query))
# Обработчик сигнала "connection_failed"
......@@ -292,7 +292,7 @@ func load_objektoj(after=""):
var q = QueryObject.new()
id_objekto = Net.get_current_query_id()
# зугрузка объектов партиями, количество в партии указано в константе запроса
Net.send_json(q.get_objekto_json( 2, 3, 2, Global.kubo, id_objekto, after))
Net.send_json(q.get_objekto_json(Net.statuso_laboranta, Net.tasko_tipo_objekto, Global.kubo, id_objekto, after))
# $HTTPObjectoRequestFind.request(q.URL, Global.backend_headers, true, 2, q.objecto_query( 2, 3, 2, 1))
......
......@@ -10,23 +10,26 @@ const count_objekto = "10"
# запрос на список управляемых объектов для вебсокета
func get_direktebla_json(statusoId, kategorioId, tipoId, id=0):
func get_direktebla_json(statusoId, tipoId, id=0):
if !id:
id = Net.current_query_id
Net.current_query_id += 1
id = Net.get_current_query_id()
var statusoIdIn = String(Net.statuso_nova) + ', '+String(Net.statuso_laboranta) + ', '+String(Net.status_pauzo)
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload': {"query": "query ($UzantoId:Int, $statusoId:Float, "+
" $kategorioId:Float, $tipoId:Float)"+
" $tipoId:Float, $statusoIdIn:String)"+
"{ universoObjekto (" +
" universoobjektouzanto_Isnull:false,"+
" universoobjektouzanto_Autoro_SiriusoUzanto_Id:$UzantoId," +
") { edges { node { uuid " +
" projekto (statuso_Id: $statusoId, tipo_Id: $tipoId){ "+
" edges { node { uuid "+
" tasko (kategorio_Id:$kategorioId){ edges {node { "+
" kategorio {edges {node {objId nomo{enhavo}}}}" +
" tasko (statuso_Id_In:$statusoIdIn){ edges {node { "+
" uuid finKoordinatoX finKoordinatoY finKoordinatoZ "+
" objekto{uuid nomo {enhavo}} " +
" kategorio {edges {node {objId nomo{enhavo}}}}" +
" pozicio statuso {objId} } } } } } } "+
" nomo { enhavo } priskribo { enhavo } "+
" resurso { objId nomo { enhavo } priskribo { enhavo } "+
......@@ -49,7 +52,7 @@ func get_direktebla_json(statusoId, kategorioId, tipoId, id=0):
" posedantoUzanto{ siriusoUzanto{ objId}}}}}" +
" rotaciaX rotaciaY rotaciaZ } } } }",
'variables': {"statusoId":statusoId,
"kategorioId":kategorioId, "tipoId":tipoId,
"tipoId":tipoId, "statusoIdIn":statusoIdIn,
"UzantoId":Global.id} } })
# print("=== get_direktebla_query = ",query)
......@@ -59,8 +62,7 @@ func get_direktebla_json(statusoId, kategorioId, tipoId, id=0):
# запрос на список управляемых объектов в космосе
func get_direktebla_kosmo_json(id=0):
if !id:
id = Net.current_query_id
Net.current_query_id += 1
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
......@@ -78,7 +80,7 @@ func get_direktebla_kosmo_json(id=0):
# задаём координаты и угол поворота объекту, удаляем связь по нахождению внутри
func go_objekt_kosmo_query(uuid, koordX, koordY, koordZ, rotaciaX, rotaciaY, rotaciaZ, uuid_ligilo_del, kuboId=1):
func go_objekt_kosmo_query(uuid, koordX, koordY, koordZ, rotaciaX, rotaciaY, rotaciaZ, uuid_ligilo_del, kuboId=Global.kubo):
var del = ''
if uuid_ligilo_del:
del = ' redaktuUniversoObjektoLigiloj (uuid: "'+uuid_ligilo_del+'",'
......@@ -128,25 +130,32 @@ func eniri_kosmostacio(projekto_uuid, tasko_uuid, station_uuid):
# Запрос к API, выбираем объекты, которые в космосе
# statusoId - статус проекта (2=в работе)
# kategorioId - категория задач Универсо (3 - Движение объектов)
# tipoId - тип проекта Универсо (2 - Для объектов)
func get_objekto_json(statusoId, kategorioId, tipoId, kuboId=1, id=0, after=""):
func get_objekto_json(statusoId, tipoId, kuboId=Global.kubo, id=0, after=""):
if !id:
id = Net.current_query_id
Net.current_query_id += 1
id = Net.get_current_query_id()
var statusoIdIn = String(Net.statuso_nova) + ', '+String(Net.statuso_laboranta) + ', '+String(Net.status_pauzo)
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ "query": "query ($kuboId:Float, $statusoId:Float, "+
" $realecoId:Float, $kategorioId:Float, $tipoId:Float) " +
" $realecoId:Float, $tipoId:Float, $statusoIdIn: String) " +
"{ filteredUniversoObjekto (realeco_Id:$realecoId, kubo_Id: $kuboId, "+
" koordinatoX_Isnull:false, koordinatoY_Isnull:false, koordinatoZ_Isnull:false," +
" first:"+count_objekto+', after: "'+after+'" ' +
" ) { pageInfo { hasNextPage endCursor } edges { node { uuid posedantoId "+
# проект стрельбы с задачами прицеливания и ведения огня
# проект движени
# " projekto (statuso_Id: $statusoId, tipo_Id: $tipoId, "+
# " kategorio_Id:$kategorioMovado){ "+
" projekto (statuso_Id: $statusoId, tipo_Id: $tipoId){ "+
" edges { node { uuid "+
" tasko (kategorio_Id:$kategorioId){ edges {node { "+
" kategorio {edges {node {objId nomo{enhavo}}}}" +
" tasko (statuso_Id_In: $statusoIdIn){ edges {node { "+
" uuid finKoordinatoX finKoordinatoY finKoordinatoZ "+
" objekto{uuid nomo {enhavo}} " +
" kategorio {edges {node {objId nomo{enhavo}}}}" +
" pozicio statuso {objId} } } } } } } "+
" nomo { enhavo } priskribo { enhavo } "+
" resurso { objId nomo { enhavo } priskribo { enhavo } "+
......@@ -167,7 +176,7 @@ func get_objekto_json(statusoId, kategorioId, tipoId, kuboId=1, id=0, after=""):
" posedantoUzanto{ siriusoUzanto{ objId}}}}}" +
" rotaciaX rotaciaY rotaciaZ } } } }",
'variables': {"kuboId":kuboId, "statusoId":statusoId,
"kategorioId":kategorioId, "tipoId":tipoId,
"tipoId":tipoId, "statusoIdIn":statusoIdIn,
"realecoId":Global.realeco} } })
# print('===objecto_json=',query)
return query
......
extends Node
# настройки по справочнику
# категория движения объекта
var kategorio_movado = 3
# Залогинен или нет
var status = false
# id пользователя в бэкэнде
......
......@@ -42,38 +42,6 @@ func _on_kosmo_pressed():
# вход в ближайшую станцию (задача - вычислить её в списке объектов)
func go_kosmostacioj():
# Разрегистрируем обработчик сигнала request_completed (вызывается
# по завершении HTTPRequest)
# Title.get_node("request").connect('request_completed', Title, '_on_eniri_kosmostacio_request_completed')
# var q = QueryObject.new()
# # закрываем проект
# # добавляем запись в связи, что находимся внутри
# var uuid_tasko = ''
# if $"../ship".projekto_uuid:
# uuid_tasko = Global.itineroj[0]['uuid_tasko']
# var error = Title.get_node("request").request(q.URL_DATA,
# Global.backend_headers,
# true, 2, q.eniri_kosmostacio(
# $"../ship".projekto_uuid,
# uuid_tasko,
# Global.objektoj[index_pos]['uuid']))
# # Если запрос не выполнен из-за какой-то ошибки
# # TODO: Такие ошибки наверное нужно как-то выводить пользователю?
# if error != OK:
# print('Error in GET (_on_eniri_kosmostacio_request_completed) Request.')
# # добавляем в данные пользователя о станции для последующего выхода
# if !Global.direktebla_objekto[Global.realeco-2].get('ligiloLigilo'):
# Global.direktebla_objekto[Global.realeco-2]['ligiloLigilo'] = {'edges':[]}
# Global.direktebla_objekto[Global.realeco-2]['ligiloLigilo']['edges'].append({
# 'node': {'posedanto': {'koordinatoX' : Global.objektoj[index_pos]['koordinatoX'],
# 'koordinatoY' : Global.objektoj[index_pos]['koordinatoY'],
# 'koordinatoZ' : Global.objektoj[index_pos]['koordinatoZ'],
# 'kubo': {'objId' : Global.kubo},},
# 'uuid' : Global.objektoj[index_pos]['uuid']},})
# Title.CloseWindow()
# Global.direktebla_objekto[Global.realeco-2]['kosmo'] = false
# # вызываем сцену станции
# get_tree().change_scene('res://blokoj/kosmostacioj/CapKosmostacio.tscn')
pass
func go_kosmo():
......
......@@ -11,6 +11,23 @@ signal server_disconnected()
signal input_data()
# настройки по справочнику
# константы соответствия категорий, статусов и т.п.
# категории задач:
const kategorio_movado = 3 # категория движения объекта
const tasko_kategorio_celilo = 6 # категория задачи прицеливания
const tasko_kategorio_pafo = 7 # категория задачи выстрела
const projekto_kategorio_pafado = 6 # категория проекта стрельбы (включает задачи прицеливания и выстрела)
const projekto_tipo_objekto = 2 # тип проектов "Для объектов"
const tasko_tipo_objekto = 2 # тип задач "Для объектов"
const statuso_nova = 1 # статус "Новый"
const statuso_laboranta = 2 # статус "В работе"
const statuso_fermo = 4 # статус "Закрыт"
const status_pauzo = 6 # статус "Приостановлен"
const statuso_posedanto = 1 # статус владельца "Активный"
const tipo_posedanto = 1 # тип владения "Полное владение"
# пришедшие данные с сервера
var data_server = []
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать