https://linen.dev logo
指定座標から最も近いプレイヤーを取得したい
# forum
m
指定座標から最も近いプレイヤーを取得する方法を探しています。 自分で調べたところいくつか使えそうなメソッドは見つけています。 ・ワールド上のプレイヤーを取得 World.playerEntities ・エンティティから指定座標までの距離取得 Entity#getDistance Streamを使ったフィルターなどで上手くいけそうな気がするのですが行き詰まってます。 また、他にもプレイヤーを取得するメソッドがあるかもしれないので、ご存知の方がいらっしゃればお力をお貸しいただけると幸いです。
u
力技で/tell @aとかしてチャットに内容流して、指定文字列をプレイヤーに送りつけて、その文字列をチャットから抜き取って検知するとかもできそう(最悪) でもやりたいことはプレイヤーIDの取得のはずだから、エンティティをチャットで指定できたとて、そこからIDを返すメソッドがないと何も意味ないか
p
@sの検知の仕組み利用できないかな
h
調べてみたところ、プレイヤーEntityの取得にWorld.getClosestPlayerというメソッドがあるようです(自分は使ったことありません...)
Copy code
js
world.func_72977_a(x, y, z, distance);//1.7.10
world.func_184137_a(x, y, z, distance, (boolean) spectator);//1.12
p
少し別の目的でしたが、自分は
Copy code
javascript
var distance = ...;
entityList = entity.field_70170_p.field_72996_f;
var x1 = ...,
  y1 = ...,
  z1 = ...;
for(var i = 0; i < entityList.length; ++i){
    if(entityList[i] instanceof EntityPlayer){
        if(entityList[i] == NGTUtil.getClientPlayer() && distance >= entityList[i].func_70011_f(x1,y1,z1)) return true;
    }
}
return false;
といった感じでプレイヤーの座標を取得し、距離を測っていました。
私のやつからできるのは、リスト作って、近い順にソートという形ですかね、 (メソッド一発でできるならそれに越したことはないですね)
Copy code
javascript
entityList = entity.field_70170_p.field_72996_f;
var x1 = ...;
var y1 = ...;
var z1 = ...;
var distanceList = [];
for(var i = 0; i < entityList.length; ++i){
  if(entityList[i] instanceof EntityPlayer){
    distanceList[i] = entityList[i].func_70011_f(x1,y1,z1);
  }
}
var closeIndex = distanceList.indexOf(Math.min(...distanceList));
return entityList[closeIndex];
こんな感じですかね
i++かも
h
(スプレッド構文はES5では使えなかったような気がします)
m
お二方ともご回答ありがとうございます!
ひーさんのWorld#getClosestPlayerを試してみたところ、x,y,zから半径distanceの範囲で近いプレイヤーを取得できるみたいで、自分が探し求めていた関数でしたので、こちらを活用させて頂きます。 大変助かりました、ありがとうございます。