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

Merge branch 'develop' into 'master'

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

See merge request tehnokom/universo!186
владельцы fa3ef46e 5d3b30da
[gd_scene load_steps=3 format=2] [gd_scene load_steps=4 format=2]
[ext_resource path="res://blokoj/kosmo/skriptoj/ship.gd" type="Script" id=2] [ext_resource path="res://blokoj/kosmosxipoj/skriptoj/base_ship.gd" type="Script" id=1]
[sub_resource type="CapsuleShape" id=1] [sub_resource type="CapsuleShape" id=1]
radius = 3.29615 radius = 3.29615
height = 9.14674 height = 9.14674
[sub_resource type="StreamTexture" id=2]
flags = 7
load_path = "res://.import/violet_frame.png-87830372cca8a5ac122306709e6d8376.s3tc.stex"
[node name="ship" type="KinematicBody"] [node name="ship" type="KinematicBody"]
script = ExtResource( 2 ) script = ExtResource( 1 )
[node name="CollisionShape" type="CollisionShape" parent="."] [node name="CollisionShape" type="CollisionShape" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.06553, 5.3188 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.06553, 5.3188 )
shape = SubResource( 1 ) shape = SubResource( 1 )
[node name="Control" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
__meta__ = {
"_edit_use_anchors_": false
}
[node name="kanonadi" type="CheckButton" parent="Control"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -39.4319
margin_top = -91.2313
margin_right = 36.5681
margin_bottom = -37.2313
__meta__ = {
"_edit_use_anchors_": false
}
[node name="livero" type="ProgressBar" parent="Control/kanonadi"]
margin_left = -28.6565
margin_top = 59.7245
margin_right = 112.343
margin_bottom = 92.7245
step = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="celilo" type="TextureRect" parent="Control"]
visible = false
margin_left = 796.335
margin_top = 58.9282
margin_right = 846.335
margin_bottom = 108.928
texture = SubResource( 2 )
expand = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="label" type="Label" parent="Control/celilo"]
anchor_top = 1.0
anchor_bottom = 1.0
margin_left = -7.0
margin_top = 13.0
margin_right = 70.0
margin_bottom = 47.0
[connection signal="pressed" from="Control/kanonadi" to="." method="_on_kanonadi_pressed"]
Это отличие свёрнуто
Это отличие свёрнуто
...@@ -4,104 +4,19 @@ ...@@ -4,104 +4,19 @@
[ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/tubo.tscn" type="PackedScene" id=2] [ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/tubo.tscn" type="PackedScene" id=2]
[ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/platform.tscn" type="PackedScene" id=3] [ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/platform.tscn" type="PackedScene" id=3]
[ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/turret.tscn" type="PackedScene" id=4] [ext_resource path="res://blokoj/kosmosxipoj/scenoj/moduloj/laser01/turret.tscn" type="PackedScene" id=4]
[ext_resource path="res://blokoj/kosmosxipoj/skriptoj/moduloj/laser.gd" type="Script" id=5]
[sub_resource type="GDScript" id=1] [sub_resource type="CylinderMesh" id=1]
script/source = "extends Spatial
var uuid #нужно для идентификации конкретного модуля
export (float) var beam_length = 1000
export (float) var speed_rotation = 3
export (Color, RGBA) var laser_color :Color = Color(1.0,0.0,0.0,1.0)
export var x_limiter: Vector2=Vector2(0.0,90.0)
export var y_limiter: Vector2=Vector2(-90.0,90.0)
var target = null
func _ready():
# target=get_parent().route #это потом удалить, здесь тестовое получение цели.
$laser.cast_to.z = -beam_length #устанавливаем максимальную дальность лазера.
$laser/beam/MeshInstance.mesh.material.set(\"shader_param/laser_color\",laser_color)
$laser/beam/MeshInstance2.mesh.material.set(\"shader_param/laser_color\",laser_color)
func rotate_gun(delta):
var temp = transform.basis #сохраняем старый базис
# look_at(target.back().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
look_at(target.get_global_transform().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
var target_rot = transform.basis#сохраняем целевой базис
transform.basis = temp#восстанавливаем изначальный базис
$laser.transform.basis = $laser.transform.basis.slerp(target_rot,speed_rotation*delta) # постепенно поворачиваем к цели
$laser.rotation_degrees.x = clamp($laser.rotation_degrees.x,x_limiter.x,x_limiter.y)# ограничиваем вращение пушки вниз, чтобы стреляла только в верхнюю полусферу
# $laser.rotation_degrees.y = clamp($laser.rotation_degrees.y,y_limiter.x,y_limiter.y)# ограничиваем вращение пушки по сторонам, если нужно
$gun_body.rotation.y = $laser.rotation.y
$Turret.rotation.y = $laser.rotation.y
func get_uuid(object):
# print('==name==',object.name)
if object.get('uuid'):
# print('=uuid==',object.uuid)
return object.uuid
else:
return get_uuid(object.get_parent())
func _physics_process(delta):
if target:
# print('цель задана')
var length_to_end=beam_length
var can_shoot = false
# if !target.empty():
rotate_gun(delta)
if $laser.is_colliding():
var uuid = \"\"
if $laser.get_collider().get('uuid'):
uuid = $laser.get_collider().uuid
else: # для станции идём по восходящим родителям до нахождения uuid
# print('ищем uuid')
uuid = get_uuid($laser.get_collider().get_parent())
if uuid == target.uuid:
# print('стреляем = ',uuid)
# print($laser.get_collider().name) #тут можно обработать в кого мы попали и вызвать повреждения.
length_to_end = get_global_transform().origin.distance_to($laser.get_collision_point())
can_shoot = true
$laser/end_point.visible = true
$laser/beam.visible = true
else:
$laser/end_point.visible = false
$laser/beam.visible = false
else:
$laser/end_point.visible = false
$laser/beam.visible = false
if can_shoot:
$laser/beam.scale.z=length_to_end
$laser/end_point.translation.z = -length_to_end
$laser/end_point/Particles.emitting = true
else:
$laser/end_point/Particles.emitting = false
$laser/beam.scale.z=0.1
$laser/end_point.translation.z = 0
else:
$laser/end_point.visible = false
$laser/beam.visible = false
func set_target(targeto):
if targeto:
target = targeto
print('установили цель == ',targeto.uuid)
"
[sub_resource type="CylinderMesh" id=2]
top_radius = 0.11 top_radius = 0.11
bottom_radius = 0.11 bottom_radius = 0.11
height = 1.0 height = 1.0
radial_segments = 12 radial_segments = 12
rings = 1 rings = 1
[sub_resource type="SpatialMaterial" id=3] [sub_resource type="SpatialMaterial" id=2]
albedo_color = Color( 0.0431373, 0.231373, 0.972549, 1 ) albedo_color = Color( 0.0431373, 0.231373, 0.972549, 1 )
[sub_resource type="SpatialMaterial" id=4] [sub_resource type="SpatialMaterial" id=3]
params_billboard_mode = 3 params_billboard_mode = 3
particles_anim_h_frames = 1 particles_anim_h_frames = 1
particles_anim_v_frames = 1 particles_anim_v_frames = 1
...@@ -113,36 +28,36 @@ emission_energy = 16.0 ...@@ -113,36 +28,36 @@ emission_energy = 16.0
emission_operator = 0 emission_operator = 0
emission_on_uv2 = false emission_on_uv2 = false
[sub_resource type="Curve" id=5] [sub_resource type="Curve" id=4]
_data = [ Vector2( 0.0253165, 0.990909 ), 0.0, 0.0, 0, 0, Vector2( 0.962025, 0 ), 0.0, 0.0, 0, 0 ] _data = [ Vector2( 0.0253165, 0.990909 ), 0.0, 0.0, 0, 0, Vector2( 0.962025, 0 ), 0.0, 0.0, 0, 0 ]
[sub_resource type="CurveTexture" id=6] [sub_resource type="CurveTexture" id=5]
width = 512 width = 512
curve = SubResource( 5 ) curve = SubResource( 4 )
[sub_resource type="ParticlesMaterial" id=7] [sub_resource type="ParticlesMaterial" id=6]
lifetime_randomness = 0.5 lifetime_randomness = 0.5
trail_size_modifier = SubResource( 6 ) trail_size_modifier = SubResource( 5 )
direction = Vector3( 0, 0, 1 ) direction = Vector3( 0, 0, 1 )
gravity = Vector3( 0, 0, 0 ) gravity = Vector3( 0, 0, 0 )
initial_velocity = 34.48 initial_velocity = 34.48
initial_velocity_random = 0.72 initial_velocity_random = 0.72
[sub_resource type="QuadMesh" id=8] [sub_resource type="QuadMesh" id=7]
size = Vector2( 0.1, 0.1 ) size = Vector2( 0.1, 0.1 )
[sub_resource type="QuadMesh" id=9] [sub_resource type="QuadMesh" id=8]
material = ExtResource( 1 ) material = ExtResource( 1 )
size = Vector2( 1, 0.3 ) size = Vector2( 1, 0.3 )
[sub_resource type="CubeMesh" id=10] [sub_resource type="CubeMesh" id=9]
size = Vector3( 1, 0.5, 1 ) size = Vector3( 1, 0.5, 1 )
[sub_resource type="SpatialMaterial" id=11] [sub_resource type="SpatialMaterial" id=10]
albedo_color = Color( 1, 1, 0, 1 ) albedo_color = Color( 1, 1, 0, 1 )
[node name="laser_gun" type="Spatial"] [node name="laser_gun" type="Spatial"]
script = SubResource( 1 ) script = ExtResource( 5 )
[node name="laser" type="RayCast" parent="."] [node name="laser" type="RayCast" parent="."]
enabled = true enabled = true
...@@ -153,8 +68,8 @@ collide_with_areas = true ...@@ -153,8 +68,8 @@ collide_with_areas = true
[node name="gun_stem" type="MeshInstance" parent="laser"] [node name="gun_stem" type="MeshInstance" parent="laser"]
transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, -0.5 ) transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, -0.5 )
visible = false visible = false
mesh = SubResource( 2 ) mesh = SubResource( 1 )
material/0 = SubResource( 3 ) material/0 = SubResource( 2 )
[node name="end_point" type="Spatial" parent="laser"] [node name="end_point" type="Spatial" parent="laser"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 )
...@@ -162,12 +77,12 @@ visible = false ...@@ -162,12 +77,12 @@ visible = false
[node name="Particles" type="Particles" parent="laser/end_point"] [node name="Particles" type="Particles" parent="laser/end_point"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 0.01, 0, 0, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 0.01, 0, 0, 0 )
material_override = SubResource( 4 ) material_override = SubResource( 3 )
cast_shadow = 0 cast_shadow = 0
amount = 50 amount = 50
lifetime = 0.21 lifetime = 0.21
process_material = SubResource( 7 ) process_material = SubResource( 6 )
draw_pass_1 = SubResource( 8 ) draw_pass_1 = SubResource( 7 )
[node name="beam" type="Spatial" parent="laser"] [node name="beam" type="Spatial" parent="laser"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0 )
...@@ -176,13 +91,13 @@ visible = false ...@@ -176,13 +91,13 @@ visible = false
[node name="MeshInstance" type="MeshInstance" parent="laser/beam"] [node name="MeshInstance" type="MeshInstance" parent="laser/beam"]
transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 0, 0, -0.5 ) transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 0, 0, -0.5 )
cast_shadow = 0 cast_shadow = 0
mesh = SubResource( 9 ) mesh = SubResource( 8 )
material/0 = null material/0 = null
[node name="MeshInstance2" type="MeshInstance" parent="laser/beam"] [node name="MeshInstance2" type="MeshInstance" parent="laser/beam"]
transform = Transform( -1.62921e-07, 1, -1.62921e-07, 0, -1.62921e-07, -1, -1, -1.62921e-07, 2.65431e-14, 0, 0, -0.5 ) transform = Transform( -1.62921e-07, 1, -1.62921e-07, 0, -1.62921e-07, -1, -1, -1.62921e-07, 2.65431e-14, 0, 0, -0.5 )
cast_shadow = 0 cast_shadow = 0
mesh = SubResource( 9 ) mesh = SubResource( 8 )
material/0 = ExtResource( 1 ) material/0 = ExtResource( 1 )
[node name="tubo" parent="laser" instance=ExtResource( 2 )] [node name="tubo" parent="laser" instance=ExtResource( 2 )]
...@@ -190,8 +105,8 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0 ) ...@@ -190,8 +105,8 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0 )
[node name="gun_body" type="MeshInstance" parent="."] [node name="gun_body" type="MeshInstance" parent="."]
visible = false visible = false
mesh = SubResource( 10 ) mesh = SubResource( 9 )
material/0 = SubResource( 11 ) material/0 = SubResource( 10 )
[node name="Platform" parent="." instance=ExtResource( 3 )] [node name="Platform" parent="." instance=ExtResource( 3 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.2, 0 )
......
...@@ -10,3 +10,14 @@ script = ExtResource( 1 ) ...@@ -10,3 +10,14 @@ script = ExtResource( 1 )
[node name="CollisionShape" type="CollisionShape" parent="."] [node name="CollisionShape" type="CollisionShape" parent="."]
transform = Transform( 3.42192, 0, 0, 0, 5.04557, 0, 0, 0, 9.53607, 0, 0, 0 ) transform = Transform( 3.42192, 0, 0, 0, 5.04557, 0, 0, 0, 9.53607, 0, 0, 0 )
shape = SubResource( 1 ) shape = SubResource( 1 )
[node name="control" type="Control" parent="."]
margin_right = 40.0
margin_bottom = 40.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="rapido" type="Label" parent="control"]
margin_right = 40.0
margin_bottom = 17.0
[gd_scene format=2]
[node name="Control" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="canonadi" type="CheckButton" parent="."]
anchor_left = 0.19
anchor_top = 0.705
anchor_right = 0.19
anchor_bottom = 0.705
margin_left = 111.08
margin_top = 61.4537
margin_right = 187.08
margin_bottom = 101.454
[node name="livero" type="ProgressBar" parent="canonadi"]
margin_left = 2.15845
margin_top = 47.4862
margin_right = 75.1584
margin_bottom = 64.4862
extends KinematicBody
export var Sensitivity_X: float = 0.01
export var Sensitivity_Y: float = 0.01
const ZOOM_MIN = 1
const ZOOM_MAX = 50
const Zoom_Step: float = 1.0
#const MIN_ROT_Y = -1.55 #(89 градусов)
#const MAX_ROT_Y = 0.79 #(45 градусов)
var max_speed =500.0
# текущая скорость
var current_speed =0
var acceleration = 1
var way_point: Vector3 = Vector3() # Координаты точки, в которую летим
var target_dir: Vector3 = Vector3.ZERO #направление на эту точку от текущей позиции корабля
var target_rot = null #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation = 1
var middle_mouse_pressed = false
var docking_rotation
var uuid #uuid активного корабля игрока
#var objekto
var integreco # целостность объекта
var potenco # мощность ресурса
# взятые в прицел, массив объектов, взятых в прицел
var pafado_uuid # uuid проекта ведения огня
var pafado_id # id запроса на создание проекта ведения огня
var celilo_id = [] # id переданных запросов на сервер п
var pafado_celo = [] # на какой объект отправили запрос на установку цели
var celilo = [] # список целей
var elektita_celilo = 0 # выбранная цель
var max_celilo = 1 # максимальное количество прицелов
var armiloj = [] # ссылка на оружие корабля
func _ready():
$CollisionShape.queue_free() # что бы в процессе редактирования не выдавало ошибку есть данная нода
# подключаем сигнал для обработки входящих данных
var err = Net.connect("input_data", self, "_on_data")
if err:
print('error = ',err)
func _physics_process(delta):
# если категория задачи равна категории движения объекта, тогда двигаемся
if !(Global.fenestro_itinero.itineroj.empty() or \
Global.fenestro_itinero.itinero_pause) and \
(Global.fenestro_itinero.itineroj.front()['kategorio']==Net.kategorio_movado): #Если цель существует, двигаемся
if !target_rot:
# print('target_rot = ',Global.fenestro_itinero.itineroj.front()['transform'].origin)
target_rot = Quat(transform.looking_at(Global.fenestro_itinero.itineroj.front()['transform'].origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
var target_dir = (Global.fenestro_itinero.itineroj.front()['transform'].origin - translation).normalized()
var distance = translation.distance_to(Global.fenestro_itinero.itineroj.front()['transform'].origin)
if (len (Global.fenestro_itinero.itineroj)>1) and \
(Global.fenestro_itinero.itineroj[1]['kategorio']==Net.kategorio_movado):
# проверяем, если следующая точка является движением
if distance <1: #Если это не последняя точка, то мы не тормозим, так что завышаем расстояние, чтобы не проскочить эту точку
dec_route()
return
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else:
if distance > max_speed*delta/acceleration:#Тут сомнительная формула от фонаря, вычисляющая примерно откуда надо начинать тормозить корабль.
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
var a = Quat(transform.basis)
var c = a.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
transform.basis = Basis(c)
# transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else: #Если это последняя точка, то мы тормозим, и задаём минимальное расстояние, чтобы точнее выставить корабль
current_speed = lerp(current_speed,50,delta*acceleration)#замедляемся
if Global.fenestro_itinero.itineroj.front()['transform'].basis !=Basis.IDENTITY:
transform.basis = transform.basis.slerp(Quat(Global.fenestro_itinero.itineroj.front()['transform'].basis),speed_rotation*delta*1.5) #поворачиваем в дефолтное состояние, чтобы сесть
if distance <0.01:
if Global.fenestro_itinero.itineroj.front()['transform'].basis !=Basis.IDENTITY:
transform.basis = Global.fenestro_itinero.itineroj.front()['transform'].basis
translation = Global.fenestro_itinero.itineroj.front()['transform'].origin
clear_route()
return
# warning-ignore:return_value_discarded
move_and_slide(target_dir*delta*current_speed) #Двигаемся к цели и тут можно передать transform на сервер
Title.get_node("CanvasLayer/UI/Objektoj/Window").distance_to(translation)
# вывод целей на экран
# if get_node_or_null('Control'):
# если есть цель или был произведн выстрел и идёт перезарядка, то продолжаем считывать показатели перезарядки
if (celilo.size()>0) or ($Control/kanonadi/livero.value>0):
$Control/kanonadi/livero.value = armiloj.front().livero
# else:
# $Control/celilo.set_visible(false)
# $Control/celilo/label.text = ''
func _on_data():
var i_data_server = 0
for on_data in Net.data_server:
celilo_id
var celilo_index = celilo_id.find(int(on_data['id']))
if celilo_index>-1:
# пришло сообщение, по установлению цели
celilo_id.remove(celilo_index)
Net.data_server.remove(i_data_server)
elif int(on_data['id']) == pafado_id:
# пришло сообщение, по созданию проекта стрельбы
pafado_uuid = on_data['payload']['data']['redaktuUniversoProjekto']['universoProjekto']['uuid']
send_celilo(pafado_celo)
pafado_id = null
Net.data_server.remove(i_data_server)
else:
print('on_data else=', on_data)
# elif on_data['payload']['data'].get('filteredUniversoObjekto'):
# pass
# Net.data_server.remove(i_data_server)
i_data_server += 1
const QueryObject = preload("queries.gd")
# устанавливаем цель
func set_celilo(celo):
# если количество максимальных прицеливаний больше взятых в прицел, тогда берём в прицел
if max_celilo<=len(celilo):
return false
if !celo.get('uuid'):
return false
celilo.append(celo)
$Control/celilo.set_visible(true)
$Control/celilo/label.text = celilo.front().uuid
if pafado_uuid: # если проект стрельбы есть, сразу отправляем цель
send_celilo(celo)
else:
var q = QueryObject.new()
pafado_id = Net.get_current_query_id()
pafado_celo = celo
Net.send_json(q.pafado_json(
Global.direktebla_objekto[Global.realeco-2]['uuid'],pafado_id
))
# создаём проект ведения огня
pass
# отправляем на сервер установку цели
func send_celilo(celo):
var q = QueryObject.new()
var id = Net.get_current_query_id()
celilo_id.append(id)
Net.send_json(q.celilo_json(
pafado_uuid,
Global.direktebla_objekto[Global.realeco-2]['uuid'], # uuid объекта управления
translation.x, #kom_koordX
translation.y, #kom_koordY
translation.z, #kom_koordZ
celo.uuid,
celo.translation.x, #kom_koordX
celo.translation.y, #kom_koordY
celo.translation.z, #kom_koordZ
id
))
func rotate_start():# поворачиваем корабль носом по ходу движения
var front = Transform(Basis.IDENTITY, Vector3(Global.fenestro_itinero.itineroj.front()['koordinatoX'],
Global.fenestro_itinero.itineroj.front()['koordinatoY'],
Global.fenestro_itinero.itineroj.front()['koordinatoZ']))
target_rot = Quat(transform.looking_at(front.origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
func dec_route():
target_rot = null
Global.fenestro_itinero.malmultigi_unua()
rotate_start()
func clear_route():
target_rot = null
# достигли цели, закрываем проект
Global.fenestro_itinero.fermi_projekto_tasko()
func _on_kanonadi_pressed():
if celilo.size()>0:
if $Control/kanonadi.pressed:
# постановка цели оружию
get_node("laser_gun").set_target(celilo.front())
else:
get_node("laser_gun").set_target(null)
else:
$Control/kanonadi.pressed = false
get_node("laser_gun").pafado = false
# отправляем выстрел на сервер (передаются объекты в космосе)
# armile - выстреливше оружие
# celo - цель
func pafo_server(armilo, celo):
var q = QueryObject.new()
var id = Net.get_current_query_id()
# Global.fenestro_kosmo.id_net.append(id)
Global.fenestro_kosmo.id_pafo.append(id) # до создания сервера удаляет сам клиент
Net.send_json(q.pafo_json(
pafado_uuid,
armilo.uuid, # uuid стреляющего
translation.x, #kom_koordX
translation.y, #kom_koordY
translation.z, #kom_koordZ
celo.uuid,
celo.translation.x, #kom_koordX
celo.translation.y, #kom_koordY
celo.translation.z, #kom_koordZ
id
))
# пришла с сервера задача выстрела
func pafo(projekto, tasko):
print('=== в стрельбу СВОЮ попали КОСЯК!!!')
pass
extends Node
# модуль создания маршрутов
# - движения
# - стрельбы
# анализируем (разбираем) проект с сервера и распределяем по соответствующим направлениям
# projektoj - массив проектов, пришедший с сервера
# sxipo - указатель на корабль, которому делаем
# fenestro_itinero - форма маршрута движения
func analizo_projekto(projektoj, sxipo, fenestro_itinero):
#проходим по списку проектов и распределяем по назначениям
var one_movado = false # признак, что проект движения уже был и следующий закрываем
var i_projektoj = 0
fenestro_itinero.projekto_itineroj_uuid=''
for prj in projektoj:
for kategorio in prj['node']['kategorio']['edges']:
# выбираем проекты с категорией движения
if kategorio['node']['objId'] == Net.kategorio_movado: # это проект движения
if one_movado:
# if 'send_fermi_projekto' in sxipo: # альтернативные записи
if fenestro_itinero.get('send_fermi_projekto'):
print('закрываем проект, т.к. проект движения уже есть!!! должно быть на стороне сервера')
fenestro_itinero.send_fermi_projekto(prj['node']['uuid'])
# удаляем данный проект из списка
projektoj.remove(i_projektoj)
else:
# проверяем, что есть действующие задачи движения, если нет - закрываем проект
if len(prj['node']['tasko']['edges'])==0:
if fenestro_itinero.get('send_fermi_projekto'):
print('закрываем проект, т.к. нет задач!!! должно быть на стороне сервера')
fenestro_itinero.send_fermi_projekto(prj['node']['uuid'])
# закрываем проект, т.к. нет задач!!! должно быть на стороне сервера
else:
# очищаем маршрут
fenestro_itinero.malplenigi_itinero()
#заполняем маршрут
# var pozicio = 0
for tasko in prj['node']['tasko']['edges']:
fenestro_itinero.sxangxi_itinero(prj['node'], tasko['node'])
#задачу, которая "В работе" ставим первой
# if tasko['node']['statuso']['objId']==Net.statuso_laboranta \
# or tasko['node']['statuso']['objId']==Net.status_pauzo: # или задачу, которая на "Паузе"
# fenestro_itinero.add_itinero(
# tasko['node']['uuid'],
# '',
# 'координаты в космосе',
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'],
# Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'])),
# $ship.translation.distance_to(Vector3(
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ']),
# Net.kategorio_movado
# ))
# if tasko['node']['statuso']['objId']==Net.status_pauzo:#задачу, которая "В работе" ставим первой
# Global.fenestro_itinero.itinero_pause = true
# break;
# for tasko in prj['node']['tasko']['edges']:
# if tasko['node']['statuso']['objId']==Net.statuso_nova:# добавляем остальные задачи
# Global.fenestro_itinero.add_itinero(
# tasko['node']['uuid'],
# '',
# 'координаты в космосе',
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'],
# Transform(Basis.IDENTITY, Vector3(tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ'])),
# $ship.translation.distance_to(Vector3(
# tasko['node']['finKoordinatoX'],
# tasko['node']['finKoordinatoY'],
# tasko['node']['finKoordinatoZ']),
# Net.kategorio_movado
# ))
# if len(Global.fenestro_itinero.itineroj)>0:# есть задачи на полёт, устанавливаем uuid проекта
# Global.fenestro_itinero.projekto_itineroj_uuid=prj['node']['uuid']
# #отправляем корабль по координатам
# Global.fenestro_itinero.itinero_pause = false
# #запускаем таймер
# $timer.start()
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/kom_itinero").disabled=true
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_next").disabled=false
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_fin").disabled=false
# Global.fenestro_itinero.get_node("canvas/MarginContainer/VBoxContainer/HBoxContainer/itinero_clear").disabled=false
# one_movado = true
# else: # закрываемп проект, т.к. в нем нет действующих задач
# pass
elif kategorio['node']['objId'] == Net.projekto_kategorio_pafado: # это проект стрельбы
# закрываем проект
# print('=== закрываем проект v3=',prj['node']['uuid'],'==',fenestro_itinero.name)
if fenestro_itinero == Global.fenestro_itinero:
# print('закрываем проект, т.к. проекта стрельбы при входе быть не должно')
fenestro_itinero.send_fermi_projekto(prj['node']['uuid'])
# удаляем данный проект из списка
projektoj.remove(i_projektoj)
# else:
# print('==uuid=',fenestro_itinero.uuid)
# else:
# print('=== категория = ',kategorio['node']['objId'])
i_projektoj += 1
extends Spatial
var uuid #нужно для идентификации конкретного модуля
var objekto_modulo
var integreco # целостность объекта
var potenco # мощность ресурса
export (float) var beam_length = 1000
export (float) var speed_rotation = 3
export (Color, RGBA) var laser_color :Color = Color(1.0,0.0,0.0,1.0)
export var x_limiter: Vector2=Vector2(0.0,90.0)
export var y_limiter: Vector2=Vector2(-90.0,90.0)
var new_target = null # задание новой цели
#если таргет сняли или поменяли до окончания показа выстрела, то выстрел демонстрируем до конца по старой цели
var target = null # ведём цель и стреляем
var livero = 0 # произошел выстрел на 1 перезарядка
var id_livero = [] # id ответов по произведённым выстрелам, уменьшаем кол-во боезапаса
var tuttempe_pafo = 50 # втечении времени показывать выстрел
var malfruo = 100 # время задержки выстрела/перезарядка
var kvanto_pafajho = -1 # количество снарядов Если -1 то бесконечный боезапас
#сам лазер отправляет на сервер что он выстрелил и по кому
# обрабатывает результат выстрела оружие - уменьшая кол-во боеприпасов у себя в заряде
var sxipo # указатель на корабль, где установлено данное оружие. Нужно для ведения огня
func _ready():
# target=get_parent().route #это потом удалить, здесь тестовое получение цели.
$laser.cast_to.z = -beam_length #устанавливаем максимальную дальность лазера.
$laser/beam/MeshInstance.mesh.material.set("shader_param/laser_color",laser_color)
$laser/beam/MeshInstance2.mesh.material.set("shader_param/laser_color",laser_color)
# подключаем сигнал для обработки входящих данных
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:
# print('on_data=', on_data)
# print('on_data[id] =',on_data['id'],' id_projekto_direkt_del=',id_projekto_direkt_del)
var index = id_livero.find(int(on_data['id']))
# print('index=',index,' ::: ', typeof(index), " == ", typeof(on_data['id']))
if index > -1: # находится в списке выстрелов
# уменьшаем количество снарядов в оружии
if kvanto_pafajho>0:
kvanto_pafajho -= 1
pass
# var idx_prj = 0 #индекс массива для удаления
# for prj in Global.direktebla_objekto[Global.realeco-2]['projekto']['edges']:
# if prj['node']['uuid']==on_data['payload']['data']['redaktuUniversoProjekto']['universoProjekto']['uuid']:
# Global.direktebla_objekto[Global.realeco-2]['projekto']['edges'].remove(idx_prj)
# idx_prj += 1
id_livero.remove(index)
Net.data_server.remove(i_data_server)
i_data_server += 1
func rotate_gun(delta):
var temp = transform.basis #сохраняем старый базис
# look_at(target.back().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
look_at(target.get_global_transform().origin,Vector3.UP)#смотрим на цель, это сохранится в текущем базисе, из-за этого и куча движений с буферными базисами
var target_rot = transform.basis#сохраняем целевой базис
transform.basis = temp#восстанавливаем изначальный базис
$laser.transform.basis = $laser.transform.basis.slerp(target_rot,speed_rotation*delta) # постепенно поворачиваем к цели
# $laser.rotation_degrees.x = clamp($laser.rotation_degrees.x,x_limiter.x,x_limiter.y)# ограничиваем вращение пушки вниз, чтобы стреляла только в верхнюю полусферу
# $laser.rotation_degrees.y = clamp($laser.rotation_degrees.y,y_limiter.x,y_limiter.y)# ограничиваем вращение пушки по сторонам, если нужно
$gun_body.rotation.y = $laser.rotation.y
$Turret.rotation.y = $laser.rotation.y
func get_uuid(object):
# print('==name==',object.name)
if object.get('uuid'):
# print('=uuid==',object.uuid)
return object.uuid
else:
return get_uuid(object.get_parent())
# проверка, входит ли uuid в данный объект
# я могу видеть часть от целого, нужно подняться к предку и проверить его uuid
# проверяем по восходящей до космоса
func sercxado_uuid(uuid, objekt):
if objekt.get('uuid'):
if uuid == objekt.uuid:
return true
if objekt.get_parent().name != 'space':
return sercxado_uuid(uuid, objekt.get_parent())
return false
func _physics_process(delta):
if target:
# print('цель задана')
var length_to_end=beam_length
var can_shoot = false
rotate_gun(delta)
if $laser.is_colliding():
if sercxado_uuid(target.uuid,$laser.get_collider()):
# print('стреляем = ',uuid)
# print($laser.get_collider().name) #тут можно обработать в кого мы попали и вызвать повреждения.
length_to_end = get_global_transform().origin.distance_to($laser.get_collision_point())
# print('тут 1 kvanto_pafajho=',kvanto_pafajho,' tuttempe_pafo=',tuttempe_pafo,' livero=',livero)
if (tuttempe_pafo>livero) and ((kvanto_pafajho==-1)or(kvanto_pafajho>0)):
can_shoot = true
$laser/end_point.visible = true
$laser/beam.visible = true
if !livero: # только начали стрелять
livero = 1 # начало стрельбы после всех проверок
else:
$laser/end_point.visible = false
$laser/beam.visible = false
else:
$laser/end_point.visible = false
$laser/beam.visible = false
else:
$laser/end_point.visible = false
$laser/beam.visible = false
if can_shoot:
$laser/beam.scale.z=length_to_end
$laser/end_point.translation.z = -length_to_end
$laser/end_point/Particles.emitting = true
else:
$laser/end_point/Particles.emitting = false
$laser/beam.scale.z=0.1
$laser/end_point.translation.z = 0
else:
$laser/end_point.visible = false
$laser/beam.visible = false
if livero > 1:
livero += 1
if livero == 1: # отправляем выстрел на сервер
#Это должно быть только на управляемом корабле, а не на оружии всех
if (sxipo)and(sxipo == Global.fenestro_kosmo.get_node('ship')):
sxipo.pafo_server(self, target)
# сервер отвечает за повреждения объектов
# отправляем на сервер повреждение от выстрела
if Global.server:
integreco_shanghi(potenco)
livero = 2
if livero == 10: # производим разрушение объекта цели
pass
if livero > malfruo:
livero = 0
target = new_target # меняем цель, если за время выстрели цель поменяли или сняли
const QueryObject = preload("queries.gd")
# отправляем на сервер повреждение от выстрела
func integreco_shanghi(nombro):
# print('===target.integreco-potenco=',target.integreco-potenco)
if Global.server:
var q = QueryObject.new()
var id = Net.get_current_query_id()
Global.fenestro_kosmo.id_net.append(id)
Net.send_json(q.integreco_shanghi(
target.uuid,
-nombro,
id
))
func set_target(targeto):
if target: # при отмене стрельбы или смена цели
new_target = targeto
else: # сюда попадаем только при начале первой стрельбы
new_target = targeto
target = targeto
...@@ -5,3 +5,4 @@ extends Spatial ...@@ -5,3 +5,4 @@ extends Spatial
var uuid = "" var uuid = ""
var integreco = 100 var integreco = 100
var potenco var potenco
var objekto_modulo
extends Node
# ТОЛЬКО ДЛЯ СЕРВЕРА
# повреждение от выстрела / изменение целостности объекта
func integreco_shanghi(uuid, integreco, id=0):
if !id:
id = Net.get_current_query_id()
return JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($uuid:UUID, '+
' $integreco:Int, )'+
'{ redaktuUniversoObjektoIntegreco (uuid: $uuid, '+
' integreco:$integreco) { status '+
' message universoObjektoj { uuid } } '+
'}',
'variables': {"uuid": uuid, "integreco":integreco } }})
extends Node extends Node
# модель сбора корабля
const base_cabine = preload("res://blokoj/kosmosxipoj/scenoj/moduloj/cabine.tscn") const base_cabine = preload("res://blokoj/kosmosxipoj/scenoj/moduloj/cabine.tscn")
...@@ -32,22 +33,26 @@ func create_sxipo(sxipo, objecto): ...@@ -32,22 +33,26 @@ func create_sxipo(sxipo, objecto):
cabine.uuid = modulo['node']['ligilo']['uuid'] cabine.uuid = modulo['node']['ligilo']['uuid']
# x - в право # x - в право
cabine.translation.y = 2 #вверх cabine.translation.y = 2 #вверх
cabine.translation.z = 2 # назад cabine.translation.z = 1 # назад
cabine.rotate_y(deg2rad(90)) cabine.rotate_y(deg2rad(90))
# cabine.get_node("cabine").translation.y = 2 #вверх # cabine.get_node("cabine").translation.y = 2 #вверх
# cabine.get_node("cabine").translation.z = 2 # назад # cabine.get_node("cabine").translation.z = 2 # назад
# cabine.get_node("cabine").rotate_y(deg2rad(90)) # cabine.get_node("cabine").rotate_y(deg2rad(90))
# sxipo.get_node("CollisionShape").add_child(cabine) # sxipo.get_node("CollisionShape").add_child(cabine)
cabine.integreco = modulo['node']['ligilo']['integreco']
cabine.objekto_modulo = modulo['node']['ligilo'].duplicate(true)
sxipo.add_child(cabine) sxipo.add_child(cabine)
elif modulo['node']['ligilo']['resurso']['objId'] == 5: #"Vostok Грузовой Модуль" "Базовый грузовой модуль кораблей Vostok" elif modulo['node']['ligilo']['resurso']['objId'] == 5: #"Vostok Грузовой Модуль" "Базовый грузовой модуль кораблей Vostok"
cargo = base_cargo.instance() cargo = base_cargo.instance()
cargo.uuid = modulo['node']['ligilo']['uuid'] cargo.uuid = modulo['node']['ligilo']['uuid']
cargo.translation.y = 2 cargo.translation.y = 2
cargo.translation.z = 8 cargo.translation.z = 7
cargo.rotate_y(deg2rad(90)) cargo.rotate_y(deg2rad(90))
# cargo.get_node("Cargo").translation.y = 2 # cargo.get_node("Cargo").translation.y = 2
# cargo.get_node("Cargo").translation.z = 8 # cargo.get_node("Cargo").translation.z = 8
# cargo.get_node("Cargo").rotate_y(deg2rad(90)) # cargo.get_node("Cargo").rotate_y(deg2rad(90))
cargo.integreco = modulo['node']['ligilo']['integreco']
cargo.objekto_modulo = modulo['node']['ligilo'].duplicate(true)
sxipo.add_child(cargo) sxipo.add_child(cargo)
elif modulo['node']['ligilo']['resurso']['objId'] == 6: #"Vostok Двигатель" "Базовый двигатель кораблей Vostok" elif modulo['node']['ligilo']['resurso']['objId'] == 6: #"Vostok Двигатель" "Базовый двигатель кораблей Vostok"
engine = base_engine.instance() engine = base_engine.instance()
...@@ -56,39 +61,42 @@ func create_sxipo(sxipo, objecto): ...@@ -56,39 +61,42 @@ func create_sxipo(sxipo, objecto):
engine.translation.x = -2.5 engine.translation.x = -2.5
engine.translation.y = 1 engine.translation.y = 1
# engine.get_node("engine R").translation.z = 10 # engine.get_node("engine R").translation.z = 10
engine.translation.z = 11 engine.translation.z = 10
engine.rotate_y(deg2rad(270)) engine.rotate_y(deg2rad(270))
engine.rotate_x(deg2rad(180)) engine.rotate_x(deg2rad(180))
else: else:
engine.translation.x = 2.5 engine.translation.x = 2.5
engine.translation.y = 1 engine.translation.y = 1
engine.translation.z = 11 engine.translation.z = 10
engine.rotate_y(deg2rad(90)) engine.rotate_y(deg2rad(90))
engine.integreco = modulo['node']['ligilo']['integreco']
engine.objekto_modulo = modulo['node']['ligilo'].duplicate(true)
sxipo.add_child(engine) sxipo.add_child(engine)
enganes = !enganes enganes = !enganes
elif modulo['node']['ligilo']['resurso']['objId'] == 11: #Универсальный лазер elif modulo['node']['ligilo']['resurso']['objId'] == 11: #Универсальный лазер
moduloj = laser.instance() moduloj = laser.instance()
moduloj.uuid = modulo['node']['ligilo']['uuid'] moduloj.uuid = modulo['node']['ligilo']['uuid']
moduloj.get_node("Turret").translation.y = 3.5 moduloj.get_node("Turret").translation.y = 3.5
moduloj.get_node("Turret").translation.z = 1.1 moduloj.get_node("Turret").translation.z = 0.1
moduloj.get_node("Platform").translation.y = 3.5 moduloj.get_node("Platform").translation.y = 3.5
moduloj.get_node("Platform").translation.z = 1.1 moduloj.get_node("Platform").translation.z = 0.1
moduloj.get_node("laser").translation.y = 4.7 moduloj.get_node("laser").translation.y = 4.7
moduloj.get_node("laser").translation.z = 1.1 moduloj.get_node("laser").translation.z = 0.1
moduloj.get_node("gun_body").translation.y = 4.2 moduloj.get_node("gun_body").translation.y = 4.2
moduloj.get_node("gun_body").translation.z = 0.6 moduloj.get_node("gun_body").translation.z = -0.4
# print("modulo['node']['ligilo']=",modulo['node']['ligilo']['uuid'])
moduloj.potenco = modulo['node']['ligilo']['stato']['potenco']
# moduloj.get_node("laser").translation.y = 4.2 moduloj.integreco = modulo['node']['ligilo']['integreco']
# moduloj.get_node("laser").translation.z = 0.6 moduloj.objekto_modulo = modulo['node']['ligilo'].duplicate(true)
# moduloj.get_node("laser/gun_stem").translation.y = 4.2 # moduloj.get_node("laser/gun_stem").translation.y = 4.2
moduloj.get_node("laser/gun_stem").translation.z = -0.6 moduloj.get_node("laser/gun_stem").translation.z = -0.6
# moduloj.get_node("laser/beam/MeshInstance").translation.y = 4.2 # moduloj.get_node("laser/beam/MeshInstance").translation.y = 4.2
# moduloj.get_node("laser/beam/MeshInstance2").translation.y = 4.2 # moduloj.get_node("laser/beam/MeshInstance2").translation.y = 4.2
# moduloj.get_node("laser/end_point/Particles").translation.y = 4.2 # moduloj.get_node("laser/end_point/Particles").translation.y = 4.2
moduloj.sxipo = sxipo # установили указатель на корабль управления
sxipo.add_child(moduloj) sxipo.add_child(moduloj)
sxipo.armiloj.append(moduloj) # добавили в массив вооружения корабля
extends KinematicBody
# скрипт-предок для всех движущихся объектов
var uuid = ""
var objekto
var distance = 0 # дистанция до корабля игрока
var integreco = 100 # % целостности объекта
var potenco # мощность ресурса
var acceleration = 1 # для расчета движения корабля
var target_rot #положение корабля, которое надо принять, чтобы нацелиться на точку.
var speed_rotation =1
# максимальная скорость корабля
var max_speed =1000.0
# uuid проекта маршрута
var projekto_itineroj
#маршрут движения корабля
var itineroj = []
# uuid - uuid задачи
# front - transform координат цели движения (лучше высчитать один раз при добавлении)
# координаты цели полёта
# 'koordinatoX':
# 'koordinatoY':
# 'koordinatoZ':
# pozicio - в какой позиции должна находится задача
var pause = false # объект стоит на паузе и не летит
func _physics_process(delta):
if !(itineroj.empty() or pause): #Если цель существует, двигаемся
var front = Transform(Basis.IDENTITY,Vector3(itineroj.front()['koordinatoX'],
itineroj.front()['koordinatoY'], itineroj.front()['koordinatoZ']))
var target_dir = (front.origin - translation).normalized()
var distance = translation.distance_to(front.origin)
var current_speed = 0
if len (itineroj)>1:
if distance <1: #Если это не последняя точка, то мы не тормозим, так что завышаем расстояние, чтобы не проскочить эту точку
dec_route()
return
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else:
if distance > max_speed*delta/acceleration:#Тут сомнительная формула от фонаря, вычисляющая примерно откуда надо начинать тормозить корабль.
current_speed = lerp(current_speed,max_speed,delta*acceleration)#ускоряемся
transform.basis = transform.basis.slerp(target_rot,speed_rotation*delta) #потихоньку поворачиваем корабль на цель. Взято у Сканера из урока про зомбей. Quat(transform.basis) - текущий поворот корабля
else: #Если это последняя точка, то мы тормозим, и задаём минимальное расстояние, чтобы точнее выставить корабль
current_speed = lerp(current_speed,50,delta*acceleration)#замедляемся
if front.basis !=Basis.IDENTITY:
transform.basis = transform.basis.slerp(Quat(front.basis),speed_rotation*delta*1.5) #поворачиваем в дефолтное состояние, чтобы сесть
if distance <0.01:
if front.basis !=Basis.IDENTITY:
transform.basis = front.basis
translation = front.origin
route_gone()
return
# print(distance,": ",current_speed)
# print(len(itineroj))
# print('двигаемся = ',target_dir*delta*current_speed)
# warning-ignore:return_value_discarded
move_and_slide(target_dir*delta*current_speed) #Двигаемся к цели и тут можно передать transform на сервер
func rotate_start():# поворачиваем корабль носом по ходу движения
var front = Transform(Basis.IDENTITY, Vector3(itineroj.front()['koordinatoX'],
itineroj.front()['koordinatoY'], itineroj.front()['koordinatoZ']))
target_rot = Quat(transform.looking_at(front.origin,Vector3.UP).basis) #запоминаем в какое положение надо установить корабль, чтобы нос был к цели. Это в кватернионах. ХЗ что это, но именно так вращать правильнее всего.
func set_route(route_array):
if !route_array.empty():
itineroj.clear() #Просто приравнивать нельзя, так как изменяется адрес и если где-то на него кто-то ссылался в других сценах, то он теряет этот адрес Так что очищаем и копируем.
for i in route_array:
itineroj.push_back(i)
rotate_start()
func dec_route():
itineroj.pop_front()
set_route(itineroj.duplicate())
func route_gone():
itineroj.clear()
func add_route(route_array):
for i in route_array:
itineroj.push_back(i)
set_route(itineroj.duplicate())
# редактировать маршрут
func sxangxi_itinero(projekto, tasko):
if projekto['uuid']==projekto_itineroj: # изменение по задаче в текущем проекте
var new_tasko = true # признак необходимости новой задачи
var pos = 0 # номер позиции в списке задач
for it in itineroj:# проходим по всем задачам
if tasko['uuid'] == it['uuid']: # нашли соответствующую задачу
new_tasko = false
if tasko['statuso']['objId']==1: # новая - в очередь выполнения
it['koordinatoX'] = tasko['finKoordinatoX']
it['koordinatoY'] = tasko['finKoordinatoY']
it['koordinatoZ'] = tasko['finKoordinatoZ']
elif tasko['statuso']['objId']==2: # в работе
# задача должна быть первой в списке
if pos: # если не первая
itineroj.remove(pos)
itineroj.push_front({
'uuid':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ']
})
else:
it['koordinatoX'] = tasko['finKoordinatoX']
it['koordinatoY'] = tasko['finKoordinatoY']
it['koordinatoZ'] = tasko['finKoordinatoZ']
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
rotate_start()
pause = false
elif tasko['statuso']['objId']==4: # закрыта
#удаляем из списка
itineroj.remove(pos)
elif tasko['statuso']['objId']==6: # приостановлена
pause = true
pos += 1
if new_tasko: # добавляем новую задачу в проект
if tasko['statuso']['objId']==1: # новая - в очередь выполнения
# нужно выстроить по очерёдности
pass
pos = 0
var pozicio = false
for it in itineroj:# проходим по всем задачам и находим нужную позицию
if itineroj['pozicio']>tasko['pozicio']: # вставляем перед данной записью
itineroj.insert(pos, {
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
})
pozicio = true
break
pos += 1
if !pozicio: # позиция не найдены, добавляем в конце
itineroj.push_pop({
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
})
elif tasko['statuso']['objId']==2: # в работе
# задача должна быть первой в списке
itineroj.push_front({
'uuid':tasko['uuid'],
'koordinatoX':tasko['finKoordinatoX'],
'koordinatoY':tasko['finKoordinatoY'],
'koordinatoZ':tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
})
# отправляем корабль на уточнённые координаты, а точнее поворачиваем
rotate_start()
pause = false
elif tasko['statuso']['objId']==6: # приостановлена
itineroj.push_front({
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
})
pause = true
else: # первая запись нового проекта
route_gone()
projekto_itineroj = projekto['uuid']
itineroj.push_back({
'uuid':tasko['uuid'],
'koordinatoX': tasko['finKoordinatoX'],
'koordinatoY': tasko['finKoordinatoY'],
'koordinatoZ': tasko['finKoordinatoZ'],
'pozicio': tasko['pozicio']
})
if tasko['statuso']['objId']==2: # в работе
rotate_start()
pause = false
else:
pause = true
extends Object
# Здесь будем хранить всё для запросов к бэкэнду по блоку "Космические корабли"
# создаём проект стрельбы на сервере
func pafado_json(objektoUuid, id):
var nomo = "Pafado"
var priskribo = "Pafado de objekto"
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
' $nomo:String, $priskribo:String, $statusoId:Int, '+
' $tipoPosedantoId:Int,'+
' $statusoPosedantoId:Int, $objektoUuid:String, '+
' $realecoId:Int ) '+
'{ redaktuUniversoProjekto ( '+
' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, '+
' posedantoTipoId:$tipoPosedantoId, '+
' objektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId ,'+
' realecoId:$realecoId ) '+
' { status message '+
' universoProjekto { uuid } } }',
'variables': {"tipoId":Net.projekto_tipo_objekto,
"kategorio": Net.projekto_kategorio_pafado,
"nomo": nomo,
"priskribo": priskribo, "statusoId": Net.statuso_laboranta,
"objektoUuid":objektoUuid, "statusoPosedantoId":Net.statuso_posedanto,
"tipoPosedantoId":Net.tipo_posedanto, "realecoId":Global.realeco} }})
# print('===pafado_json===',query)
return query
# отправляем создание задачи взятия в прицел на сервер
# uuidPafado - uuid проекта стрельбы, далее кто берёт в прицел, откуда, кого и по каким координатам
func celilo_json(uuidPafado, objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
uuidCelo, fin_koordX, fin_koordY, fin_koordZ, id):
var nomo = "Celilo"
var priskribo = "Celilo de objekto"
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
' $nomo:String, $priskribo:String, $statusoId:Int, $kom_koordX:Float, '+
' $kom_koordY:Float, $kom_koordZ:Float, $fin_koordX:Float, '+
' $fin_koordY:Float, $fin_koordZ:Float, $tipoPosedantoId:Int,'+
' $statusoPosedantoId:Int, $objektoUuid:String, '+
' $realecoId:Int, $projektoUuid:String, $uuidCelo:String) '+
'{ redaktuUniversoTaskoj ( '+
' projektoUuid:$projektoUuid' +
' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, komKoordinatoX:$kom_koordX,'+
' komKoordinatoY:$kom_koordY, komKoordinatoZ:$kom_koordZ, finKoordinatoX:$fin_koordX,'+
' finKoordinatoY:$fin_koordY, finKoordinatoZ:$fin_koordZ, posedantoTipoId:$tipoPosedantoId, '+
' posedantoObjektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId, '+
' realecoId:$realecoId, objektoUuid:$uuidCelo ) '+
' { status message '+
' universoTaskoj { uuid } } }',
'variables': {"tipoId":Net.projekto_tipo_objekto,
"kategorio": Net.tasko_kategorio_celilo,
"nomo": nomo,
"priskribo": priskribo, "statusoId": Net.statuso_laboranta,
"kom_koordX": kom_koordX, "kom_koordY": kom_koordY, "kom_koordZ": kom_koordZ,
"fin_koordX":fin_koordX,
"fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
"objektoUuid":objektoUuid, "statusoPosedantoId":Net.statuso_posedanto,
"tipoPosedantoId":Net.tipo_posedanto, "realecoId":Global.realeco,
"projektoUuid":uuidPafado, "uuidCelo":uuidCelo } }})
# print('===celilo_json===',query)
return query
# отправляем выстрел на сервер
# uuidPafado - uuid проекта стрельбы, далее кто стреляет (uuid лазера или другого оружия), откуда стреляет, в кого стреляет и куда стреляет
func pafo_json(uuidPafado, objektoUuid, kom_koordX, kom_koordY, kom_koordZ,
uuidCelo, fin_koordX, fin_koordY, fin_koordZ, id):
var nomo = "Pafo"
var priskribo = "Pafo de objekto"
if !id:
id = Net.get_current_query_id()
var query = JSON.print({
'type': 'start',
'id': '%s' % id,
'payload':{ 'query': 'mutation ($tipoId:Int, $kategorio:[Int],'+
' $nomo:String, $priskribo:String, $statusoId:Int, $kom_koordX:Float, '+
' $kom_koordY:Float, $kom_koordZ:Float, $fin_koordX:Float, '+
' $fin_koordY:Float, $fin_koordZ:Float, $tipoPosedantoId:Int,'+
' $statusoPosedantoId:Int, $objektoUuid:String, '+
' $realecoId:Int, $projektoUuid:String, $uuidCelo:String) '+
'{ redaktuUniversoTaskoj ( '+
' projektoUuid:$projektoUuid' +
' tipoId:$tipoId, kategorio:$kategorio, nomo:$nomo, '+
' priskribo:$priskribo, statusoId:$statusoId, publikigo:true, komKoordinatoX:$kom_koordX,'+
' komKoordinatoY:$kom_koordY, komKoordinatoZ:$kom_koordZ, finKoordinatoX:$fin_koordX,'+
' finKoordinatoY:$fin_koordY, finKoordinatoZ:$fin_koordZ, posedantoTipoId:$tipoPosedantoId, '+
' posedantoObjektoUuid: $objektoUuid, posedantoStatusoId:$statusoPosedantoId, '+
' realecoId:$realecoId, objektoUuid:$uuidCelo ) '+
' { status message '+
' universoTaskoj { uuid } } }',
'variables': {"tipoId":Net.projekto_tipo_objekto,
"kategorio": Net.tasko_kategorio_pafo,
"nomo": nomo,
"priskribo": priskribo, "statusoId": Net.statuso_laboranta,
"kom_koordX": kom_koordX, "kom_koordY": kom_koordY, "kom_koordZ": kom_koordZ,
"fin_koordX":fin_koordX,
"fin_koordY":fin_koordY, "fin_koordZ":fin_koordZ,
"objektoUuid":objektoUuid, "statusoPosedantoId":Net.statuso_posedanto,
"tipoPosedantoId":Net.tipo_posedanto, "realecoId":Global.realeco,
"projektoUuid":uuidPafado, "uuidCelo":uuidCelo } }})
# print('===pafo_json===',query)
return query
Это отличие свёрнуто
...@@ -4,10 +4,37 @@ ...@@ -4,10 +4,37 @@
[ext_resource path="res://blokoj/objektoj/skriptoj/objekto.gd" type="Script" id=3] [ext_resource path="res://blokoj/objektoj/skriptoj/objekto.gd" type="Script" id=3]
[node name="Objekto" instance=ExtResource( 2 )] [node name="Objekto" instance=ExtResource( 2 )]
margin_left = 704.816
margin_top = 263.888
margin_right = 704.816
margin_bottom = 263.888
script = ExtResource( 3 ) script = ExtResource( 3 )
[node name="MarginContainer" parent="canvas" index="0"] [node name="VBox" parent="." index="0"]
visible = false visible = false
[node name="Label" parent="canvas/MarginContainer/VBoxContainer" index="0"] [node name="menuo_name" parent="VBox/HBox_top/top_texture2/HBox_buttons" index="0"]
margin_right = 155.0
text = "Объекты" text = "Объекты"
[node name="Button_fix" parent="VBox/HBox_top/top_texture2/HBox_buttons" index="1"]
visible = false
[node name="Button_" parent="VBox/HBox_top/top_texture2/HBox_buttons" index="2"]
visible = false
[node name="Button_full" parent="VBox/HBox_top/top_texture2/HBox_buttons" index="3"]
visible = false
[node name="ItemList" type="ItemList" parent="VBox/body_texture" index="1"]
anchor_right = 1.0
anchor_bottom = 1.013
margin_left = 6.0
margin_top = 6.0
margin_right = -6.0
margin_bottom = -0.0279999
size_flags_horizontal = 3
size_flags_vertical = 3
__meta__ = {
"_edit_use_anchors_": false
}
extends "res://kerno/fenestroj/tipo1.gd" extends "res://kerno/fenestroj/tipo_a1.gd"
const QueryObject = preload("queries.gd") const QueryObject = preload("queries.gd")
func _ready(): func _ready():
Title.connect("load_objekto", self, "_reload_objekto") var err = Title.connect("load_objekto", self, "_reload_objekto")
if err:
print('ошибка установки реакции на load_objekto = ',err)
# перезагружаем список объектов # перезагружаем список объектов
func _reload_objekto(): func _reload_objekto():
$"canvas/MarginContainer/VBoxContainer/scroll/ItemList".clear() $"VBox/body_texture/ItemList".clear()
FillItemList() FillItemList()
func FillItemList(): func FillItemList():
# если загружен космос, то берём список из объектов космоса # если загружен космос, то берём список из объектов космоса
if $"/root".get_node_or_null('space'): if $"/root".get_node_or_null('space'):
var _space = $"/root".get_node('space') var _space = $"/root".get_node('space')
var _items = get_node("canvas/MarginContainer/VBoxContainer/scroll/ItemList") var _items = get_node("VBox/body_texture/ItemList")
for ch in _space.get_children(): for ch in _space.get_children():
if ch.is_in_group('create') and ('objekto' in ch): if ch.is_in_group('create') and ('objekto' in ch):
_items.add_item( _items.add_item(
...@@ -28,7 +30,9 @@ func FillItemList(): ...@@ -28,7 +30,9 @@ func FillItemList():
else: else:
# Заполняет список найдеными объектами # Заполняет список найдеными объектами
for item in Global.objektoj: for item in Global.objektoj:
get_node("canvas/MarginContainer/VBoxContainer/scroll/ItemList").add_item( if not item.has('distance'):
item['distance'] = 0
get_node("VBox/body_texture/ItemList").add_item(
'('+String(int(item['distance']))+') '+item['nomo']['enhavo'], '('+String(int(item['distance']))+') '+item['nomo']['enhavo'],
null, null,
true true
...@@ -40,7 +44,7 @@ func distance_to(trans): ...@@ -40,7 +44,7 @@ func distance_to(trans):
for obj in Global.objektoj: for obj in Global.objektoj:
obj['distance'] = trans.distance_to(Vector3(obj['koordinatoX'], obj['distance'] = trans.distance_to(Vector3(obj['koordinatoX'],
obj['koordinatoY'],obj['koordinatoZ'])) obj['koordinatoY'],obj['koordinatoZ']))
$'canvas/MarginContainer/VBoxContainer/scroll/ItemList'.clear() $'VBox/body_texture/ItemList'.clear()
FillItemList() FillItemList()
Это отличие свёрнуто
Это отличие свёрнуто
Это отличие свёрнуто
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать