Коммит 01e9d39b создал по автору Vladimir levadnij's avatar Vladimir levadnij
Просмотр файлов

Merge branch 'develop' into 'master'

Формирование релиза проекта версии 0.8.0-alfo

See merge request tehnokom/universo!186
владельцы fa3ef46e 5d3b30da
extends Control
# uuid выполняемого проекта
var projekto_itineroj_uuid
var projekto_mouse # проект запущен мышкой
# если маршрут создаётся списком, то это новый проект
# если мышкой по космосу после мышки - меняем задачу на новую в том же проекте
# если мышкой по космосу после проекта (несколько задач в списке), то закрываем проект и открываем новый проект
# маршрут движения управляемого объекта (список проектов с задачей маршрута)
var itineroj = []
#uuid_tasko - uuid задачи, когда уже летим
#uuid_celo - uuid цели полёта, если это объект
#nomo - название объекта цели
# координаты цели полёта
# 'koordinatoX':
# 'koordinatoY':
# 'koordinatoZ':
# distance - расстояние до цели полёта
# pozicio - в какой позиции должна находится задача
# transform - transform координат цели движения (лучше высчитать один раз при добавлении)
# kategorio - категория задачи объекта
# маршрут стоит на паузе
var itinero_pause = true
# запросы по задачам/проектам
const QueryObject = preload("../skriptoj/queries.gd")
# список id запросов, отправленных на сервер
var id_projekto # id запроса по созданию проекта
var id_taskoj # id запроса на список задач
var id_tasko # id запроса на одну задачу
func _ready():
Global.fenestro_itinero = self
# подключаем сигнал для обработки входящих данных
var err = Net.connect("input_data", self, "_on_data")
if err:
print('error = ',err)
func _on_data():
var i_data_server = 0
for on_data in Net.data_server:
if int(on_data['id']) == id_projekto:
# запустили новый проект
taskoj_to_server(on_data['payload']['data'])
Net.data_server.remove(i_data_server)
id_projekto = 0
elif int(on_data['id']) == id_taskoj:
# присвоить uuid задачам после ответа
# uuid соответственно переданным задачам - по порядку
var i = 0
for datoj in on_data['payload']['data']['redaktuKreiUniversoTaskojPosedanto']['universoTaskoj']:
itineroj[i]['uuid_tasko'] = datoj['uuid']
i += 1
id_taskoj = 0
Net.data_server.remove(i_data_server)
elif int(on_data['id']) == id_tasko:
itineroj.front()['uuid_tasko'] = on_data['payload']['data']['redaktuUniversoTaskoj']['universoTaskoj']['uuid']
id_tasko = 0
Net.data_server.remove(i_data_server)
i_data_server += 1
var step = 0 #шаг времени для обновления расстояния
func _physics_process(delta):
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():
......@@ -19,107 +88,417 @@ func _drag(event: InputEvent) -> void:
$canvas/MarginContainer.rect_position += event.relative
func FillItemList():
# очистить список маршрута в окне маршрута
func purigi_fenestro():
$"canvas/MarginContainer/VBoxContainer/ItemList".clear()
# Заполняет список найдеными продуктами
for Item in Global.itineroj:
# вывести на экран окна весь список маршрута с предварительным очищением окна
func FillItemList():
purigi_fenestro()
# Заполняет список маршрутом
for Item in itineroj:
get_node("canvas/MarginContainer/VBoxContainer/ItemList").add_item('('+String(int(Item['distance']))+') '+Item['nomo'], null, true)
#пересчет дистанции до объектов в списке
func distance_to(trans):
for obj in Global.itineroj:
for obj in itineroj:
obj['distance'] = trans.distance_to(Vector3(obj['koordinatoX'],
obj['koordinatoY'],obj['koordinatoZ']))
$'canvas/MarginContainer/VBoxContainer/ItemList'.clear()
FillItemList()
#отправляем корабль в полёт
func go_ship():
if len(Global.itineroj)==0:
return 404
if Global.fenestro_kosmo:
var position = Vector3(Global.itineroj[0]['koordinatoX'],Global.itineroj[0]['koordinatoY'],Global.itineroj[0]['koordinatoZ'])
Global.fenestro_kosmo.get_node("ship").set_way_point(position,null)
Global.fenestro_kosmo.get_node("way_point").set_way_point(position)
# начинаем маршрут
func komenci_itinero():
if Global.fenestro_kosmo:
Global.fenestro_kosmo.get_node("ship").vojkomenco()#начинаем движение
# отправляем в полёт
go_ship()
#запускаем таймер
Global.fenestro_kosmo.get_node("timer").start()
$canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero.disabled=true
vojkomenco()#начинаем движение
if !itinero_pause:
#запускаем таймер
Global.fenestro_kosmo.get_node("timer").start()
$canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero.disabled=true
# начинаем лететь
func _on_kom_itinero_pressed():
if Global.fenestro_kosmo:
#остановить текущие задачи
# останавливаем таймер передачи данных на сервер
Global.fenestro_kosmo.get_node("timer").stop()
#отправка последних координат и закрытие задачи с проектом
Global.fenestro_kosmo.get_node("ship").finofara_flugo()
projekto_mouse = false # проект не по мышке
#создать проект
#создать список задач на основе списка itineroj
komenci_itinero()
func add_itinero(uuid_tasko, uuid, nomo, koordX, koordY, koordZ, distance):
Global.itineroj.append({
# ткнули мышкой в космосе, отправились к точке в космосе
# отправили к конкретному объекту mouse=false
# добавить задачу в маршрут, а при отсутствии проекта - создать маршрут из одной точки
func okazigi_itinero(uuid_celo, nomo, koordinatoX, koordinatoY,
koordinatoZ, transform, distance, kategorio, mouse):
# kategorio=Net.kategorio_movado
if len(itineroj)>1:
fermi_projekto_tasko()
elif len(itineroj)>0:
malmultigi_unua(mouse)
if !transform:
transform = Transform(Basis.IDENTITY, Vector3(koordinatoX,
koordinatoY, koordinatoZ))
if (distance == -1) and (Global.fenestro_kosmo):
distance = Global.fenestro_kosmo.get_node("ship").translation.distance_to(Vector3(koordinatoX,
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, -1)
if itinero_pause:
itinero_pause = false
vojkomenco()
# добавить точку маршрута
func add_itinero(uuid_tasko, uuid_celo, nomo, koordinatoX,
koordinatoY, koordinatoZ, transform, distance, kategorio,
pozicio):
itineroj.append({
'uuid_tasko':uuid_tasko,
'uuid':uuid,
'uuid_celo':uuid_celo,
'nomo':nomo,
'koordinatoX':koordX,
'koordinatoY':koordY,
'koordinatoZ':koordZ,
'koordinatoX':koordinatoX,
'koordinatoY':koordinatoY,
'koordinatoZ':koordinatoZ,
'transform': transform,
'distance':distance,
'kategorio':kategorio,
'pozicio':pozicio
})
FillItemList()
get_node("canvas/MarginContainer/VBoxContainer/ItemList").add_item('('+String(int(distance))+') '+nomo, null, true)
# удаляем первую точку маршрута (выполнена)
# mouse - движение по мышке
func malmultigi_unua(mouse = false): # уменьшить первый
# если первая точка задача с uuid - закрываем её
# ставим задачу в "Закрыта" (Статус = 4)
if itineroj.front()['uuid_tasko']:
var q = QueryObject.new()
var id = Net.get_current_query_id()
Global.fenestro_kosmo.id_net.push_back(id)
Net.send_json(q.finado_tasko(itineroj.front()['uuid_tasko'],Net.statuso_fermo,id))
itineroj.pop_front()
# а если это движение по мышке?? что бы продолжить тот же проект
if mouse and projekto_mouse:
FillItemList()
elif len(itineroj)==0:# если была последняя точка, то закрываем проект
fermi_projekto()
else:
FillItemList()
# отправляем на сервер закрытие проекта
func send_fermi_projekto(projekto_uuid):
var q = QueryObject.new()
var id = Net.get_current_query_id()
Global.fenestro_kosmo.id_net.push_back(id)
Net.send_json(q.finado_projeko_json(projekto_uuid,id))
func clear_itinero():
Global.itineroj.clear()
# закрываем проект
func fermi_projekto():
if projekto_itineroj_uuid:
send_fermi_projekto(projekto_itineroj_uuid)
projekto_itineroj_uuid = ''
projekto_mouse = true
malplenigi_itinero()
# закрываем проект и первую (текущую) задачу
func fermi_projekto_tasko():
if projekto_itineroj_uuid:
var q = QueryObject.new()
var id = Net.get_current_query_id()
Global.fenestro_kosmo.id_net.push_back(id)
if itineroj.front()['uuid_tasko']:
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_itineroj_uuid,id))
projekto_itineroj_uuid = ''
projekto_mouse = true
malplenigi_itinero()
# очищаем маршрут clear_itinero
func malplenigi_itinero():
itineroj.clear()
itinero_pause = true
FillItemList()
# приводим кнопки в исходное состояние
Global.fenestro_kosmo.get_node("timer").stop()
$canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero.disabled=false
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next.disabled=true
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.disabled=true
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear.disabled=true
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.text='Пауза'
# поставить на паузу или отправить дальше
func _on_itinero_fin_pressed():
if Global.fenestro_kosmo:
#если в полёте
if $canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero.disabled:
if $canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.text=='Пауза':
if !itinero_pause:
#останавливаем движение корабля
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.text='Далее'
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next.disabled=true
Global.fenestro_kosmo.get_node("ship").clear_way_point()
Global.fenestro_kosmo.get_node("way_point").set_active(false)
itinero_pause = true
else:
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.text='Пауза'
#продолжаем движение корабля
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next.disabled=false
go_ship()
# itinero_clear
itinero_pause = false
# кнопка сброса маршрута
func _on_itinero_clear_pressed():
if len(Global.itineroj)==0:
projekto_mouse = true
if len(itineroj)==0:
return 404
if Global.fenestro_kosmo:
#закрыть все задачи и проект
#удаляем все задачи далее первой
Global.itineroj = [Global.itineroj[0],]
#закрываем текущую задачу и проект автоматически закрывается
Global.fenestro_kosmo.get_node("ship").clear_way_point()
Global.fenestro_kosmo.get_node("way_point").set_active(false)
Global.fenestro_kosmo.get_node("timer").stop()
Global.fenestro_kosmo.get_node("ship").finofara_flugo()
$canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero.disabled=false
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next.disabled=true
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin.disabled=true
$canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear.disabled=true
fermi_projekto_tasko()
# пропустить текущую цель и лететь к следующей
func _on_itinero_next_pressed():
if Global.fenestro_kosmo:
Global.fenestro_kosmo.get_node("ship").clear_way_point()
Global.fenestro_kosmo.get_node("way_point").set_active(false)
Global.fenestro_kosmo.get_node("timer").stop()
Global.fenestro_kosmo.get_node("ship").finofara_flugo()
# закрываем текущую задачу
malmultigi_unua()
# переводим следующую задачу в работу
vojkomenco()
#передача данных на сервер при отправке корабля по первой цели
func vojkomenco(): # нача́ло доро́ги
if len(itineroj)==0:
return 404
var q = QueryObject.new()
# отправляем на сервер маршрут
if !projekto_itineroj_uuid:#если проекта нет, то создаём
# создание проекта с задачами идёт в два этапа:
# 1 - создаём запись проекта и получаем его uuid
# 2- создаём задачи к проекту после ответа сервера
# цель маршрута берём из itineroj
id_projekto = Net.get_current_query_id()
var count_itineroj=len(itineroj)-1
Net.send_json(q.instalo_projekto_json(
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
itineroj[count_itineroj]['koordinatoX'], #fin_koordX
itineroj[count_itineroj]['koordinatoY'], #fin_koordY
itineroj[count_itineroj]['koordinatoZ'], #fin_koordZ
id_projekto
))
else:#проект есть, изменяем задачу
# изменяем цель проекта
var id = Net.get_current_query_id()
if itineroj.front()['uuid_tasko']: # если есть uuid задачи
Net.send_json(q.instalo_tasko_uuid_koord_json(
# если задача зарегистрирована на сервере, то мы должны передать её uuid
itineroj.front()['uuid_tasko'],
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
2, # берём в работу
id
))
else: #создаём новую задачу
id_tasko = id
itineroj.front()['uuid_tasko'] = id_tasko
Net.send_json(q.instalo_tasko_koord_json(
# если задача зарегистрирована на сервере, то мы должны передать её uuid
Global.direktebla_objekto[Global.realeco-2]['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
itineroj.front()['koordinatoX'], #fin_koordX
itineroj.front()['koordinatoY'], #fin_koordY
itineroj.front()['koordinatoZ'], #fin_koordZ
id_tasko
))
itinero_pause = false
get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero").disabled=true
get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next").disabled=false
get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin").disabled=false
get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear").disabled=false
# записав проект в базу, получили его uuid и теперь передаём на сервер его задачи
func taskoj_to_server(on_data):
projekto_itineroj_uuid = on_data['redaktuUniversoProjekto']['universoProjekto']['uuid']
# теперь создаём задачу с координатами
var q = QueryObject.new()
var ship = Global.fenestro_kosmo.get_node("ship")
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
id_taskoj = Net.get_current_query_id()
Net.send_json(q.instalo_tasko_posedanto_koord(
ship.uuid,
projekto_itineroj_uuid,
ship.translation.x, #kom_koordX
ship.translation.y, #kom_koordY
ship.translation.z, #kom_koordZ
itineroj,
id_taskoj
))
# Добавить блокировку кнопок управления маршрутом
# редактировать маршрут
#добавить кругом содержание массива 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
extends Camera
var point_of_interest# к чему привязать камеру
var choose = false # привязать или отвязать камеру
var right_click_mode: bool= false
export var enabled = true setget set_enabled
export(int, "Visible", "Hidden", "Captured, Confined") var mouse_mode = 2
......@@ -22,7 +26,7 @@ export var distance_step: float = 2.0
# Movement settings
export (float, 0.0, 1.0) var acceleration = 0.1
export (float, 0.0, 0.0, 1.0) var deceleration = 0.1
export var max_speed = Vector3(1.0, 1.0, 1.0)
export var max_speed = Vector3(100.0, 100.0, 100.0)
export var local = true
# Intern variables.
......@@ -49,34 +53,40 @@ func _ready():
event.unicode = s
event.unicode = d
#
Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED)
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
#func _input(event):
func _unhandled_input(event):
if freelook:
if Input.get_action_strength("right_click"):
if Input.is_action_just_pressed("right_click"):
right_click_mode = true;
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if Input.is_action_just_released("right_click"):
right_click_mode = false;
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if right_click_mode:
if event is InputEventMouseMotion:
_mouse_offset = event.relative
if Input.is_action_just_pressed("ui_select"):
choose=!choose
if choose:
set_privot(point_of_interest)
else:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
set_privot(null)
func _input(event):
if privot:
if event.is_action_pressed("wheel_down"):
distance-=distance_step
if event.is_action_pressed("wheel_up"):
distance += distance_step
distance += (Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")) * distance_step * 0.5
distance = clamp(distance,distance_min,distance_max)
else:
_direction.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
_direction.y = Input.get_action_strength("ui_page_up") - Input.get_action_strength("ui_page_down")
_direction.z = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
func _physics_process(delta):
collide()
if privot:
distance += (Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")) * distance_step * 0.1
distance = clamp(distance,distance_min,distance_max)
distance_smooth =lerp(distance_smooth,distance,0.05)
set_translation(privot.get_translation())
translate_object_local(Vector3(0.0, 0.0, distance_smooth))
......@@ -114,6 +124,12 @@ func collide():
_direction.z =-2
func _update_movement(delta):
if !privot:
_direction.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
_direction.y = Input.get_action_strength("ui_page_up") - Input.get_action_strength("ui_page_down")
_direction.z = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
else:
_direction = Vector3.ZERO
var offset = max_speed * acceleration * _direction
_speed.x = clamp(_speed.x + offset.x, -max_speed.x, max_speed.x)
......@@ -135,12 +151,12 @@ func _update_movement(delta):
# warning-ignore:unused_argument
func _update_rotation(delta):
if privot:
_mouse_offset.x -= Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
_mouse_offset.y += Input.get_action_strength("ui_page_up") - Input.get_action_strength("ui_page_down")
var offset = Vector2();
offset += _mouse_offset * sensitivity
_mouse_offset = Vector2()
_yaw = _yaw * smoothness + offset.x * (1.0 - smoothness)
_pitch = _pitch * smoothness + offset.y * (1.0 - smoothness)
......@@ -154,6 +170,9 @@ func _update_rotation(delta):
rotate_y(deg2rad(-_yaw))
rotate_object_local(Vector3(1,0,0), deg2rad(-_pitch))
func set_point_of_interest(ship):
point_of_interest = ship
func set_privot(value):
privot = value
if privot:
......
extends Control
onready var margin = $"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer"
onready var window = $"/root/Title/CanvasLayer/UI/Objektoj/Window"
onready var margin = $"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox"
var camera #камера
export var z_away = 100 # насколько глубоко\далеко будет точка пути от экрана
var index_pos = 0
func _input(event: InputEvent) -> void:
if Input.is_action_just_pressed("left_click"):
if event is InputEventMouseButton and event.doubleclick:
#Если кнопка нажата, то бросаем луч из камеры на глубину z_away и получаем точку, тут же устанавливаем новый вейпойнт с координатами
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, Net.kategorio_movado, true
)
if Input.is_action_just_pressed("right_click"):
# event.pressed=true
if event is InputEventMouseButton and $"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer".visible:
if event is InputEventMouseButton and $"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox".visible:
$canvas/PopupMenu.set_item_disabled(2,true)
# $canvas/PopupMenu.mouse_filter=2
var x = $".".get_global_mouse_position().x
var y = $".".get_global_mouse_position().y
if (margin.margin_top<y) and (y<margin.margin_bottom) and (margin.margin_left<x) and (x<margin.margin_right):
var mrg = margin
if (margin.margin_top+window.rect_global_position.y<y) and \
(y<margin.margin_bottom+window.rect_global_position.y) and \
(margin.margin_left+window.rect_global_position.x<x) and \
(x<margin.margin_right+window.rect_global_position.x):
$canvas/PopupMenu.margin_left=x
$canvas/PopupMenu.margin_top=y
$canvas/PopupMenu.visible=true
# #если пункт меню - станция
x = $"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer/VBoxContainer/scroll/ItemList".get_local_mouse_position().x
y = $"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer/VBoxContainer/scroll/ItemList".get_local_mouse_position().y
index_pos = $"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer/VBoxContainer/scroll/ItemList".get_item_at_position(Vector2(x,y),true)
$"/root/Title/CanvasLayer/UI/Objektoj/Window/canvas/MarginContainer/VBoxContainer/scroll/ItemList".select(index_pos)
x = $"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox/body_texture/ItemList".get_local_mouse_position().x
y = $"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox/body_texture/ItemList".get_local_mouse_position().y
index_pos = $"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox/body_texture/ItemList".get_item_at_position(Vector2(x,y),true)
$"/root/Title/CanvasLayer/UI/Objektoj/Window/VBox/body_texture/ItemList".select(index_pos)
if Global.objektoj[index_pos]['resurso']['objId'] == 1:#объект станция Espero
#проверяем как далеко от станции и если менее 20, то разрешаем войти
var dist = $"../ship".translation.distance_to(Vector3(
......@@ -33,6 +49,7 @@ func _input(event: InputEvent) -> void:
$canvas/PopupMenu.set_item_disabled(2,false)
# сдвиг по всем координатам по целеполаганию полёта к объекту
const translacio = 20
const translacio_stat = 300
......@@ -49,12 +66,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']))
# Если запрос не выполнен из-за какой-то ошибки
......@@ -77,19 +94,23 @@ func go_kosmostacioj():
get_tree().change_scene('res://blokoj/kosmostacioj/CapKosmostacio.tscn')
# выбрали позицию в меню
func _on_PopupMenu_index_pressed(index):
var ship = $"../".get_node("ship")
var objekto
# вычисляем объект в космосе
# проходим по всем созданным объектам в космосе и находим нужный по uuid
for child in $"../".get_children():
if child.is_in_group('create'):
if child.uuid == Global.objektoj[index_pos]['uuid']:
objekto = child
break
if index == 2: # если выбран вход в станцию
go_kosmostacioj()
elif index == 3: # если выбрана стрельба по объекту
# вычисляем объект в космосе
# проходим по всем созданным объектам в космосе и находим нужный по uuid
for child in $"../".get_children():
if child.is_in_group('create'):
if child.uuid == Global.objektoj[index_pos]['uuid']:
# for ch in $"../ship/CollisionShape".get_children():
# print('==',ch.name)
# $"../ship/CollisionShape/laser_gun".set_target(child.get_global_transform())
$"../ship/laser_gun".set_target(child)
$"../ship/laser_gun".set_target(objekto)
elif index == 4: # взять в прицел
ship.set_celilo(objekto)
else: # если выбрано движение к цели или добавление в маршрут
# вычисляем точку в пространстве, придвинутую на translacio ближе
# если станция, то дистанция больше
......@@ -104,23 +125,29 @@ func _on_PopupMenu_index_pressed(index):
dist = $"../ship".translation.distance_to(celo) - translacio
var speed = celo - $"../ship".translation
celo = $"../ship".translation + speed.normalized() * dist
Global.fenestro_itinero.add_itinero(
'',
Global.objektoj[index_pos]['uuid'],
Global.objektoj[index_pos]['nomo']['enhavo'], #'nomo'
celo.x,
celo.y,
celo.z,
dist
)
Global.fenestro_itinero.FillItemList()
if index==0:
Global.fenestro_itinero.komenci_itinero()
# elif index==1:
func _on_PopupMenu_draw():
# $canvas/PopupMenu.mouse_filter=0 #для отключения игнорирования меню и его реакции на выбор пунктов
pass # Replace with function body.
if index==0: # отправка корабля к цели
Global.fenestro_itinero.okazigi_itinero(
Global.objektoj[index_pos]['uuid'],
Global.objektoj[index_pos]['nomo']['enhavo'], #'nomo'
celo.x,
celo.y,
celo.z,
Transform(Basis.IDENTITY, celo),
dist,
Net.kategorio_movado,
false
)
elif index==1: # добавление точки в маршрут
Global.fenestro_itinero.add_itinero(
'',
Global.objektoj[index_pos]['uuid'],
Global.objektoj[index_pos]['nomo']['enhavo'], #'nomo'
celo.x,
celo.y,
celo.z,
Transform(Basis.IDENTITY, celo),
dist,
Net.kategorio_movado,
-1 #pozicio
)
......@@ -18,8 +18,8 @@ func objecto_mutation(uuid, koordX, koordY, koordZ, rotaciaX, rotaciaY, rotaciaZ
# устанавливаем проект
func instalo_projekto(objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
fin_koordX, fin_koordY, fin_koordZ):
func instalo_projekto_json(objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
fin_koordX, fin_koordY, fin_koordZ, id):
var tipoId = 2
var kategorio = 3
var statusoId = 2
......@@ -27,7 +27,12 @@ func instalo_projekto(objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
var priskribo = "Movado de objekto"
var statusoPosedantoId = 1
var tipoPosedantoId = 1
var query = JSON.print({ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
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,'+
......@@ -48,16 +53,17 @@ func instalo_projekto(objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
"fin_koordX":fin_koordX,
"fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
"objektoUuid":objektoUuid, "statusoPosedantoId":statusoPosedantoId,
"tipoPosedantoId":tipoPosedantoId, "realecoId":Global.realeco} })
"tipoPosedantoId":tipoPosedantoId, "realecoId":Global.realeco} }})
# print('===instalo_projekto===',query)
return query
# записываем список задач с их владельцами и текущие координаты объекту
func instalo_tasko_posedanto_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ, itineroj):
# записываем список задач с их владельцами и текущие координаты объекту
func instalo_tasko_posedanto_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ, itineroj, id=0):
# создаём список задач, создаём владельца проекта, устанавливаем координаты объекту
var tipoId = 2
var kategorio = 3
var statusoId = [2]
var statusoId = [2] # первая задача в работе
var nomo = "Movado"
var priskribo = "Movado de objekto"
var tipoPosedantoId = 1
......@@ -81,13 +87,18 @@ func instalo_tasko_posedanto_koord(uuid, projekto_uuid, kom_koordX, kom_koordY,
komKoordinatoX.append(itineroj[i-1]['koordinatoX'])
komKoordinatoY.append(itineroj[i-1]['koordinatoY'])
komKoordinatoZ.append(itineroj[i-1]['koordinatoZ'])
statusoId.append(1)
statusoId.append(1) # новая задача
fin_koordX.append(itineroj[i]['koordinatoX'])
fin_koordY.append(itineroj[i]['koordinatoY'])
fin_koordZ.append(itineroj[i]['koordinatoZ'])
i += 1
var query = JSON.print({ 'query': 'mutation ($uuid:UUID, $koordX:Float, $koordY:Float, $koordZ:Float, ' +
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($uuid:UUID, $koordX:Float, $koordY:Float, $koordZ:Float, ' +
'$tipoId:Int, $kategorio:[Int], $nomo:String, $priskribo:String, $statusoId:[Int], $projekto_uuid: String,' +
'$komKoordinatoX:[Float], $komKoordinatoY:[Float], $komKoordinatoZ:[Float], $tipoPosedantoId:Int,' +
'$fin_koordX:[Float], $fin_koordY:[Float], $fin_koordZ:[Float], $pozicio:[Int], $statusoPosedantoId:Int,' +
......@@ -107,14 +118,14 @@ func instalo_tasko_posedanto_koord(uuid, projekto_uuid, kom_koordX, kom_koordY,
"fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ, "tipoPosedantoId":tipoPosedantoId,
"statusoPosedantoId":statusoPosedantoId, "objektoUuid":uuid, "pozicio":pozicio,
"komKoordinatoX":komKoordinatoX, "komKoordinatoY":komKoordinatoY, "komKoordinatoZ":komKoordinatoZ,
"realecoId":Global.realeco}})
"realecoId":Global.realeco}}})
# print('===instalo_tasko_posedanto_koord===',query)
return query
# создаём задачу, устанавливаем координаты объекту, изменяем финальные координаты проекту
func instalo_tasko_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ,
fin_koordX, fin_koordY, fin_koordZ):
func instalo_tasko_koord_json(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ,
fin_koordX, fin_koordY, fin_koordZ, id=0):
var posedantoTipoId = 1
var posedantoStatusoId = 1
var tipoId = 2
......@@ -122,10 +133,15 @@ func instalo_tasko_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ
var statusoId = 2
var nomo = "Movado"
var priskribo = "Movado de objekto"
var query = JSON.print({ 'query': 'mutation ($uuid:UUID, $koordX:Float, $koordY:Float, $koordZ:Float, '+
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($uuid:UUID, $koordX:Float, $koordY:Float, $koordZ:Float, '+
'$tipoId:Int, $kategorio:[Int], $nomo:String, $priskribo:String, $statusoId:Int, $projekto_uuid: UUID,'+
'$fin_koordX:Float, $fin_koordY:Float, $fin_koordZ:Float, $projektoUuid: String, '+
'$posedantoTipoId:Int, $posedantoStatusoId:Int, $objektoUuid:String, '+
'$posedantoTipoId:Int, $posedantoStatusoId:Int, $objektoUuid:String, $UzantoId:Int'+
'$realecoId:Int)'+
'{ redaktuUniversoObjekto ( uuid: $uuid, koordinatoX: $koordX, koordinatoY: $koordY, '+
' koordinatoZ: $koordZ, realecoId:$realecoId ) { status message universoObjektoj { uuid } } '+
......@@ -134,6 +150,7 @@ func instalo_tasko_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ
' komKoordinatoY:$koordY, komKoordinatoZ:$koordZ, finKoordinatoX:$fin_koordX,'+
' finKoordinatoY:$fin_koordY, finKoordinatoZ:$fin_koordZ, posedantoTipoId:$posedantoTipoId, '+
' objektoUuid:$objektoUuid, posedantoStatusoId:$posedantoStatusoId, '+
' posedantoUzantoSiriusoUzantoId: $UzantoId, ' +
' realecoId:$realecoId) '+
'{ status '+
' message universoTaskoj { uuid } } '+
......@@ -147,25 +164,49 @@ func instalo_tasko_koord(uuid, projekto_uuid, kom_koordX, kom_koordY, kom_koordZ
"statusoId": statusoId, "projekto_uuid": projekto_uuid, "projektoUuid": projekto_uuid,
"fin_koordX":fin_koordX, "fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
"posedantoStatusoId":posedantoStatusoId, "posedantoTipoId":posedantoTipoId,
"objektoUuid":uuid, "realecoId":Global.realeco } })
"UzantoId":Global.id,
"objektoUuid":uuid, "realecoId":Global.realeco } }})
# print('===instalo_tasko_koord===',query)
return query
# # завершение задачи
# func finado_tasko(tasko_uuid, statusoId = 4):
# return JSON.print({ 'query': 'mutation ($uuid:UUID, '+
# ' $statusoId:Int, )'+
# '{ redaktuUniversoTaskoj (uuid: $uuid, '+
# ' statusoId:$statusoId) { status '+
# ' message universoTaskoj { uuid } } }',
# 'variables': {"uuid":tasko_uuid, "statusoId": statusoId } })
# завершение задачи
func finado_tasko(tasko_uuid, statusoId = 4):
return JSON.print({ 'query': 'mutation ($uuid:UUID, '+
#!!! хорошо бы отправлять координаты до куда долетел по факту
func finado_tasko(tasko_uuid, statusoId = 4, id=0):
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($uuid:UUID, '+
' $statusoId:Int, )'+
'{ redaktuUniversoTaskoj (uuid: $uuid, '+
' statusoId:$statusoId) { status '+
' message universoTaskoj { uuid } } }',
'variables': {"uuid":tasko_uuid, "statusoId": statusoId } })
'variables': {"uuid":tasko_uuid, "statusoId": statusoId } }})
# print('===finado_tasko==',query)
return query
# завершение задачи и проекта
func finado_projeko_tasko(projekto_uuid, tasko_uuid):
func finado_projekto_tasko_json(projekto_uuid, tasko_uuid, id=0):
var statusoId = 4
return JSON.print({ 'query': 'mutation ($tasko_uuid:UUID, $projekto_uuid:UUID, '+
if !id:
id = Net.get_current_query_id()
return JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tasko_uuid:UUID, $projekto_uuid:UUID, '+
' $statusoId:Int, )'+
'{ redaktuUniversoTaskoj (uuid: $tasko_uuid, '+
' statusoId:$statusoId) { status '+
......@@ -174,15 +215,14 @@ func finado_projeko_tasko(projekto_uuid, tasko_uuid):
' statusoId:$statusoId) { status '+
' message universoProjekto { uuid } } '+
'}',
'variables': {"tasko_uuid":tasko_uuid, "statusoId": statusoId, "projekto_uuid":projekto_uuid } })
'variables': {"tasko_uuid":tasko_uuid, "statusoId": statusoId, "projekto_uuid":projekto_uuid } } })
# завершение проекта
func finado_projeko_json(projekto_uuid, id=0):
var statusoId = 4 # Закрыт
if !id:
id = Net.current_query_id
Net.current_query_id += 1
id = Net.get_current_query_id()
return JSON.print({
'type': 'start',
'id': '%s' % id,
......@@ -194,37 +234,29 @@ func finado_projeko_json(projekto_uuid, id=0):
'}',
'variables': {"statusoId": statusoId, "projekto_uuid":projekto_uuid } }})
# подписка на действия в кубе
func kubo_json(id=0):
if !id:
id = Net.current_query_id
Net.current_query_id += 1
var kategorio = 3 # категория движения объектов в космосе
id = Net.get_current_query_id()
return JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'subscription ($kuboj:[Int]!, $realeco:Int!, $kategorio:Int!)'+
'{ universoObjektoEventoj (kuboj: $kuboj, realeco:$realeco, kategorio: $kategorio) { evento '+
' objekto { uuid koordinatoX koordinatoY koordinatoZ} '+
' projekto {uuid} '+
'payload':{ 'query': 'subscription ($kuboj:[Int]!, $realeco:Int!)'+
'{ universoObjektoEventoj (kuboj: $kuboj, realeco:$realeco) { evento '+
' objekto { uuid koordinatoX koordinatoY koordinatoZ '+
" stato{objId potenco integreco statoAntaua {integreco} "+
" statoSekva{integreco}} integreco" +
" resurso{objId tipo{objId}}" +
' rotaciaX rotaciaY rotaciaZ } '+
' projekto {uuid kategorio {edges {node {objId }}}} '+
' tasko { uuid komKoordinatoX komKoordinatoY '+
' komKoordinatoZ finKoordinatoX finKoordinatoY '+
' finKoordinatoZ pozicio statuso{objId} kategorio { '+
' edges { node { objId } } }} } '+
" objekto{uuid nomo {enhavo}} " +
' posedanto{edges{node{ posedantoObjekto{uuid} }}}' +
' komKoordinatoZ finKoordinatoX finKoordinatoY '+
' finKoordinatoZ pozicio statuso{objId} kategorio { '+
' edges { node { objId } } }} } '+
'}',
'variables': {"kuboj": Global.kubo, "realeco": Global.realeco, "kategorio":kategorio } }})
func test_json(id=0):
if !id:
id = Net.current_query_id
Net.current_query_id += 1
return JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'subscription '+
'{ mesagxiloEventoj (babilejoj: [1,2]) { ' +
'evento ' +
'babilejo { uuid } } }'}})
'variables': {"kuboj": Global.kubo, "realeco": Global.realeco } }})
......@@ -9,64 +9,101 @@ const Zoom_Step: float = 1.0
#const MIN_ROT_Y = -1.55 #(89 градусов)
#const MAX_ROT_Y = 0.79 #(45 градусов)
var max_speed =1000.0
var max_speed =500.0
# текущая скорость
var current_speed =0
var acceleration = 0.5
var acceleration = 1
var way_point: Vector3 = Vector3() # Координаты точки, в которую летим
var target_dir: Vector3 = Vector3.ZERO #направление на эту точку от текущей позиции корабля
var target_rot #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation =0.03
var target_rot = null #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation = 1
var middle_mouse_pressed = false
var docking_rotation
var uuid #uuid активного корабля игрока
var projekto_uuid
# взятые в прицел, массив объектов, взятых в прицел
var celilo = []
var max_celilo = 1 # максимальное количество прицелов
var livero = false # произошел выстрел и запущена перезарядка
func _ready():
$CollisionShape.queue_free()
pass
func _physics_process(delta):
if target_dir != Vector3.ZERO: #Если цель существует, двигаемся
target_dir = (way_point - translation).normalized()
if translation.distance_to(way_point) > max_speed*delta/acceleration:
current_speed = lerp(current_speed,max_speed,delta*acceleration)
transform.basis = Basis(Quat(transform.basis).slerp(target_rot,speed_rotation)) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else:
if translation.distance_to(way_point) <0.01:
if docking_rotation !=null:
transform.basis = Basis(Quat(docking_rotation))
translation = way_point
clear_way_point()
print("doexali")
# останавливаем таймер передачи данных на сервер
$"../timer".stop()
#отправка последних координат и закрытие задачи с проектом
finofara_flugo()
# если категория задачи равна категории движения объекта, тогда двигаемся
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,50,delta*acceleration)
if docking_rotation != null:
transform.basis = Basis(Quat(transform.basis).slerp(docking_rotation,speed_rotation*1.5)) #поворачиваем в дефолтное состояние, чтобы сесть
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) #Двигаемся к цели
Global.fenestro_itinero.distance_to(translation)
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 set_way_point(position, dock):
docking_rotation = dock
way_point = position # устанавливаем точку цели
target_dir = (way_point - translation).normalized() # устанавливаем направление движение на цель.
target_rot = Quat(transform.looking_at(way_point,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
func clear_way_point():
target_dir = Vector3.ZERO #очищаем цель
way_point = Vector3.ZERO
docking_rotation = null
current_speed = 0
func set_celilo(celo):
celilo.append(celo)
$Control/celilo.set_visible(true)
$Control/celilo/label.text = celilo.front().uuid
get_node("laser_gun").set_target(celilo.front())
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()
const QueryObject = preload("../skriptoj/queries.gd")
......@@ -80,86 +117,29 @@ func _on_timer_timeout():
rotation.y, rotation.z)
)
#добавление в список маршрута с предварительным очишением маршрута
func add_itinero():
Global.fenestro_itinero.add_itinero('','', 'точка в космосе',
way_point.x, way_point.y,
way_point.z, translation.distance_to(way_point))
#передача данных на сервер при отправке корабля по первой цели
func vojkomenco():
if len(Global.itineroj)==0:
return 404
var q = QueryObject.new()
if !projekto_uuid:#если проекта нет, то создаём
# цель маршрута берём из itineroj
var count_itineroj=len(Global.itineroj)-1
$"../http_projekto".request(q.URL, Global.backend_headers, true, 2,
q.instalo_projekto(uuid,
translation.x, #kom_koordX
translation.y, #kom_koordY
translation.z, #kom_koordZ
Global.itineroj[count_itineroj]['koordinatoX'], #fin_koordX
Global.itineroj[count_itineroj]['koordinatoY'], #fin_koordY
Global.itineroj[count_itineroj]['koordinatoZ'] #fin_koordZ
))
else:#проект есть, изменяем задачу
# ставим задачу в выполененную
# надо использовать другой request, не от поседанто, т.к. поседанто используется при /
# установке владельца задачи и этот может не успеть отработать
$"../http_finado".request(q.URL, Global.backend_headers, true, 2,
q.finado_tasko(Global.itineroj[0]['uuid_tasko']))
Global.itineroj.remove(0)#удаляем задачу
# изменяем цель проекта
$"../http_tasko".request(q.URL, Global.backend_headers, true, 2,
q.instalo_tasko_koord(
uuid, projekto_uuid,
translation.x, #kom_koordX
translation.y, #kom_koordY
translation.z, #kom_koordZ
Global.itineroj[0]['koordinatoX'], #fin_koordX
Global.itineroj[0]['koordinatoY'], #fin_koordY
Global.itineroj[0]['koordinatoZ'] #fin_koordZ
))
Global.fenestro_itinero.FillItemList()
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
func finofara_flugo():
if len(Global.itineroj)==0:
return 404 # маршрута нет, закрывать нечего, выходим из процедуры
if projekto_uuid:
var q = QueryObject.new()
# если есть очередь в задачах, то закрываем только текущую задачу и запускаем в работу следующую
if len(Global.itineroj)==1:
$"../http_finado".request(q.URL, Global.backend_headers, true, 2,
q.finado_projeko_tasko(projekto_uuid, Global.itineroj[0]['uuid_tasko']))
Global.itineroj.clear()
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/ItemList").clear()
projekto_uuid=''
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero").disabled=false
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next").disabled=true
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin").disabled=true
Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear").disabled=true
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:
$"../http_posedanto".request(q.URL, Global.backend_headers, true, 2,
q.finado_tasko(Global.itineroj[0]['uuid_tasko']))
# берём следующую задачу в работу
Global.itineroj.remove(0)
Global.fenestro_itinero.FillItemList()
# изменяем следующую задачу на "в работе"
$"../http_finado".request(q.URL, Global.backend_headers, true, 2,
q.finado_tasko(Global.itineroj[0]['uuid_tasko'],2))
var position = Vector3(Global.itineroj[0]['koordinatoX'],
Global.itineroj[0]['koordinatoY'],
Global.itineroj[0]['koordinatoZ'])
set_way_point(position,null)
$"../way_point".set_way_point(position)
#запускаем таймер
$"../timer".start()
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()
......@@ -4,16 +4,21 @@ extends Spatial
const QueryObject = preload("queries.gd")
# warning-ignore:unused_signal
signal load_objektoj
# список id запросов, отправленных на сервер
var id_projekto_direkt_del = [] # список проектов на удаление
var choose = true
var subscription_id # id сообщения, по какому объекту, в каком проекте, какая задача изменена
var id_net = [] # список пустых id запросов (ответы не анализируются, а удаляются)
var subscription_id
# пока сервер не закрывает выстрел, закрывает сам клиент
var id_pafo = []
func _ready():
$Control.camera = $camera
# подключаем сигнал для обработки входящих данных
var err = Net.connect("input_data", self, "_on_data")
if err:
......@@ -23,34 +28,37 @@ func _ready():
# считываем размер экрана и задаём затемнение на весь экран
$ui/loading.margin_right = get_node("/root").get_viewport().size.x
$ui/loading.margin_bottom = get_node("/root").get_viewport().size.y
# $b_itinero.margin_left = get_node("/root").get_viewport().size.x - 100
# $b_itinero.margin_top = get_node("/root").get_viewport().size.y-50
# создаём свой корабль
var ship = create_ship(Global.direktebla_objekto[Global.realeco-2])
#если корабль игрока, то брать данные из direktebla_objekto
$main_camera.translation=Vector3(
$camera.translation=Vector3(
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)
$camera.point_of_interest = ship
for i in get_children():
if has_signal(i,"new_way_point"):
if has_signal_custom(i,"new_way_point"):
i.connect("new_way_point",self,"set_way_point")
subscribtion_kubo()
func _on_data():
var i_data_server = 0
var q = QueryObject.new()
for on_data in Net.data_server:
# print('on_data=', on_data)
# print('on_data[id] =',on_data['id'],' id_projekto_direkt_del=',id_projekto_direkt_del)
var index = id_projekto_direkt_del.find(on_data['id'])
# print('index=',index,' ::: ', typeof(index), " == ", typeof(on_data['id']))
if index > -1: # находится в спике удаляемых объектов
print('=== Удалили проект управляемого объекта')
var index = id_projekto_direkt_del.find(int(on_data['id']))
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: # находится в списке удаляемых объектов
# удаляем из списка
var idx_prj = 0 #индекс массива для удаления
for prj in Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']:
......@@ -59,100 +67,116 @@ func _on_data():
idx_prj += 1
id_projekto_direkt_del.remove(index)
Net.data_server.remove(i_data_server)
elif index_pafo > -1: # находится в списке выстрелов, закрываем задачу
# пользователь не может закрыть, т.к. владелец лазера объект, а не пользователь
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)
elif int(on_data['id']) == subscription_id:
# пришло сообщение, по какому объекту, в каком проекте, какая задача изменена
sxangxi_tasko(on_data['payload']['data'])
print('=== subscription_id ===',on_data)
else:
print('on_data else=', on_data)
# elif on_data['payload']['data'].get('filteredUniversoObjekto'):
# pass
# Net.data_server.remove(i_data_server)
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'])
Net.data_server.remove(i_data_server)
i_data_server += 1
# проверка, входит ли 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
# поиск объекта по 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
# меняем задачу объекту
func sxangxi_tasko(on_data):
# пометка о нахождении нужного объекта
var objekto = false
for ch in get_children(): # проходим по всем созданным объектам в поисках нужного
# если эти изменения не по задаче
if not on_data['universoObjektoEventoj']['tasko']:
return
var uuid = on_data['universoObjektoEventoj']['tasko']['posedanto']['edges'].front()['node']['posedantoObjekto']['uuid']
for ch in get_children(): # проходим по всем созданным объектам (кроме управляемого корабля) в поисках нужного
if ch.is_in_group('create') and ('objekto' in ch):
if on_data['universoObjektoEventoj']['objekto']['uuid']==ch.uuid:
ch.sxangxi_itinero(on_data['universoObjektoEventoj']['projekto'],
on_data['universoObjektoEventoj']['tasko'])
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'])
# если проект стрельбы
elif on_data['universoObjektoEventoj']['projekto']['kategorio']['edges'].front()['node']['objId']==Net.projekto_kategorio_pafado:
ch.pafo(on_data['universoObjektoEventoj']['projekto'],
on_data['universoObjektoEventoj']['tasko'])
if on_data['universoObjektoEventoj']['tasko']['kategorio']['edges'].front()['node']['objId']==Net.tasko_kategorio_celilo:
# сообщаем кораблю игрока о прицеливании в него
pass
objekto = true
if !objekto: # если объект не найден, то нужно его добавить
print('найден новый объект!!!')
pass
if !objekto: # если объект не найден, то нужно его добавить (если он не часть своего корабля)
if sercxado_uuid(uuid,$ship):
print('часть управляемого корабля')
else:
print('===найден новый объект!!! uuid=',uuid,' ===on_data=',on_data)
# изменяем характеристики объекта
func sxangxi_objekto(on_data):
var uuid = on_data['universoObjektoEventoj']['objekto']['uuid']
var objekto = sercxo_objekto_uuid(uuid)
if objekto:
sxangxi_instance(objekto, on_data['universoObjektoEventoj']['objekto'])
# подписка на действие в кубе нахождения
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))
# warning-ignore:unused_argument
func _input(event):
if Input.is_action_just_pressed("ui_select"):
choose=!choose
if choose:
$main_camera.set_privot($ship)
else:
$main_camera.set_privot(null)
func set_way_point(position,dock):
get_node("ship").add_itinero()
#останавливаем таймер
$timer.stop()
$ship.set_way_point(position,dock)
$way_point.set_way_point(position)
#передаём текущие координаты
$ship.vojkomenco()#начинаем движение
#запускаем таймер
$timer.start()
func has_signal(node, sgnl):
#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_custom(node, sgnl) ->bool:
if node == null:
return false
node=node.get_signal_list()
for i in node:
for i in node.get_signal_list():
if i.name == sgnl:
return true
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
......@@ -160,8 +184,7 @@ func _on_http_tasko_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']['redaktuUniversoTaskoj']['universoTaskoj']
# print('===_on_http_tasko_request_completed===',parsed_resp)
# получаем список задач и помещаем в itinero
# получаем uuid задачи и помещаем в itinero
Global.itineroj[0]['uuid_tasko']=simpled_data['uuid']
......@@ -204,7 +227,14 @@ const sxipo = preload("res://blokoj/kosmosxipoj/scenoj/sxipo_fremdulo.tscn")
const sxipo_modulo = preload("res://blokoj/kosmosxipoj/skriptoj/moduloj/sxipo.gd")
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 asteroido = preload("res://blokoj/asteroidoj/asteroido.tscn")
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")
const AnalizoProjekto = preload("res://blokoj/kosmosxipoj/skriptoj/itineroj.gd")
# функция создания корабля
func create_ship(objecto):
......@@ -224,144 +254,114 @@ func create_ship(objecto):
ship.visible=true
ship.uuid=objecto['uuid']
ship.add_to_group('create')
$main_camera.set_privot(ship)
$camera.set_privot(ship)
return ship
# добавляем объект в космос с настройкой местоположения
func add_objekto(objekto,item):
objekto.translation=Vector3(item['koordinatoX'],
item['koordinatoY'], item['koordinatoZ'])
objekto.uuid = item['uuid']
objekto.objekto = item.duplicate(true)
objekto.rotation=Vector3(item['rotaciaX'],
item['rotaciaY'], item['rotaciaZ'])
add_child(objekto)
objekto.add_to_group('create')
# функция анализа и добавления объекта в космос на основе пришедшей инфы с сервера
func analizo_item(item):
if item['resurso']['objId'] == 1:#объект станция Espero
var state = espero.instance()
add_objekto(state,item)
state.add_to_group('state')
elif (item['resurso']['tipo']['objId'] == 2)and(item['koordinatoX']):# тип - корабль
var s = sxipo.instance()
var sh = sxipo_modulo.new()
sh.create_sxipo(s, item)
add_objekto(s,item)
# добавляем маршрут движения
if item['projekto']:
var projektoj = item['projekto']['edges']
var analizo = AnalizoProjekto.new()
analizo.analizo_projekto(projektoj,s,s)
s.add_to_group('enemies')
elif (item['resurso']['objId'] == 7)and(item['koordinatoX']):# тип - астероид
# подгружаем в зависимости от состояния модификации астероида грузим картинку
var ast = asteroido.instance()
if item['stato']['objId']==1:
ast.add_child(ast_1.instance())
elif item['stato']['objId']==2:
ast.add_child(ast_1_cr.instance())
elif item['stato']['objId']==3:
ast.add_child(ast_shards_0.instance())
else:
# if item['stato']['objId']==4:
ast.add_child(ast_shards_2.instance())
add_objekto(ast,item)
ast.add_to_group('asteroidoj')
# изменить изображение
func sxangxi_instance(objekto, item):
objekto.integreco = item['integreco']
# if item['resurso']['objId'] == 1:#объект станция Espero
# var state = espero.instance()
# add_objekto(state,item)
# state.add_to_group('state')
# elif (item['resurso']['tipo']['objId'] == 2)and(item['koordinatoX']):# тип - корабль
# var s = sxipo.instance()
# var sh = sxipo_modulo.new()
# sh.create_sxipo(s, item)
# add_objekto(s,item)
# # добавляем маршрут движения
# if item['projekto']:
# var projektoj = item['projekto']['edges']
# var analizo = AnalizoProjekto.new()
# analizo.analizo_projekto(projektoj,s,s)
# s.add_to_group('enemies')
# el
if (item['resurso']['objId'] == 7)and(item['koordinatoX']):# тип - астероид
# проверить, нужно ли менять визауализацию объекта
if objekto.objekto['stato']['objId'] == item['stato']['objId']:
# print('оставляем визуализацию как есть')
return
# else:
# print('меняем визуализацию объекта')
# сохраняем предыдущее состояние
var old_ast
for ch in objekto.get_children():
if ch is Spatial:
# print('==name=',ch.name)
old_ast = ch
break
old_ast.queue_free()
# подгружаем в зависимости от состояния модификации астероида грузим картинку
if item['stato']['objId']==1:
objekto.add_child(ast_1.instance())
elif item['stato']['objId']==2:
objekto.add_child(ast_1_cr.instance())
elif item['stato']['objId']==3:
objekto.add_child(ast_shards_0.instance())
else:
# if item['stato']['objId']==4:
objekto.add_child(ast_shards_2.instance())
objekto.objekto['stato']['objId'] = item['stato']['objId']
func _on_space_load_objektoj():
Title.get_node("CanvasLayer/UI/Objektoj/Window").distance_to($ship.translation)
# и теперь по 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('нужно закрыть проект!!!')
id_projekto_direkt_del.push_back(Net.current_query_id)
Net.current_query_id += 1
Net.send_json(q.finado_projeko_json(projektoj[0]['node']['uuid'],id_projekto_direkt_del[len(id_projekto_direkt_del)-1]))
pass# нужно закрыть проект!!!
else:
$ship.projekto_uuid=projektoj[0]['node']['uuid']
#заполняем маршрут
Global.itineroj.clear()
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'],
$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'],
$ship.translation.distance_to(Vector3(
tasko['node']['finKoordinatoX'],
tasko['node']['finKoordinatoY'],
tasko['node']['finKoordinatoZ']
)))
if len(Global.itineroj)==0:
$ship.projekto_uuid='' #задач на полёт нет, проект надо бы закрыть
else:
#отправляем корабль по координатам
var position = Vector3(Global.itineroj[0]['koordinatoX'],
Global.itineroj[0]['koordinatoY'],
Global.itineroj[0]['koordinatoZ'])
Global.fenestro_itinero.FillItemList()
$ship.set_way_point(position,null)
$"way_point".set_way_point(position)
$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:
$ship.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
var state = espero.instance()
state.translation=Vector3(item['koordinatoX'],
item['koordinatoY'], item['koordinatoZ'])
state.uuid = item['uuid']
state.objekto = item.duplicate(true)
add_child(state)
state.add_to_group('state')
state.add_to_group('create')
elif (item['resurso']['tipo']['objId'] == 2)and(item['koordinatoX']):# тип - корабль
var s = sxipo.instance()
var sh = sxipo_modulo.new()
sh.create_sxipo(s, item)
s.uuid = item['uuid']
s.objekto = item.duplicate(true)
s.translation=Vector3(item['koordinatoX'],
item['koordinatoY'], item['koordinatoZ'])
s.rotation=Vector3(item['rotaciaX'],
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())
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'])
ast.uuid = item['uuid']
ast.objekto = item.duplicate(true)
add_child(ast)
ast.add_to_group('create')
ast.add_to_group('asteroidoj')
analizo_item(item)
func _on_Timer_timeout():
......@@ -381,9 +381,13 @@ func _on_Timer_timeout():
)
func _on_space_tree_exiting():
#разрушаем все созданные объекты в этом мире
for ch in get_children():
if ch.is_in_group('create'):
ch.free()
Global.fenestro_kosmo = null
......@@ -7,6 +7,7 @@ export var colision_radius = 2.0 #радиус, на который надо п
var active = false # есть ли точка пути, или ничего не указано
# warning-ignore:unused_signal
signal new_way_point(position) # сигнал кораблю, что пора лететь в точку position
func _ready():
......@@ -14,10 +15,12 @@ func _ready():
offset =Vector2($TextureRect.rect_size/2) # получаем смещение контрол-нод в центр
$Area/CollisionShape.shape.radius = colision_radius #задаём радиус обнуления вейпойнта.
# warning-ignore:unused_argument
func _input(event):
if Input.is_action_just_pressed("left_click"):
if event is InputEventMouseButton and event.doubleclick:
emit_signal("new_way_point",cam.project_position(get_viewport().get_mouse_position(),z_away),null) #Если кнопка нажата, то бросаем лучь из камеры на глубину z_away и получаем точку, тут же устанавливаем новый вейпойнт с координатами
# if Input.is_action_just_pressed("left_click"):
# if event is InputEventMouseButton and event.doubleclick:
# emit_signal("new_way_point",cam.project_position(get_viewport().get_mouse_position(),z_away),null) #Если кнопка нажата, то бросаем лучь из камеры на глубину z_away и получаем точку, тут же устанавливаем новый вейпойнт с координатами
pass
# warning-ignore:unused_argument
func _physics_process(delta):
......
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://blokoj/kosmostacioj/kosmostacio.jpg" type="Texture" id=1]
[ext_resource path="res://blokoj/kosmostacioj/resursoj/CapKosmostacio/textures/Stars Sphere.jpg" type="Texture" id=1]
[ext_resource path="res://blokoj/kosmostacioj/Kosmostacio.gd" type="Script" id=2]
[ext_resource path="res://blokoj/rajtigo/tero.png" type="Texture" id=3]
[node name="Node2D" type="Node2D"]
script = ExtResource( 2 )
[node name="ParallaxBackground" type="ParallaxBackground" parent="."]
follow_viewport_enable = true
[node name="ParallaxBackground2" type="ParallaxBackground" parent="."]
[node name="TextureRect" type="TextureRect" parent="ParallaxBackground"]
[node name="TextureRect" type="TextureRect" parent="ParallaxBackground2"]
anchor_right = 1.0
anchor_bottom = 1.0
texture = ExtResource( 1 )
expand = true
stretch_mode = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ParallaxBackground" type="ParallaxBackground" parent="."]
layer = -98
follow_viewport_enable = true
[node name="TextureRect" type="TextureRect" parent="ParallaxBackground"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -512.0
margin_top = -384.0
margin_right = 512.0
margin_bottom = 384.0
texture = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
......@@ -23,21 +42,21 @@ anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.594
anchor_bottom = 1.0
margin_left = -5.548
margin_top = -31.556
margin_left = -5.54797
margin_top = -26.556
margin_right = 0.195984
margin_bottom = -19.556
margin_bottom = -9.55603
__meta__ = {
"_edit_use_anchors_": false
}
[node name="GreetingLabel" type="Label" parent="ParallaxBackground"]
anchor_left = 0.317
anchor_right = 0.708
margin_left = 0.0470276
margin_top = 70.0
margin_right = -0.336975
margin_bottom = 100.0
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = -625.216
margin_top = -30.0
align = 1
valign = 1
__meta__ = {
......
......@@ -16,7 +16,7 @@ func _on_CapKosmostacio_ready():
# ship.rotate_y(1.58)
ship.rotate_y(deg2rad(-90))
ship.translation.x = ship.translation.x + 26.4 # насколько въезжать в парковку
ship.translation.x = ship.translation.x + 25.4 # насколько въезжать в парковку
ship.translation.z = ship.translation.z - 5 # в сторону от центра
ship.translation.y = ship.translation.y + 2 # высота от пола
add_child(ship,true)
......
[remap]
importer="scene"
type="PackedScene"
path="res://.import/Nozzles.glb-ee66a3341866f4fbe2b3723c8459116b.scn"
[deps]
source_file="res://blokoj/kosmosxipoj/resursoj/Nozzles/Nozzles.glb"
dest_files=[ "res://.import/Nozzles.glb-ee66a3341866f4fbe2b3723c8459116b.scn" ]
[params]
nodes/root_type="Spatial"
nodes/root_name="Scene Root"
nodes/root_scale=1.0
nodes/custom_script=""
nodes/storage=0
materials/location=1
materials/storage=1
materials/keep_on_reimport=true
meshes/compress=true
meshes/ensure_tangents=true
meshes/storage=0
meshes/light_baking=0
meshes/lightmap_texel_size=0.1
skins/use_named_skins=true
external_files/store_in_subdir=false
animation/import=true
animation/fps=15
animation/filter_script=""
animation/storage=false
animation/keep_custom_tracks=false
animation/optimizer/enabled=true
animation/optimizer/max_linear_error=0.05
animation/optimizer/max_angular_error=0.01
animation/optimizer/max_angle=22
animation/optimizer/remove_unused_tracks=true
animation/clips/amount=0
animation/clip_1/name=""
animation/clip_1/start_frame=0
animation/clip_1/end_frame=0
animation/clip_1/loops=false
animation/clip_2/name=""
animation/clip_2/start_frame=0
animation/clip_2/end_frame=0
animation/clip_2/loops=false
animation/clip_3/name=""
animation/clip_3/start_frame=0
animation/clip_3/end_frame=0
animation/clip_3/loops=false
animation/clip_4/name=""
animation/clip_4/start_frame=0
animation/clip_4/end_frame=0
animation/clip_4/loops=false
animation/clip_5/name=""
animation/clip_5/start_frame=0
animation/clip_5/end_frame=0
animation/clip_5/loops=false
animation/clip_6/name=""
animation/clip_6/start_frame=0
animation/clip_6/end_frame=0
animation/clip_6/loops=false
animation/clip_7/name=""
animation/clip_7/start_frame=0
animation/clip_7/end_frame=0
animation/clip_7/loops=false
animation/clip_8/name=""
animation/clip_8/start_frame=0
animation/clip_8/end_frame=0
animation/clip_8/loops=false
animation/clip_9/name=""
animation/clip_9/start_frame=0
animation/clip_9/end_frame=0
animation/clip_9/loops=false
animation/clip_10/name=""
animation/clip_10/start_frame=0
animation/clip_10/end_frame=0
animation/clip_10/loops=false
animation/clip_11/name=""
animation/clip_11/start_frame=0
animation/clip_11/end_frame=0
animation/clip_11/loops=false
animation/clip_12/name=""
animation/clip_12/start_frame=0
animation/clip_12/end_frame=0
animation/clip_12/loops=false
animation/clip_13/name=""
animation/clip_13/start_frame=0
animation/clip_13/end_frame=0
animation/clip_13/loops=false
animation/clip_14/name=""
animation/clip_14/start_frame=0
animation/clip_14/end_frame=0
animation/clip_14/loops=false
animation/clip_15/name=""
animation/clip_15/start_frame=0
animation/clip_15/end_frame=0
animation/clip_15/loops=false
animation/clip_16/name=""
animation/clip_16/start_frame=0
animation/clip_16/end_frame=0
animation/clip_16/loops=false
animation/clip_17/name=""
animation/clip_17/start_frame=0
animation/clip_17/end_frame=0
animation/clip_17/loops=false
animation/clip_18/name=""
animation/clip_18/start_frame=0
animation/clip_18/end_frame=0
animation/clip_18/loops=false
animation/clip_19/name=""
animation/clip_19/start_frame=0
animation/clip_19/end_frame=0
animation/clip_19/loops=false
animation/clip_20/name=""
animation/clip_20/start_frame=0
animation/clip_20/end_frame=0
animation/clip_20/loops=false
animation/clip_21/name=""
animation/clip_21/start_frame=0
animation/clip_21/end_frame=0
animation/clip_21/loops=false
animation/clip_22/name=""
animation/clip_22/start_frame=0
animation/clip_22/end_frame=0
animation/clip_22/loops=false
animation/clip_23/name=""
animation/clip_23/start_frame=0
animation/clip_23/end_frame=0
animation/clip_23/loops=false
animation/clip_24/name=""
animation/clip_24/start_frame=0
animation/clip_24/end_frame=0
animation/clip_24/loops=false
animation/clip_25/name=""
animation/clip_25/start_frame=0
animation/clip_25/end_frame=0
animation/clip_25/loops=false
animation/clip_26/name=""
animation/clip_26/start_frame=0
animation/clip_26/end_frame=0
animation/clip_26/loops=false
animation/clip_27/name=""
animation/clip_27/start_frame=0
animation/clip_27/end_frame=0
animation/clip_27/loops=false
animation/clip_28/name=""
animation/clip_28/start_frame=0
animation/clip_28/end_frame=0
animation/clip_28/loops=false
animation/clip_29/name=""
animation/clip_29/start_frame=0
animation/clip_29/end_frame=0
animation/clip_29/loops=false
animation/clip_30/name=""
animation/clip_30/start_frame=0
animation/clip_30/end_frame=0
animation/clip_30/loops=false
animation/clip_31/name=""
animation/clip_31/start_frame=0
animation/clip_31/end_frame=0
animation/clip_31/loops=false
animation/clip_32/name=""
animation/clip_32/start_frame=0
animation/clip_32/end_frame=0
animation/clip_32/loops=false
animation/clip_33/name=""
animation/clip_33/start_frame=0
animation/clip_33/end_frame=0
animation/clip_33/loops=false
animation/clip_34/name=""
animation/clip_34/start_frame=0
animation/clip_34/end_frame=0
animation/clip_34/loops=false
animation/clip_35/name=""
animation/clip_35/start_frame=0
animation/clip_35/end_frame=0
animation/clip_35/loops=false
animation/clip_36/name=""
animation/clip_36/start_frame=0
animation/clip_36/end_frame=0
animation/clip_36/loops=false
animation/clip_37/name=""
animation/clip_37/start_frame=0
animation/clip_37/end_frame=0
animation/clip_37/loops=false
animation/clip_38/name=""
animation/clip_38/start_frame=0
animation/clip_38/end_frame=0
animation/clip_38/loops=false
animation/clip_39/name=""
animation/clip_39/start_frame=0
animation/clip_39/end_frame=0
animation/clip_39/loops=false
animation/clip_40/name=""
animation/clip_40/start_frame=0
animation/clip_40/end_frame=0
animation/clip_40/loops=false
animation/clip_41/name=""
animation/clip_41/start_frame=0
animation/clip_41/end_frame=0
animation/clip_41/loops=false
animation/clip_42/name=""
animation/clip_42/start_frame=0
animation/clip_42/end_frame=0
animation/clip_42/loops=false
animation/clip_43/name=""
animation/clip_43/start_frame=0
animation/clip_43/end_frame=0
animation/clip_43/loops=false
animation/clip_44/name=""
animation/clip_44/start_frame=0
animation/clip_44/end_frame=0
animation/clip_44/loops=false
animation/clip_45/name=""
animation/clip_45/start_frame=0
animation/clip_45/end_frame=0
animation/clip_45/loops=false
animation/clip_46/name=""
animation/clip_46/start_frame=0
animation/clip_46/end_frame=0
animation/clip_46/loops=false
animation/clip_47/name=""
animation/clip_47/start_frame=0
animation/clip_47/end_frame=0
animation/clip_47/loops=false
animation/clip_48/name=""
animation/clip_48/start_frame=0
animation/clip_48/end_frame=0
animation/clip_48/loops=false
animation/clip_49/name=""
animation/clip_49/start_frame=0
animation/clip_49/end_frame=0
animation/clip_49/loops=false
animation/clip_50/name=""
animation/clip_50/start_frame=0
animation/clip_50/end_frame=0
animation/clip_50/loops=false
animation/clip_51/name=""
animation/clip_51/start_frame=0
animation/clip_51/end_frame=0
animation/clip_51/loops=false
animation/clip_52/name=""
animation/clip_52/start_frame=0
animation/clip_52/end_frame=0
animation/clip_52/loops=false
animation/clip_53/name=""
animation/clip_53/start_frame=0
animation/clip_53/end_frame=0
animation/clip_53/loops=false
animation/clip_54/name=""
animation/clip_54/start_frame=0
animation/clip_54/end_frame=0
animation/clip_54/loops=false
animation/clip_55/name=""
animation/clip_55/start_frame=0
animation/clip_55/end_frame=0
animation/clip_55/loops=false
animation/clip_56/name=""
animation/clip_56/start_frame=0
animation/clip_56/end_frame=0
animation/clip_56/loops=false
animation/clip_57/name=""
animation/clip_57/start_frame=0
animation/clip_57/end_frame=0
animation/clip_57/loops=false
animation/clip_58/name=""
animation/clip_58/start_frame=0
animation/clip_58/end_frame=0
animation/clip_58/loops=false
animation/clip_59/name=""
animation/clip_59/start_frame=0
animation/clip_59/end_frame=0
animation/clip_59/loops=false
animation/clip_60/name=""
animation/clip_60/start_frame=0
animation/clip_60/end_frame=0
animation/clip_60/loops=false
animation/clip_61/name=""
animation/clip_61/start_frame=0
animation/clip_61/end_frame=0
animation/clip_61/loops=false
animation/clip_62/name=""
animation/clip_62/start_frame=0
animation/clip_62/end_frame=0
animation/clip_62/loops=false
animation/clip_63/name=""
animation/clip_63/start_frame=0
animation/clip_63/end_frame=0
animation/clip_63/loops=false
animation/clip_64/name=""
animation/clip_64/start_frame=0
animation/clip_64/end_frame=0
animation/clip_64/loops=false
animation/clip_65/name=""
animation/clip_65/start_frame=0
animation/clip_65/end_frame=0
animation/clip_65/loops=false
animation/clip_66/name=""
animation/clip_66/start_frame=0
animation/clip_66/end_frame=0
animation/clip_66/loops=false
animation/clip_67/name=""
animation/clip_67/start_frame=0
animation/clip_67/end_frame=0
animation/clip_67/loops=false
animation/clip_68/name=""
animation/clip_68/start_frame=0
animation/clip_68/end_frame=0
animation/clip_68/loops=false
animation/clip_69/name=""
animation/clip_69/start_frame=0
animation/clip_69/end_frame=0
animation/clip_69/loops=false
animation/clip_70/name=""
animation/clip_70/start_frame=0
animation/clip_70/end_frame=0
animation/clip_70/loops=false
animation/clip_71/name=""
animation/clip_71/start_frame=0
animation/clip_71/end_frame=0
animation/clip_71/loops=false
animation/clip_72/name=""
animation/clip_72/start_frame=0
animation/clip_72/end_frame=0
animation/clip_72/loops=false
animation/clip_73/name=""
animation/clip_73/start_frame=0
animation/clip_73/end_frame=0
animation/clip_73/loops=false
animation/clip_74/name=""
animation/clip_74/start_frame=0
animation/clip_74/end_frame=0
animation/clip_74/loops=false
animation/clip_75/name=""
animation/clip_75/start_frame=0
animation/clip_75/end_frame=0
animation/clip_75/loops=false
animation/clip_76/name=""
animation/clip_76/start_frame=0
animation/clip_76/end_frame=0
animation/clip_76/loops=false
animation/clip_77/name=""
animation/clip_77/start_frame=0
animation/clip_77/end_frame=0
animation/clip_77/loops=false
animation/clip_78/name=""
animation/clip_78/start_frame=0
animation/clip_78/end_frame=0
animation/clip_78/loops=false
animation/clip_79/name=""
animation/clip_79/start_frame=0
animation/clip_79/end_frame=0
animation/clip_79/loops=false
animation/clip_80/name=""
animation/clip_80/start_frame=0
animation/clip_80/end_frame=0
animation/clip_80/loops=false
animation/clip_81/name=""
animation/clip_81/start_frame=0
animation/clip_81/end_frame=0
animation/clip_81/loops=false
animation/clip_82/name=""
animation/clip_82/start_frame=0
animation/clip_82/end_frame=0
animation/clip_82/loops=false
animation/clip_83/name=""
animation/clip_83/start_frame=0
animation/clip_83/end_frame=0
animation/clip_83/loops=false
animation/clip_84/name=""
animation/clip_84/start_frame=0
animation/clip_84/end_frame=0
animation/clip_84/loops=false
animation/clip_85/name=""
animation/clip_85/start_frame=0
animation/clip_85/end_frame=0
animation/clip_85/loops=false
animation/clip_86/name=""
animation/clip_86/start_frame=0
animation/clip_86/end_frame=0
animation/clip_86/loops=false
animation/clip_87/name=""
animation/clip_87/start_frame=0
animation/clip_87/end_frame=0
animation/clip_87/loops=false
animation/clip_88/name=""
animation/clip_88/start_frame=0
animation/clip_88/end_frame=0
animation/clip_88/loops=false
animation/clip_89/name=""
animation/clip_89/start_frame=0
animation/clip_89/end_frame=0
animation/clip_89/loops=false
animation/clip_90/name=""
animation/clip_90/start_frame=0
animation/clip_90/end_frame=0
animation/clip_90/loops=false
animation/clip_91/name=""
animation/clip_91/start_frame=0
animation/clip_91/end_frame=0
animation/clip_91/loops=false
animation/clip_92/name=""
animation/clip_92/start_frame=0
animation/clip_92/end_frame=0
animation/clip_92/loops=false
animation/clip_93/name=""
animation/clip_93/start_frame=0
animation/clip_93/end_frame=0
animation/clip_93/loops=false
animation/clip_94/name=""
animation/clip_94/start_frame=0
animation/clip_94/end_frame=0
animation/clip_94/loops=false
animation/clip_95/name=""
animation/clip_95/start_frame=0
animation/clip_95/end_frame=0
animation/clip_95/loops=false
animation/clip_96/name=""
animation/clip_96/start_frame=0
animation/clip_96/end_frame=0
animation/clip_96/loops=false
animation/clip_97/name=""
animation/clip_97/start_frame=0
animation/clip_97/end_frame=0
animation/clip_97/loops=false
animation/clip_98/name=""
animation/clip_98/start_frame=0
animation/clip_98/end_frame=0
animation/clip_98/loops=false
animation/clip_99/name=""
animation/clip_99/start_frame=0
animation/clip_99/end_frame=0
animation/clip_99/loops=false
animation/clip_100/name=""
animation/clip_100/start_frame=0
animation/clip_100/end_frame=0
animation/clip_100/loops=false
animation/clip_101/name=""
animation/clip_101/start_frame=0
animation/clip_101/end_frame=0
animation/clip_101/loops=false
animation/clip_102/name=""
animation/clip_102/start_frame=0
animation/clip_102/end_frame=0
animation/clip_102/loops=false
animation/clip_103/name=""
animation/clip_103/start_frame=0
animation/clip_103/end_frame=0
animation/clip_103/loops=false
animation/clip_104/name=""
animation/clip_104/start_frame=0
animation/clip_104/end_frame=0
animation/clip_104/loops=false
animation/clip_105/name=""
animation/clip_105/start_frame=0
animation/clip_105/end_frame=0
animation/clip_105/loops=false
animation/clip_106/name=""
animation/clip_106/start_frame=0
animation/clip_106/end_frame=0
animation/clip_106/loops=false
animation/clip_107/name=""
animation/clip_107/start_frame=0
animation/clip_107/end_frame=0
animation/clip_107/loops=false
animation/clip_108/name=""
animation/clip_108/start_frame=0
animation/clip_108/end_frame=0
animation/clip_108/loops=false
animation/clip_109/name=""
animation/clip_109/start_frame=0
animation/clip_109/end_frame=0
animation/clip_109/loops=false
animation/clip_110/name=""
animation/clip_110/start_frame=0
animation/clip_110/end_frame=0
animation/clip_110/loops=false
animation/clip_111/name=""
animation/clip_111/start_frame=0
animation/clip_111/end_frame=0
animation/clip_111/loops=false
animation/clip_112/name=""
animation/clip_112/start_frame=0
animation/clip_112/end_frame=0
animation/clip_112/loops=false
animation/clip_113/name=""
animation/clip_113/start_frame=0
animation/clip_113/end_frame=0
animation/clip_113/loops=false
animation/clip_114/name=""
animation/clip_114/start_frame=0
animation/clip_114/end_frame=0
animation/clip_114/loops=false
animation/clip_115/name=""
animation/clip_115/start_frame=0
animation/clip_115/end_frame=0
animation/clip_115/loops=false
animation/clip_116/name=""
animation/clip_116/start_frame=0
animation/clip_116/end_frame=0
animation/clip_116/loops=false
animation/clip_117/name=""
animation/clip_117/start_frame=0
animation/clip_117/end_frame=0
animation/clip_117/loops=false
animation/clip_118/name=""
animation/clip_118/start_frame=0
animation/clip_118/end_frame=0
animation/clip_118/loops=false
animation/clip_119/name=""
animation/clip_119/start_frame=0
animation/clip_119/end_frame=0
animation/clip_119/loops=false
animation/clip_120/name=""
animation/clip_120/start_frame=0
animation/clip_120/end_frame=0
animation/clip_120/loops=false
animation/clip_121/name=""
animation/clip_121/start_frame=0
animation/clip_121/end_frame=0
animation/clip_121/loops=false
animation/clip_122/name=""
animation/clip_122/start_frame=0
animation/clip_122/end_frame=0
animation/clip_122/loops=false
animation/clip_123/name=""
animation/clip_123/start_frame=0
animation/clip_123/end_frame=0
animation/clip_123/loops=false
animation/clip_124/name=""
animation/clip_124/start_frame=0
animation/clip_124/end_frame=0
animation/clip_124/loops=false
animation/clip_125/name=""
animation/clip_125/start_frame=0
animation/clip_125/end_frame=0
animation/clip_125/loops=false
animation/clip_126/name=""
animation/clip_126/start_frame=0
animation/clip_126/end_frame=0
animation/clip_126/loops=false
animation/clip_127/name=""
animation/clip_127/start_frame=0
animation/clip_127/end_frame=0
animation/clip_127/loops=false
animation/clip_128/name=""
animation/clip_128/start_frame=0
animation/clip_128/end_frame=0
animation/clip_128/loops=false
animation/clip_129/name=""
animation/clip_129/start_frame=0
animation/clip_129/end_frame=0
animation/clip_129/loops=false
animation/clip_130/name=""
animation/clip_130/start_frame=0
animation/clip_130/end_frame=0
animation/clip_130/loops=false
animation/clip_131/name=""
animation/clip_131/start_frame=0
animation/clip_131/end_frame=0
animation/clip_131/loops=false
animation/clip_132/name=""
animation/clip_132/start_frame=0
animation/clip_132/end_frame=0
animation/clip_132/loops=false
animation/clip_133/name=""
animation/clip_133/start_frame=0
animation/clip_133/end_frame=0
animation/clip_133/loops=false
animation/clip_134/name=""
animation/clip_134/start_frame=0
animation/clip_134/end_frame=0
animation/clip_134/loops=false
animation/clip_135/name=""
animation/clip_135/start_frame=0
animation/clip_135/end_frame=0
animation/clip_135/loops=false
animation/clip_136/name=""
animation/clip_136/start_frame=0
animation/clip_136/end_frame=0
animation/clip_136/loops=false
animation/clip_137/name=""
animation/clip_137/start_frame=0
animation/clip_137/end_frame=0
animation/clip_137/loops=false
animation/clip_138/name=""
animation/clip_138/start_frame=0
animation/clip_138/end_frame=0
animation/clip_138/loops=false
animation/clip_139/name=""
animation/clip_139/start_frame=0
animation/clip_139/end_frame=0
animation/clip_139/loops=false
animation/clip_140/name=""
animation/clip_140/start_frame=0
animation/clip_140/end_frame=0
animation/clip_140/loops=false
animation/clip_141/name=""
animation/clip_141/start_frame=0
animation/clip_141/end_frame=0
animation/clip_141/loops=false
animation/clip_142/name=""
animation/clip_142/start_frame=0
animation/clip_142/end_frame=0
animation/clip_142/loops=false
animation/clip_143/name=""
animation/clip_143/start_frame=0
animation/clip_143/end_frame=0
animation/clip_143/loops=false
animation/clip_144/name=""
animation/clip_144/start_frame=0
animation/clip_144/end_frame=0
animation/clip_144/loops=false
animation/clip_145/name=""
animation/clip_145/start_frame=0
animation/clip_145/end_frame=0
animation/clip_145/loops=false
animation/clip_146/name=""
animation/clip_146/start_frame=0
animation/clip_146/end_frame=0
animation/clip_146/loops=false
animation/clip_147/name=""
animation/clip_147/start_frame=0
animation/clip_147/end_frame=0
animation/clip_147/loops=false
animation/clip_148/name=""
animation/clip_148/start_frame=0
animation/clip_148/end_frame=0
animation/clip_148/loops=false
animation/clip_149/name=""
animation/clip_149/start_frame=0
animation/clip_149/end_frame=0
animation/clip_149/loops=false
animation/clip_150/name=""
animation/clip_150/start_frame=0
animation/clip_150/end_frame=0
animation/clip_150/loops=false
animation/clip_151/name=""
animation/clip_151/start_frame=0
animation/clip_151/end_frame=0
animation/clip_151/loops=false
animation/clip_152/name=""
animation/clip_152/start_frame=0
animation/clip_152/end_frame=0
animation/clip_152/loops=false
animation/clip_153/name=""
animation/clip_153/start_frame=0
animation/clip_153/end_frame=0
animation/clip_153/loops=false
animation/clip_154/name=""
animation/clip_154/start_frame=0
animation/clip_154/end_frame=0
animation/clip_154/loops=false
animation/clip_155/name=""
animation/clip_155/start_frame=0
animation/clip_155/end_frame=0
animation/clip_155/loops=false
animation/clip_156/name=""
animation/clip_156/start_frame=0
animation/clip_156/end_frame=0
animation/clip_156/loops=false
animation/clip_157/name=""
animation/clip_157/start_frame=0
animation/clip_157/end_frame=0
animation/clip_157/loops=false
animation/clip_158/name=""
animation/clip_158/start_frame=0
animation/clip_158/end_frame=0
animation/clip_158/loops=false
animation/clip_159/name=""
animation/clip_159/start_frame=0
animation/clip_159/end_frame=0
animation/clip_159/loops=false
animation/clip_160/name=""
animation/clip_160/start_frame=0
animation/clip_160/end_frame=0
animation/clip_160/loops=false
animation/clip_161/name=""
animation/clip_161/start_frame=0
animation/clip_161/end_frame=0
animation/clip_161/loops=false
animation/clip_162/name=""
animation/clip_162/start_frame=0
animation/clip_162/end_frame=0
animation/clip_162/loops=false
animation/clip_163/name=""
animation/clip_163/start_frame=0
animation/clip_163/end_frame=0
animation/clip_163/loops=false
animation/clip_164/name=""
animation/clip_164/start_frame=0
animation/clip_164/end_frame=0
animation/clip_164/loops=false
animation/clip_165/name=""
animation/clip_165/start_frame=0
animation/clip_165/end_frame=0
animation/clip_165/loops=false
animation/clip_166/name=""
animation/clip_166/start_frame=0
animation/clip_166/end_frame=0
animation/clip_166/loops=false
animation/clip_167/name=""
animation/clip_167/start_frame=0
animation/clip_167/end_frame=0
animation/clip_167/loops=false
animation/clip_168/name=""
animation/clip_168/start_frame=0
animation/clip_168/end_frame=0
animation/clip_168/loops=false
animation/clip_169/name=""
animation/clip_169/start_frame=0
animation/clip_169/end_frame=0
animation/clip_169/loops=false
animation/clip_170/name=""
animation/clip_170/start_frame=0
animation/clip_170/end_frame=0
animation/clip_170/loops=false
animation/clip_171/name=""
animation/clip_171/start_frame=0
animation/clip_171/end_frame=0
animation/clip_171/loops=false
animation/clip_172/name=""
animation/clip_172/start_frame=0
animation/clip_172/end_frame=0
animation/clip_172/loops=false
animation/clip_173/name=""
animation/clip_173/start_frame=0
animation/clip_173/end_frame=0
animation/clip_173/loops=false
animation/clip_174/name=""
animation/clip_174/start_frame=0
animation/clip_174/end_frame=0
animation/clip_174/loops=false
animation/clip_175/name=""
animation/clip_175/start_frame=0
animation/clip_175/end_frame=0
animation/clip_175/loops=false
animation/clip_176/name=""
animation/clip_176/start_frame=0
animation/clip_176/end_frame=0
animation/clip_176/loops=false
animation/clip_177/name=""
animation/clip_177/start_frame=0
animation/clip_177/end_frame=0
animation/clip_177/loops=false
animation/clip_178/name=""
animation/clip_178/start_frame=0
animation/clip_178/end_frame=0
animation/clip_178/loops=false
animation/clip_179/name=""
animation/clip_179/start_frame=0
animation/clip_179/end_frame=0
animation/clip_179/loops=false
animation/clip_180/name=""
animation/clip_180/start_frame=0
animation/clip_180/end_frame=0
animation/clip_180/loops=false
animation/clip_181/name=""
animation/clip_181/start_frame=0
animation/clip_181/end_frame=0
animation/clip_181/loops=false
animation/clip_182/name=""
animation/clip_182/start_frame=0
animation/clip_182/end_frame=0
animation/clip_182/loops=false
animation/clip_183/name=""
animation/clip_183/start_frame=0
animation/clip_183/end_frame=0
animation/clip_183/loops=false
animation/clip_184/name=""
animation/clip_184/start_frame=0
animation/clip_184/end_frame=0
animation/clip_184/loops=false
animation/clip_185/name=""
animation/clip_185/start_frame=0
animation/clip_185/end_frame=0
animation/clip_185/loops=false
animation/clip_186/name=""
animation/clip_186/start_frame=0
animation/clip_186/end_frame=0
animation/clip_186/loops=false
animation/clip_187/name=""
animation/clip_187/start_frame=0
animation/clip_187/end_frame=0
animation/clip_187/loops=false
animation/clip_188/name=""
animation/clip_188/start_frame=0
animation/clip_188/end_frame=0
animation/clip_188/loops=false
animation/clip_189/name=""
animation/clip_189/start_frame=0
animation/clip_189/end_frame=0
animation/clip_189/loops=false
animation/clip_190/name=""
animation/clip_190/start_frame=0
animation/clip_190/end_frame=0
animation/clip_190/loops=false
animation/clip_191/name=""
animation/clip_191/start_frame=0
animation/clip_191/end_frame=0
animation/clip_191/loops=false
animation/clip_192/name=""
animation/clip_192/start_frame=0
animation/clip_192/end_frame=0
animation/clip_192/loops=false
animation/clip_193/name=""
animation/clip_193/start_frame=0
animation/clip_193/end_frame=0
animation/clip_193/loops=false
animation/clip_194/name=""
animation/clip_194/start_frame=0
animation/clip_194/end_frame=0
animation/clip_194/loops=false
animation/clip_195/name=""
animation/clip_195/start_frame=0
animation/clip_195/end_frame=0
animation/clip_195/loops=false
animation/clip_196/name=""
animation/clip_196/start_frame=0
animation/clip_196/end_frame=0
animation/clip_196/loops=false
animation/clip_197/name=""
animation/clip_197/start_frame=0
animation/clip_197/end_frame=0
animation/clip_197/loops=false
animation/clip_198/name=""
animation/clip_198/start_frame=0
animation/clip_198/end_frame=0
animation/clip_198/loops=false
animation/clip_199/name=""
animation/clip_199/start_frame=0
animation/clip_199/end_frame=0
animation/clip_199/loops=false
animation/clip_200/name=""
animation/clip_200/start_frame=0
animation/clip_200/end_frame=0
animation/clip_200/loops=false
animation/clip_201/name=""
animation/clip_201/start_frame=0
animation/clip_201/end_frame=0
animation/clip_201/loops=false
animation/clip_202/name=""
animation/clip_202/start_frame=0
animation/clip_202/end_frame=0
animation/clip_202/loops=false
animation/clip_203/name=""
animation/clip_203/start_frame=0
animation/clip_203/end_frame=0
animation/clip_203/loops=false
animation/clip_204/name=""
animation/clip_204/start_frame=0
animation/clip_204/end_frame=0
animation/clip_204/loops=false
animation/clip_205/name=""
animation/clip_205/start_frame=0
animation/clip_205/end_frame=0
animation/clip_205/loops=false
animation/clip_206/name=""
animation/clip_206/start_frame=0
animation/clip_206/end_frame=0
animation/clip_206/loops=false
animation/clip_207/name=""
animation/clip_207/start_frame=0
animation/clip_207/end_frame=0
animation/clip_207/loops=false
animation/clip_208/name=""
animation/clip_208/start_frame=0
animation/clip_208/end_frame=0
animation/clip_208/loops=false
animation/clip_209/name=""
animation/clip_209/start_frame=0
animation/clip_209/end_frame=0
animation/clip_209/loops=false
animation/clip_210/name=""
animation/clip_210/start_frame=0
animation/clip_210/end_frame=0
animation/clip_210/loops=false
animation/clip_211/name=""
animation/clip_211/start_frame=0
animation/clip_211/end_frame=0
animation/clip_211/loops=false
animation/clip_212/name=""
animation/clip_212/start_frame=0
animation/clip_212/end_frame=0
animation/clip_212/loops=false
animation/clip_213/name=""
animation/clip_213/start_frame=0
animation/clip_213/end_frame=0
animation/clip_213/loops=false
animation/clip_214/name=""
animation/clip_214/start_frame=0
animation/clip_214/end_frame=0
animation/clip_214/loops=false
animation/clip_215/name=""
animation/clip_215/start_frame=0
animation/clip_215/end_frame=0
animation/clip_215/loops=false
animation/clip_216/name=""
animation/clip_216/start_frame=0
animation/clip_216/end_frame=0
animation/clip_216/loops=false
animation/clip_217/name=""
animation/clip_217/start_frame=0
animation/clip_217/end_frame=0
animation/clip_217/loops=false
animation/clip_218/name=""
animation/clip_218/start_frame=0
animation/clip_218/end_frame=0
animation/clip_218/loops=false
animation/clip_219/name=""
animation/clip_219/start_frame=0
animation/clip_219/end_frame=0
animation/clip_219/loops=false
animation/clip_220/name=""
animation/clip_220/start_frame=0
animation/clip_220/end_frame=0
animation/clip_220/loops=false
animation/clip_221/name=""
animation/clip_221/start_frame=0
animation/clip_221/end_frame=0
animation/clip_221/loops=false
animation/clip_222/name=""
animation/clip_222/start_frame=0
animation/clip_222/end_frame=0
animation/clip_222/loops=false
animation/clip_223/name=""
animation/clip_223/start_frame=0
animation/clip_223/end_frame=0
animation/clip_223/loops=false
animation/clip_224/name=""
animation/clip_224/start_frame=0
animation/clip_224/end_frame=0
animation/clip_224/loops=false
animation/clip_225/name=""
animation/clip_225/start_frame=0
animation/clip_225/end_frame=0
animation/clip_225/loops=false
animation/clip_226/name=""
animation/clip_226/start_frame=0
animation/clip_226/end_frame=0
animation/clip_226/loops=false
animation/clip_227/name=""
animation/clip_227/start_frame=0
animation/clip_227/end_frame=0
animation/clip_227/loops=false
animation/clip_228/name=""
animation/clip_228/start_frame=0
animation/clip_228/end_frame=0
animation/clip_228/loops=false
animation/clip_229/name=""
animation/clip_229/start_frame=0
animation/clip_229/end_frame=0
animation/clip_229/loops=false
animation/clip_230/name=""
animation/clip_230/start_frame=0
animation/clip_230/end_frame=0
animation/clip_230/loops=false
animation/clip_231/name=""
animation/clip_231/start_frame=0
animation/clip_231/end_frame=0
animation/clip_231/loops=false
animation/clip_232/name=""
animation/clip_232/start_frame=0
animation/clip_232/end_frame=0
animation/clip_232/loops=false
animation/clip_233/name=""
animation/clip_233/start_frame=0
animation/clip_233/end_frame=0
animation/clip_233/loops=false
animation/clip_234/name=""
animation/clip_234/start_frame=0
animation/clip_234/end_frame=0
animation/clip_234/loops=false
animation/clip_235/name=""
animation/clip_235/start_frame=0
animation/clip_235/end_frame=0
animation/clip_235/loops=false
animation/clip_236/name=""
animation/clip_236/start_frame=0
animation/clip_236/end_frame=0
animation/clip_236/loops=false
animation/clip_237/name=""
animation/clip_237/start_frame=0
animation/clip_237/end_frame=0
animation/clip_237/loops=false
animation/clip_238/name=""
animation/clip_238/start_frame=0
animation/clip_238/end_frame=0
animation/clip_238/loops=false
animation/clip_239/name=""
animation/clip_239/start_frame=0
animation/clip_239/end_frame=0
animation/clip_239/loops=false
animation/clip_240/name=""
animation/clip_240/start_frame=0
animation/clip_240/end_frame=0
animation/clip_240/loops=false
animation/clip_241/name=""
animation/clip_241/start_frame=0
animation/clip_241/end_frame=0
animation/clip_241/loops=false
animation/clip_242/name=""
animation/clip_242/start_frame=0
animation/clip_242/end_frame=0
animation/clip_242/loops=false
animation/clip_243/name=""
animation/clip_243/start_frame=0
animation/clip_243/end_frame=0
animation/clip_243/loops=false
animation/clip_244/name=""
animation/clip_244/start_frame=0
animation/clip_244/end_frame=0
animation/clip_244/loops=false
animation/clip_245/name=""
animation/clip_245/start_frame=0
animation/clip_245/end_frame=0
animation/clip_245/loops=false
animation/clip_246/name=""
animation/clip_246/start_frame=0
animation/clip_246/end_frame=0
animation/clip_246/loops=false
animation/clip_247/name=""
animation/clip_247/start_frame=0
animation/clip_247/end_frame=0
animation/clip_247/loops=false
animation/clip_248/name=""
animation/clip_248/start_frame=0
animation/clip_248/end_frame=0
animation/clip_248/loops=false
animation/clip_249/name=""
animation/clip_249/start_frame=0
animation/clip_249/end_frame=0
animation/clip_249/loops=false
animation/clip_250/name=""
animation/clip_250/start_frame=0
animation/clip_250/end_frame=0
animation/clip_250/loops=false
animation/clip_251/name=""
animation/clip_251/start_frame=0
animation/clip_251/end_frame=0
animation/clip_251/loops=false
animation/clip_252/name=""
animation/clip_252/start_frame=0
animation/clip_252/end_frame=0
animation/clip_252/loops=false
animation/clip_253/name=""
animation/clip_253/start_frame=0
animation/clip_253/end_frame=0
animation/clip_253/loops=false
animation/clip_254/name=""
animation/clip_254/start_frame=0
animation/clip_254/end_frame=0
animation/clip_254/loops=false
animation/clip_255/name=""
animation/clip_255/start_frame=0
animation/clip_255/end_frame=0
animation/clip_255/loops=false
animation/clip_256/name=""
animation/clip_256/start_frame=0
animation/clip_256/end_frame=0
animation/clip_256/loops=false
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/celilo.png-47499df231bb4886ea8e9433f8b1c0af.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://blokoj/kosmosxipoj/resursoj/celilo.png"
dest_files=[ "res://.import/celilo.png-47499df231bb4886ea8e9433f8b1c0af.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0
Нет предварительного просмотра для этого типа файлов
Нет предварительного просмотра для этого типа файлов
Нет предварительного просмотра для этого типа файлов
Нет предварительного просмотра для этого типа файлов
Нет предварительного просмотра для этого типа файлов
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать