Add location of cars within the trainset the user is in
Slight tidy up
This commit is contained in:
1 parent
55dfd09550
commit
8daf861088
7 files changed
+79
-11
No files matched your search
@@ -20,7 +20,7 @@ namespace CommunityMapLocation.Api
|
||||
serializerOptions = new JsonSerializerOptions()
|
||||
{
|
||||
ReferenceHandler = ReferenceHandler.IgnoreCycles,
|
||||
IncludeFields = true,
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
WriteIndented = true
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
using DV.OriginShift;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CommunityMapLocation.Api.Location
|
||||
{
|
||||
public class CarLocationResponse
|
||||
{
|
||||
public CarLocationResponse(TrainCar trainCar)
|
||||
{
|
||||
IsLoco = trainCar.IsLoco;
|
||||
Name = trainCar.name;
|
||||
Id = trainCar.ID;
|
||||
CarGuid = trainCar.CarGUID;
|
||||
|
||||
// Probable not needed. Commented to remove additional dll dependency
|
||||
//HandbrakePosition = trainCar.brakeSystem.handbrakePosition;
|
||||
|
||||
// TrainCar.Bounds does not seem to represent the actual bounds of the car.
|
||||
// Approximate the car length as the distance between the couplers
|
||||
Length = (trainCar.FrontCouplerAnchor.AbsolutePosition() - trainCar.RearCouplerAnchor.AbsolutePosition()).magnitude;
|
||||
|
||||
var transform = trainCar.transform.AbsolutePosition();
|
||||
X = transform.x;
|
||||
Y = transform.y;
|
||||
Z = transform.z;
|
||||
|
||||
Rotation = trainCar.transform.rotation.eulerAngles.y * (Mathf.PI / 180);
|
||||
}
|
||||
|
||||
public string Id { get; }
|
||||
public string CarGuid { get; }
|
||||
public string Name { get; }
|
||||
public bool IsLoco { get; }
|
||||
//public float HandbrakePosition { get; }
|
||||
|
||||
public float X { get; }
|
||||
public float Y { get; }
|
||||
public float Z { get; }
|
||||
public float Length { get; }
|
||||
public float Rotation { get; }
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using DV.HUD;
|
||||
using DV.OriginShift;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using UnityEngine;
|
||||
@@ -15,26 +16,36 @@ namespace CommunityMapLocation.Api.Location
|
||||
|
||||
public override LocationResponse Handle(UnityModManager.ModEntry.ModLogger logger, HttpListenerRequest request)
|
||||
{
|
||||
float angle;
|
||||
Transform rotationTransform;
|
||||
var reverse = false;
|
||||
|
||||
// If the player is in a loco, we want to get the heading of the loco instead of the play
|
||||
if (PlayerManager.Car?.IsLoco == true)
|
||||
{
|
||||
angle = PlayerManager.Car.transform.rotation.eulerAngles.y;
|
||||
rotationTransform = PlayerManager.Car.transform;
|
||||
|
||||
// If the loco is in reverse, rotate the direction 180 degrees to match the direction of travel
|
||||
if (PlayerManager.Car.interior.GetComponentInChildren<InteriorControlsManager>().TryGetControl(InteriorControlsManager.ControlType.Reverser, out var control) &&
|
||||
control.controlImplBase.Value <= 0.25)
|
||||
{
|
||||
angle += 180;
|
||||
reverse = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
angle = PlayerManager.PlayerCamera.transform.rotation.eulerAngles.y;
|
||||
rotationTransform = PlayerManager.PlayerCamera.transform;
|
||||
}
|
||||
|
||||
return new LocationResponse(PlayerManager.PlayerTransform.AbsolutePosition(), angle * Mathf.PI / 180);
|
||||
var cars = Array.Empty<CarLocationResponse>();
|
||||
if (PlayerManager.Car != null)
|
||||
{
|
||||
cars = PlayerManager.Car.trainset.cars.Select(c => new CarLocationResponse(c)).ToArray();
|
||||
}
|
||||
|
||||
return new LocationResponse(PlayerManager.PlayerTransform, reverse)
|
||||
{
|
||||
Cars = cars
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,34 @@
|
||||
using UnityEngine;
|
||||
using DV.OriginShift;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace CommunityMapLocation.Api.Location
|
||||
{
|
||||
public class LocationResponse
|
||||
{
|
||||
public LocationResponse(Vector3 position, float rotation)
|
||||
public LocationResponse(Transform playerTransform, bool reverse)
|
||||
{
|
||||
var position = playerTransform.AbsolutePosition();
|
||||
|
||||
X = position.x;
|
||||
Y = position.y;
|
||||
Z = position.z;
|
||||
|
||||
Rotation = rotation;
|
||||
var angle = playerTransform.rotation.eulerAngles.y;
|
||||
|
||||
if (reverse)
|
||||
{
|
||||
angle += 180;
|
||||
}
|
||||
|
||||
Rotation = angle * (Mathf.PI / 180);
|
||||
}
|
||||
|
||||
public float X { get; }
|
||||
public float Y { get; }
|
||||
public float Z { get; }
|
||||
public float Rotation { get; }
|
||||
|
||||
public IEnumerable<CarLocationResponse> Cars { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -99,6 +99,7 @@
|
||||
<Compile Include="Api\ApiServer.cs" />
|
||||
<Compile Include="Api\Endpoint.cs" />
|
||||
<Compile Include="Api\IEndpoint.cs" />
|
||||
<Compile Include="Api\Location\CarLocationResponse.cs" />
|
||||
<Compile Include="Api\Location\LocationEndpoint.cs" />
|
||||
<Compile Include="Api\Location\LocationResponse.cs" />
|
||||
<Compile Include="Config\RequestSourceType.cs" />
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace CommunityMapLocation.Config
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
// Todo: store and hold back property changes until Settings is saved to prevent rapidly reconfiguring server on each keypress?
|
||||
// Not yet used anywhere, so could revert to using standard auto-properties
|
||||
private void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
|
||||
{
|
||||
if (!EqualityComparer<T>.Default.Equals(field, value))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Id":"CommunityMapLocation",
|
||||
"DisplayName":"Derail Valley Community Map Location",
|
||||
"Author":"TheEvilPenguin",
|
||||
"Author":"BenjaminGreene",
|
||||
"Version":"0.0.1",
|
||||
"ManagerVersion":"0.31.1.0",
|
||||
"EntryMethod":"CommunityMapLocation.Main.Load"
|
||||
|
||||
Reference in new issue
Block a user