8000 Feature/train station block by toropippi · Pull Request #498 · moorestech/moorestech · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Feature/train station block #498

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using Game.Block.Interface.Component;
using Newtonsoft.Json;

namespace Game.Block.Blocks.TrainRail
{
/// <summary>
/// 貨物駅用のコンポーネント。
/// オープン可能なインベントリを持ち、かつ列車が到着・出発した状態も持つ。
/// </summary>
public class CargoplatformComponent : IBlockSaveState
{
private readonly int _stationLength;

// インベントリスロット数やUI更新のための設定
public int InputSlotCount { get; private set; }
public int OutputSlotCount { get; private set; }

public bool IsDestroy { get; private set; }


/// <summary>
/// コンストラクタ
/// </summary>
public CargoplatformComponent(
int stationLength,
int inputSlotCount,
int outputSlotCount
)
{
_stationLength = stationLength;
InputSlotCount = inputSlotCount;
OutputSlotCount = outputSlotCount;
}


/// <summary>
/// セーブ機能:ブロックが破壊されたりサーバーを落とすとき用
/// </summary>
public string SaveKey { get; } = typeof(CargoplatformComponent).FullName;


public string GetSaveState()
{
var stationComponentSaverData = new StationComponent.StationComponentSaverData("cargo");
/*foreach (var item in _itemDataStoreService.InventoryItems)
{
stationComponentSaverData.itemJson.Add(new ItemStackSaveJsonObject(item));
}*/
return JsonConvert.SerializeObject(stationComponentSaverData);
}


public void Destroy()
{
IsDestroy = true;
}
}
}

Some generated files are 8000 not rendered by default. Learn more about how customized files appear on GitHub.

F438
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,28 @@ public class RailComponent : IBlockComponent
public RailNode FrontNode { get; private set; }
public RailNode BackNode { get; private set; }

private BlockPositionInfo componentPositionInfo;
private float bezierStrength = 0.5f;
private float controlPointStrength = 0.5f;

public RailControlPoint FrontRailControlPoint { get; }
public RailControlPoint BackRailControlPoint { get; }
public RailControlPoint FrontControlPoint { get; }
public RailControlPoint BackControlPoint { get; }

// RailSaverComponent からみた自分の通し番号を含む識別子
public RailComponentID RailComponentID { get; }
// ブロック座標とIDが格納されている
public RailComponentID ComponentID { get; }
private BlockDirection railBlockDirection;
public Vector3 Position { get; }//ブロックではなくレールのつなぎ目としてのこのcomponentの位置

/// <summary>
/// コンストラクタ
/// </summary>
public RailComponent(BlockPositionInfo positionInfo, RailComponentID railComponentID = null)
public RailComponent(Vector3 position, BlockDirection blockDirection, RailComponentID railComponentID = null)
{
RailComponentID = railComponentID;
componentPositionInfo = positionInfo;
Position = position;
railBlockDirection = blockDirection;
ComponentID = railComponentID;

// ベジェ曲線の制御点
FrontRailControlPoint = new RailControlPoint(positionInfo.OriginalPos, GetControlPoint(true));
BackRailControlPoint = new RailControlPoint(positionInfo.OriginalPos, GetControlPoint(false));
// ベジェ曲線の制御点を初期化
FrontControlPoint = new RailControlPoint(position, CalculateControlPointOffset(true));
BackControlPoint = new RailControlPoint(position, CalculateControlPointOffset(false));

// RailNode を作成して RailGraph に登録
FrontNode = new RailNode();
Expand All @@ -52,56 +54,56 @@ public RailComponent(BlockPositionInfo positionInfo, RailComponentID railCompone
BackNode.SetOppositeNode(FrontNode);

// RailNodeに制御点を登録(表裏で使う制御点が異なる)
FrontNode.SetRailControlPoints(FrontRailControlPoint, BackRailControlPoint);
BackNode.SetRailControlPoints(BackRailControlPoint, FrontRailControlPoint);
FrontNode.SetRailControlPoints(FrontControlPoint, BackControlPoint);
BackNode.SetRailControlPoints(BackControlPoint, FrontControlPoint);
}

/// <summary>
/// RailComponent同士を接続する
/// </summary>
/// <param name="targetRail">接続先のRailComponent</param>
/// <param name="isFrontThis">自分側の接続がFrontかどうか</param>
/// <param name="isFrontTarget">相手側の接続がFrontかどうか</param>
/// <param name="defaultDistance">明示的に距離を指定したい場合(-1なら自動計算)</param>
public void ConnectRailComponent(RailComponent targetRail, bool isFrontThis, bool isFrontTarget, int defaultDistance = -1)
/// <param name="targetComponent">接続先のRailComponent</param>
/// <param name="useFrontSideOfThis">自分側の接続がFrontかどうか</param>
/// <param name="useFrontSideOfTarget">相手側の接続がFrontかどうか</param>
/// <param name="explicitDistance">明示的に距離を指定したい場合(-1なら自動計算)</param>
public void ConnectRailComponent(RailComponent targetComponent, bool useFrontSideOfThis, bool useFrontSideOfTarget, int explicitDistance = -1)
{
// まず、接続する2つのRailNodeを取得
var (thisNode, thisOppositeNode) = GetNodes(isFrontThis);
var (thatNode, thatOppositeNode) = targetRail.GetNodes(isFrontTarget);
var (thisNode, thisOppositeNode) = GetRailNodesBySide(useFrontSideOfThis);
var (targetNode, targetOppositeNode) = targetComponent.GetRailNodesBySide(useFrontSideOfTarget);

// 距離計算(指定がなければベジェ曲線をもとに推定)
int distance = defaultDistance >= 0
? defaultDistance
: CalculateDistanceTo(targetRail, isFrontThis, isFrontTarget);
int distance = explicitDistance >= 0
? explicitDistance
: ComputeDistanceToComponent(targetComponent, useFrontSideOfThis, useFrontSideOfTarget);

// 相互接続
thisNode.ConnectNode(thatNode, distance);
thatOppositeNode.ConnectNode(thisOppositeNode, distance);
thisNode.ConnectNode(targetNode, distance);
targetOppositeNode.ConnectNode(thisOppositeNode, distance);
}

/// <summary>
/// RailComponent同士の接続を解除する
/// </summary>
/// <param name="targetRail">切断先のRailComponent</param>
/// <param name="isFrontThis">自分側の接続がFrontかどうか</param>
/// <param name="isFrontTarget">相手側の接続がFrontかどうか</param>
public void DisconnectRailComponent(RailComponent targetRail, bool isFrontThis, bool isFrontTarget)
/// <param name="targetComponent">切断先のRailComponent</param>
/// <param name="useFrontSideOfThis">自分側の接続がFrontかどうか</param>
/// <param name="useFrontSideOfTarget">相手側の接続がFrontかどうか</param>
public void DisconnectRailComponent(RailComponent targetComponent, bool useFrontSideOfThis, bool useFrontSideOfTarget)
{
var (thisNode, thisOppositeNode) = GetNodes(isFrontThis);
var (thatNode, thatOppositeNode) = targetRail.GetNodes(isFrontTarget);
var (thisNode, thisOppositeNode) = GetRailNodesBySide(useFrontSideOfThis);
var (targetNode, targetOppositeNode) = targetComponent.GetRailNodesBySide(useFrontSideOfTarget);

thisNode.DisconnectNode(thatNode);
thatOppositeNode.DisconnectNode(thisOppositeNode);
thisNode.DisconnectNode(targetNode);
targetOppositeNode.DisconnectNode(thisOppositeNode);
}

/// <summary>
/// ベジェ曲線の強度を変更し、制御点を更新する
/// </summary>
public void ChangeBezierStrength(float val)
public void UpdateControlPointStrength(float strength)
{
bezi 9E19 erStrength = val;
FrontRailControlPoint.ControlPointPosition = GetControlPoint(true);
BackRailControlPoint.ControlPointPosition = GetControlPoint(false);
controlPointStrength = strength;
FrontControlPoint.ControlPointPosition = CalculateControlPointOffset(true);
BackControlPoint.ControlPointPosition = CalculateControlPointOffset(false);
}

/// <summary>
Expand All @@ -111,63 +113,61 @@ public RailComponentInfo GetPartialSaveState()
{
var state = new RailComponentInfo
{
MyID = RailComponentID,
BezierStrength = bezierStrength,
MyID = ComponentID,
BezierStrength = controlPointStrength,
ConnectMyFrontTo = new List<ConnectionDestination>(),
ConnectMyBackTo = new List<ConnectionDestination>()
};

// FrontNode の接続リスト
foreach (var node in FrontNode.ConnectedNodes)
{
var destInfo = RailGraphDatastore.GetRailComponentID(node);
state.ConnectMyFrontTo.Add(destInfo);
var connectionInfo = RailGraphDatastore.GetRailComponentID(node);
state.ConnectMyFrontTo.Add(connectionInfo);
}

// BackNode の接続リスト
foreach (var node in BackNode.ConnectedNodes)
{
var destInfo = RailGraphDatastore.GetRailComponentID(node);
state.ConnectMyBackTo.Add(destInfo);
var connectionInfo = RailGraphDatastore.GetRailComponentID(node);
state.ConnectMyBackTo.Add(connectionInfo);
}

return state;
}

/// <summary>
/// isFrontフラグに応じてFrontNode/BackNodeを返すヘルパーメソッド
/// 指定されたサイドに応じて FrontNode/BackNodeを返すヘルパーメソッド
/// </summary>
private (RailNode node, RailNode oppositeNode) GetNodes(bool isFront)
private (RailNode node, RailNode oppositeNode) GetRailNodesBySide(bool useFrontSide)
{
return isFront
return useFrontSide
? (FrontNode, BackNode)
: (BackNode, FrontNode);
}

/// <summary>
/// 相手RailComponentとの距離をベジェ曲線から自動計算する
/// 対象のRailComponentとの距離をベジェ曲線から自動計算する
/// </summary>
private int CalculateDistanceTo(RailComponent targetRail, bool isFrontThis, bool isFrontTarget)
private int ComputeDistanceToComponent(RailComponent targetComponent, bool useFrontSideOfThis, bool useFrontSideOfTarget)
{
var myControlPoint = isFrontThis ? FrontRailControlPoint : BackRailControlPoint;
var targetControlPoint = isFrontTarget ? targetRail.BackRailControlPoint : targetRail.FrontRailControlPoint;
var thisControlPoint = useFrontSideOfThis ? FrontControlPoint : BackControlPoint;
var targetControlPoint = useFrontSideOfTarget ? targetComponent.BackControlPoint : targetComponent.FrontControlPoint;

// 実際にはスケーリング等の係数をかけて距離に変換
float rawLength = BezierUtility.GetBezierCurveLength(myControlPoint, targetControlPoint);
float scaled = rawLength * BezierUtility.RAIL_LENGTH_SCALE;
return (int)(scaled + 0.5f);
float rawLength = BezierUtility.GetBezierCurveLength(thisControlPoint, targetControlPoint);
float scaledLength = rawLength * BezierUtility.RAIL_LENGTH_SCALE;
return (int)(scaledLength + 0.5f);
}

/// <summary>
/// isFront の値によってベジェ制御点(相対座標)を返す
/// 指定されたサイドに応じたベジェ制御点の相対座標を返す
/// </summary>
private Vector3 GetControlPoint(bool isFront)
private Vector3 CalculateControlPointOffset(bool useFrontSide)
{
// 想定:dirは North, East, South, West のみ
var dir = componentPositionInfo.BlockDirection;
Vector3 direction = Vector3.zero;

switch (dir)
switch (railBlockDirection)
{
case BlockDirection.North:
direction = Vector3.forward; // (0,0,1)
Expand All @@ -183,9 +183,9 @@ private Vector3 GetControlPoint(bool isFront)
break;
}

return isFront
? direction * bezierStrength
: -direction * bezierStrength;
return useFrontSide
? direction * controlPointStrength
: -direction * controlPointStrength;
}

/// <summary>
Expand All @@ -199,6 +199,5 @@ public void Destroy()
FrontNode = null;
BackNode = null;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class RailSaverComponent : IBlockComponent, IBlockSaveState
/// 1つのブロックに2つのRailComponentを持つ可能性がある(例: 駅, 貨物プラットフォームなど)
/// </summary>
public bool IsDestroy { get; private set; }
public string SaveKey => "RailSaverComponent";
public string SaveKey => typeof(RailSaverComponent).FullName;

public RailComponent[] RailComponents { get; private set; }

Expand Down
Loading
4130 Loading
0