The Boat
Welcome to The Boat website.
Here you can join The Boat discord server .
Download the script for tracking players through your lobby.
Instructions
Download and unzip the script
Double click to run exe script
You might be prompted with a warning about an unsigned exe
Read prompt and accept, or go to instructions 2 to compile it yourself
If you accepted, the script should run and you should see the names of players in your most recent game
Instructions take 2: no trust edition
Install python from the official site https://www.python.org/downloads/
I used version 3.10.6, if you have any issues use this one
copy the listed code and save it as a python script
import os
import time
import re
import math
from datetime import datetime
file_path = os.path.join(os.getenv('LOCALAPPDATA'), '..\LocalLow\Boundless Dynamics, LLC\VTOLVR\Player.log')
print('File written in \AppData\LocalLow\TheBoat')
if not os.path.exists(os.path.join(os.getenv('LOCALAPPDATA'), '..\LocalLow\TheBoat')):
os.makedirs(os.path.join(os.getenv('LOCALAPPDATA'), '..\LocalLow\TheBoat'))
current_time = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
write_path = os.path.join(os.getenv('LOCALAPPDATA'), '..\LocalLow\TheBoat\hop_' + current_time + ".log")
game_log_file = open(file_path, "r", encoding="utf8")
output_log_file = open(write_path, mode="a+", encoding="utf8")
output_log_file.write("")
#output_log_file.write(os.path.join(os.getenv('LOCALAPPDATA'), 'TheBoat'))
game_log = []
def time_dif(start, end):
mission_time = end - start
mission_hours = math.floor(mission_time.total_seconds() / (60 * 60))
mission_minutes = math.floor(mission_time.total_seconds() / 60) - mission_hours * 60
mission_seconds = math.floor(mission_time.total_seconds()) - (mission_hours * (60 * 60) + mission_minutes * 60)
output = ""
output += " " + str(mission_hours) + " hour"
if mission_hours != 1:
output += "s"
output += " " + str(mission_minutes) + " minute"
if mission_minutes != 1:
output += "s"
output += " " + str(mission_seconds) + " second"
if mission_seconds != 1:
output += "s"
return output
while (True):
#game_log_file = open(file_path, "r")
if len(game_log_file.read().splitlines()) > len(game_log):
arr_len = len(game_log)
i = 1
game_log_file.seek(0, 0)
for line in game_log_file.read().splitlines():
if arr_len < i:
#OPERATE HERE
#print(line)
con = re.search("log_(.{1,20}? has d?i?s?connected)", line)
#player connect / disconnect
nmp = re.search("(Launching Multiplayer game for .*?:).*", line)
#lobby started with mission and map
begin_scenario = re.search("(Beginning the scenario at .*?).*", line)
#begin mission
end_mission = re.search("(Endmission - .*?).*", line)
#end mission
close_lobby = re.search("(LeaveLobby\(\).*?).*", line)
#close lobby
if con != None:
con = con.group()[4:]
current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(current_time + " " + con)
output_log_file.write(current_time + " " + con + "\n")
output_log_file.flush()
elif nmp != None:
nmp = nmp.group().split("Multiplayer game for ")[1]
nmp = nmp.split(":", 1)[1]
current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(current_time + " " + nmp)
output_log_file.write(current_time + " " + nmp + "\n")
output_log_file.flush()
elif begin_scenario != None:
begin_scenario = begin_scenario.group()
mission_start_time = datetime.now()
#mission_start_time = datetime(2024, 1, 16, 10, 2, 6, 800) used for testing, YYYY M D H m s ms
current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(current_time + " " + begin_scenario)
output_log_file.write(current_time + " " + begin_scenario + "\n")
output_log_file.flush()
elif end_mission != None:
end_mission = end_mission.group()
current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(current_time + " " + end_mission + " : lasting " + time_dif(mission_start_time, datetime.now()))
output_log_file.write(current_time + " " + end_mission + " : lasting " + time_dif(mission_start_time, datetime.now()) + "\n")
output_log_file.flush()
elif close_lobby != None:
close_lobby = close_lobby.group()
current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(current_time + " " + close_lobby + " : lasting " + time_dif(mission_start_time, datetime.now()))
output_log_file.write(current_time + " " + close_lobby + " : lasting " + time_dif(mission_start_time, datetime.now()) + "\n")
output_log_file.flush()
#/OPERATE HERE
game_log.append(line)
i += 1
#print("longer: " + str(i))
game_log_file.seek(0, 0)
time.sleep(1)
Use auto PY to EXE to turn python script to an exe yourself https://pypi.org/project/auto-py-to-exe/
run the script
Mode 1/2, log check
You can run the script without the game running to see the players you played with in the latest session, this resets at game launch.
Launch the script, and wait a few seconds for it to populate the screen with names
All the time-stamps next to the names should be your current time
Mission times will be 0 so they can't be used for mission length
Close the script and check the file hop_[time of start] in \AppData\LocalLow\TheBoat\
Inside you will find all the player names written, again all with the same time-stamp
Mode 2/2, flight log
Alternatively you can run the script while the game is running to log players as they join or leave your sessions.
Launch the game, this will make a clean Player.log file
Launch the script
That's it, the script is now running and will keep track of players joining or leaving your lobby
The names will be written to the screen and hop_[time of start] file in \AppData\LocalLow\TheBoat\
Once you're done, or no longer wish to track players, you can close the script, the player names and times will be stored in the hop_[time of start] file in \AppData\LocalLow\TheBoat\ for later viewing