おれはでんしゃ
02/26/2024, 1:15 PMおれはでんしゃ
02/26/2024, 1:16 PMhi03
02/28/2024, 1:09 PMjs
//### レールの取得 ###
//--リストから取得する--
//リストをぶん回すため比較的処理コストが高い
//走査を実行する車両数x存在するTileEntityの数だけ重たくなる
//有効チャンク内すべてのレールを調べられる
importPackage(Packages.jp.ngt.rtm.rail);//TileEntityLargeRailCore
︙
var world = entity.field_70170_p; // entity.worldObj
var tileEntityList = world.field_147482_g // world.loadedTileEntityList 返り値は配列ではなくList型
for (var i = 0; i < tileEntityList.size(); i++) {
var tile = tileEntityList.get(i);
if (tile instanceof TileEntityLargeRailCore) {
//このブロック内のtileはレールコアのTileEntity
//処理
}
}
//--座標から取得する--
//座標がわかっているならこちらの方が良い
//凍結チャンクのレールを取得できるかは調べてない
importPackage(Packages.jp.ngt.rtm.rail);//TileEntityLargeRailCore
︙
var world = entity.field_70170_p; // entity.worldObj
var railTile = TileEntityLargeRailBase.getRailFromCoordinates(world, x, y, z);
if (railTile) {
var tile = railTile.getRailCore();
//処理
}
//--車両Entityから直下のレールタイルを取得する--
importPackage(Packages.jp.ngt.rtm.rail);//TileEntityLargeRailBase
︙
var world = entity.field_70170_p; // entity.worldObj
var x = entity.field_70165_t; // entity.posX
var y = entity.field_70163_u; // entity.posY
var z = entity.field_70161_v; // entity.posZ
var railTile = TileEntityLargeRailBase.getRailFromCoordinates(world, x, y, z);
if (railTile) {
var tile = railTile.getRailCore();
//処理
}hi03
02/28/2024, 1:10 PMjs
//※ ここ以降はtileがTileEntityLargeRailCoreである前提で記述します ※
//### 隣のレールを取得する ###
//レールは0~4つの隣接するレールを持ちます 個数が可変のため、例では配列を使用しています
//分岐による隣接の無限ループにならないような対策が別途必要です(追跡深さを制限するなど)
importPackage(Packages.jp.ngt.rtm.rail);//TileEntityLargeRailSwitchCore TileEntityLargeRailBase
importPackage(Packages.jp.ngt.rtm.rail.util);//RailPosition
︙
var connectedRails = [];
if (tile instanceof TileEntityLargeRailSwitchCore) {//分岐レールの場合
var railSwitch = tile.getSwitch();
if (railSwitch) {
var pointList = railSwitch.getPoints();//分岐は3つ/4つの根本を持つ
for (var i = 0; i < pointList.length; i++) {
var rp = pointList[i].rpRoot;
connectedRails.push(getConnectedRailTile(rp));
}
}
}
else {//通常レールの場合
var railMap = tile.getRailMap(entity);
var rp0 = railMap.getStartRP();
var rp1 = railMap.getEndRP();
connectedRails.push(getConnectedRailTile(rp0));
connectedRails.push(getConnectedRailTile(rp1));
}
connectedRails = connectedRails.filter(function (connectedRail) {
return connectedRail !== tile && connectedRail !== null;
});
︙
function getConnectedRailTile(rp) {
var x = Math.floor(rp.blockX + 0.5 + RailPosition.REVISION[rp.direction][0] * 2);
var y = rp.blockY;
var z = Math.floor(rp.blockZ + 0.5 + RailPosition.REVISION[rp.direction][1] * 2);
var tile = world.func_147438_o(x, y, z);
if (tile instanceof TileEntityLargeRailBase) return tile.getRailCore();
return null;
}
//### レールの長さを取得する ###
//分岐に対する挙動は調べてません おそらく車両entityに対して有効なRailMapの長さになると思います
var railMap = tile.getRailMap(entity);
var railLength = railMap.getLength();
//### IDを取得 ###
//TileEntityは一意の識別子を持ちません 代わりに座標を連結して文字列にします
var x = tile.field_145851_c; // tile.xCoord
var y = tile.field_145848_d; // tile.yCoord
var z = tile.field_145849_e; // tile.zCoord
var id = x + "_" + y + "_" + z;hi03
02/28/2024, 1:12 PMjs
var world = entity.func_145831_w(); // entity.getWorld()おれはでんしゃ
02/28/2024, 2:22 PMおれはでんしゃ
02/28/2024, 2:23 PM