Rescue mission almost done docking part behaves weirdly)
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
from time import sleep
|
||||
|
||||
import numpy as np
|
||||
|
||||
from krpc.services.spacecenter import CargoBayState, DockingPortState
|
||||
from maneuvers.utils import point_toward_direction, point_toward_target
|
||||
|
||||
from maneuver_scheduler import ManeuverScheduler
|
||||
|
||||
@@ -11,11 +14,11 @@ from lib import get_connexion, get_vessel
|
||||
|
||||
class MissionControl:
|
||||
mission_types = []
|
||||
vessel = None
|
||||
|
||||
def __init__(self):
|
||||
self.current_mission = None
|
||||
self.current_orbit_missions = []
|
||||
self.vessel = NotImplemented
|
||||
|
||||
def pick_missions(self, backlog):
|
||||
current_body_name = self.vessel.orbit.body.name
|
||||
@@ -47,16 +50,17 @@ class MissionControl:
|
||||
|
||||
def get_kerbal(self, name):
|
||||
for k in self.vessel.crew:
|
||||
if k.name == "name":
|
||||
if k.name == name:
|
||||
return k
|
||||
|
||||
raise LookupError('Kerbal {} not found onboard vessel {}'.format(name, self.vessel.name))
|
||||
|
||||
def get_docking_port(self, name):
|
||||
for p in self.vessel.parts.docking_ports:
|
||||
for m in p.modules:
|
||||
if m.name == "ModuleDockingNodeNamed" and m.get_field('portName') == name:
|
||||
return p
|
||||
for m in self.vessel.parts.modules_with_name('ModuleDockingNodeNamed'):
|
||||
if m.get_field_by_id('portName') == name:
|
||||
return m.part.docking_port
|
||||
|
||||
raise LookupError('Docking port {} not found on vessel {}'.format(name, self.vessel.name))
|
||||
|
||||
|
||||
class ShuttleKerbin(MissionControl):
|
||||
@@ -72,9 +76,9 @@ class ShuttleKerbin(MissionControl):
|
||||
e.active = True
|
||||
|
||||
self.current_orbit_missions = []
|
||||
self.first_cabin = self.mothership.parts.with_title("Mk2 Inline Cockpit")[0]
|
||||
self.second_cabin = self.mothership.parts.with_title("MK2 Crew Cabin")[0]
|
||||
self.third_cabin = self.mothership.parts.with_title("MK2 Crew Cabin")[1]
|
||||
self.first_cabin = self.mothership.parts.with_name('mk2Cockpit.Inline')[0]
|
||||
self.second_cabin = self.mothership.parts.with_name('mk2CrewCabin')[0]
|
||||
self.third_cabin = self.mothership.parts.with_name('mk2CrewCabin')[1]
|
||||
|
||||
self.docking_ports = self.mothership.parts.docking_ports
|
||||
|
||||
@@ -85,36 +89,67 @@ class ShuttleKerbin(MissionControl):
|
||||
else:
|
||||
return self.probe
|
||||
|
||||
@vessel.setter
|
||||
def vessel(self, value):
|
||||
if self.probe is None:
|
||||
self.mothership = value
|
||||
else:
|
||||
self.probe = value
|
||||
|
||||
def toggle_grappling(self, value=True):
|
||||
arm = self.get_grappling()
|
||||
if arm.modules[1].has_event('Arm') and not value \
|
||||
or arm.modules[1].has_event('Disarm') and value:
|
||||
if arm.modules[1].has_event('Arm') and value \
|
||||
or arm.modules[1].has_event('Disarm') and not value:
|
||||
arm.modules[1].set_action_by_id('ToggleAction', True)
|
||||
|
||||
def get_grappling(self):
|
||||
if self.probe is None:
|
||||
raise Exception('Probe is not ready')
|
||||
return self.vessel.parts.with_name('GrapplingDevice')[0]
|
||||
|
||||
return self.probe.parts.with_title("Advanced Grabbing Unit")[0]
|
||||
return self.probe.parts.with_name('GrapplingDevice')[0]
|
||||
|
||||
def get_probe_port(self):
|
||||
# return self.probe.parts.with_name('Probe Port')[0]
|
||||
return self.get_docking_port('Probe Port')
|
||||
return self.get_docking_port('Tug Probe Port')
|
||||
|
||||
def get_bay_port(self):
|
||||
#return self.mothership.with_name('Shuttle Bay Port')[0]
|
||||
if self.probe is not None:
|
||||
return self.get_mothership_docking_port('Shuttle Bay Port')
|
||||
return self.get_docking_port('Shuttle Bay Port')
|
||||
|
||||
def deliver_probe(self):
|
||||
bay = self.mothership.cargo_bays[0]
|
||||
bay.open = True
|
||||
while bay.state != CargoBayState.open:
|
||||
sleep(1)
|
||||
def get_mothership_docking_port(self, name):
|
||||
for m in self.mothership.parts.modules_with_name('ModuleDockingNodeNamed'):
|
||||
if m.get_field_by_id('portName') == name:
|
||||
return m.part.docking_port
|
||||
|
||||
hinge = self.mothership.robotic_hinges[0]
|
||||
hinge.target_extension = 90
|
||||
while hinge.current_angle < 90:
|
||||
sleep(.1)
|
||||
raise LookupError('Docking port {} not found on vessel {}'.format(name, self.mothership.name))
|
||||
|
||||
def get_probe_docking_port(self, name):
|
||||
for m in self.probe.parts.modules_with_name('ModuleDockingNodeNamed'):
|
||||
if m.get_field_by_id('portName') == name:
|
||||
return m.part.docking_port
|
||||
|
||||
raise LookupError('Docking port {} not found on vessel {}'.format(name, self.mothership.name))
|
||||
|
||||
def deliver_probe(self, target=None):
|
||||
bay = self.mothership.parts.cargo_bays[0]
|
||||
bay.open = True
|
||||
|
||||
with get_connexion().stream(getattr, bay, 'state') as state:
|
||||
with state.condition:
|
||||
while not state() == CargoBayState.open:
|
||||
state.wait()
|
||||
|
||||
hinge = self.mothership.parts.robotic_hinges[0]
|
||||
hinge.target_angle = 90
|
||||
|
||||
with get_connexion().stream(getattr, hinge, 'current_angle') as current_angle:
|
||||
with current_angle.condition:
|
||||
while current_angle() < hinge.target_angle - 1:
|
||||
current_angle.wait()
|
||||
|
||||
if target is not None:
|
||||
self.vessel.parts.controlling = self.get_bay_port().part
|
||||
point_toward_target(get_connexion(), self.vessel, target)
|
||||
|
||||
bay_port = self.get_bay_port()
|
||||
self.probe = bay_port.undock()
|
||||
@@ -122,17 +157,19 @@ class ShuttleKerbin(MissionControl):
|
||||
return self.probe
|
||||
|
||||
def recover_probe(self):
|
||||
bay_port = self.mothership.parts.with_name('Shuttle Bay Port')[0]
|
||||
bay_port = self.get_bay_port()
|
||||
if bay_port.state != DockingPortState.docked:
|
||||
raise Exception("Probe is not parked in shuttle")
|
||||
self.probe = None
|
||||
|
||||
hinge = self.mothership.robotic_hinges[0]
|
||||
hinge.target_extension = 0
|
||||
while hinge.current_angle > 0:
|
||||
sleep(.1)
|
||||
hinge = self.mothership.parts.robotic_hinges[0]
|
||||
hinge.target_angle = 0
|
||||
with get_connexion().stream(getattr, hinge, 'current_angle') as current_angle:
|
||||
with current_angle.condition:
|
||||
while current_angle() > hinge.target_angle:
|
||||
current_angle.wait()
|
||||
|
||||
bay = self.mothership.cargo_bays[0]
|
||||
bay = self.mothership.parts.cargo_bays[0]
|
||||
bay.open = False
|
||||
|
||||
def get_part_with_free_seat(self):
|
||||
|
||||
Reference in New Issue
Block a user