def run(self, drone: CarObject, agent: MyHivemind): if self.time == -1: elapsed = 0 self.time = agent.time else: elapsed = agent.time - self.time if elapsed < self.delay: if elapsed < self.duration: drone.controller.jump = True else: drone.controller.jump = False self.counter += 1 robbies_constant = (self.vector * 1.5 * 2200 - drone.velocity * 1.5) * 2 * 1.5 ** -2 robbies_boost_constant = drone.forward.flatten().normalize().dot( robbies_constant.flatten().normalize()) > (0.3 if not drone.airborne else 0.1) drone.controller.boost = robbies_boost_constant and not drone.supersonic elif elapsed >= self.delay and self.counter < 3: drone.controller.jump = False self.counter += 1 elif elapsed < 0.9: drone.controller.jump = True defaultPD(drone, self.vector) drone.controller.pitch = self.pitch if abs(self.vector[1]) < 0.175: drone.controller.yaw = self.yaw drone.controller.roll = 0 else: drone.pop() drone.push(Recovery(self.vector, target_local=True))
def run(self, drone: CarObject, agent: MyHivemind): if self.boost is None: drone.pop() return car_to_boost = self.boost.location - drone.location distance_remaining = car_to_boost.flatten().magnitude() agent.line(self.boost.location - Vector3(0, 0, 500), self.boost.location + Vector3(0, 0, 500), [0, 255, 0]) if self.target is not None: vector = (self.target - self.boost.location).normalize() side_of_vector = sign(vector.cross((0, 0, 1)).dot(car_to_boost)) car_to_boost_perp = car_to_boost.cross((0, 0, side_of_vector)).normalize() adjustment = car_to_boost.angle2D(vector) * distance_remaining / 3.14 final_target = self.boost.location + (car_to_boost_perp * adjustment) car_to_target = (self.target - drone.location).magnitude() else: adjustment = 9999 car_to_target = 0 final_target = self.boost.location # Some adjustment to the final target to ensure it's inside the field and # we don't try to dirve through any goalposts to reach it if abs(drone.location[1]) > 5150: final_target[0] = cap(final_target[0], -750, 750) local_target = drone.local(final_target - drone.location) angles = defaultPD(drone, local_target) defaultThrottle(drone, 2300) drone.controller.boost = self.boost.large if abs(angles[1]) < 0.3 else False drone.controller.handbrake = True if abs(angles[1]) > 2.3 else drone.controller.handbrake velocity = 1 + drone.velocity.magnitude() if not self.boost.active or drone.boost >= 99.0 or distance_remaining < 350: drone.pop() elif drone.airborne: drone.push(Recovery(self.target)) elif abs(angles[1]) < 0.05 and 600 < velocity < 2150 and ( distance_remaining / velocity > 2.0 or (adjustment < 90 and car_to_target / velocity > 2.0)): drone.push(Flip(local_target))
def run(self, drone: CarObject, agent: MyHivemind): if self.time == -1: elapsed = 0 self.time = agent.time else: elapsed = agent.time - self.time T = self.intercept_time - agent.time xf = drone.location + drone.velocity * T + 0.5 * gravity * T ** 2 vf = drone.velocity + gravity * T if self.jumping: if self.jump_time == -1: jump_elapsed = 0 self.jump_time = agent.time else: jump_elapsed = agent.time - self.jump_time tau = jump_max_duration - jump_elapsed if jump_elapsed == 0: vf += drone.up * jump_speed xf += drone.up * jump_speed * T vf += drone.up * jump_acc * tau xf += drone.up * jump_acc * tau * (T - 0.5 * tau) vf += drone.up * jump_speed xf += drone.up * jump_speed * (T - tau) if jump_elapsed < jump_max_duration: drone.controller.jump = True elif elapsed >= jump_max_duration and self.counter < 3: drone.controller.jump = False self.counter += 1 elif elapsed < 0.3: drone.controller.jump = True else: self.jumping = jump_elapsed <= 0.3 else: drone.controller.jump = 0 delta_x = self.ball_location - xf direction = delta_x.normalize() if delta_x.magnitude() > 50: defaultPD(drone, drone.local(delta_x)) else: if self.target is not None: defaultPD(drone, drone.local(self.target)) else: defaultPD(drone, drone.local(self.ball_location - drone.location)) if jump_max_duration <= elapsed < 0.3 and self.counter == 3: drone.controller.roll = 0 drone.controller.pitch = 0 drone.controller.yaw = 0 drone.controller.steer = 0 if drone.forward.angle3D(direction) < 0.3: if delta_x.magnitude() > 50: drone.controller.boost = 1 drone.controller.throttle = 0 else: drone.controller.boost = 0 drone.controller.throttle = cap(0.5 * throttle_accel * T ** 2, 0, 1) else: drone.controller.boost = 0 drone.controller.throttle = 0 if T <= 0 or not shot_valid(agent, self, threshold=150): drone.pop() drone.push(Recovery(agent.friend_goal.location))