自定义NPC脚本论坛

搜索
查看: 141|回复: 0

[1.12.2]获取一个坐标看向另一个坐标的MC横纵角度

[复制链接]

7

主题

8

帖子

183

积分

Lv.4 地上月影

Rank: 6Rank: 6

积分
183

论坛元老勋章

QQ
发表于 2021-8-17 23:55:50 | 显示全部楼层 |阅读模式
虽然不知道有没有人写过了,但还是顺手发一下。因为个人能力太菜了,用了穷举象限的方式来计算。
主要是算法上的问题和适配MC角度的调试
介绍一下作用罢,众所周知MC中有着横向角度和纵向角度。
这个函数的作用便是获取这样的正视角度。
或许能用于判断是否看见目标?
1.12的NPC有提供获取实体横纵视角的方法。
ps:很早就看不惯灰灰写的那个173,要看着头的水平线是闹哪样()
如果有Bug欢迎指出,尽力修改(尽力)
var Math = Java.type("java.lang.Math");
function interact(e){
e.npc.say(getLookSightToAnother(e.player,e.npc).x+","+getLookSightToAnother(e.player,e.npc).y)
}
/**
 * LookSight 视觉方向
 * double x 横向视角,以z轴正方向为0,向x轴负方向渐增(0~360)
 * double y 垂直视角,以水平方向为0,向y轴正方向渐减(-90~90)
 */
function LookSight(x,y){
        this.x = x;
        this.y = y;
}
/**
 * getLookSightToAnother 获取一个实体看向另一个实体的视觉角度
 * IEntity/IPos from 观察者
 * IEntity/IPos target 被观察者
 * return LookSight 一个实体看向另一个实体的视觉角度
 */
function getLookSightToAnother(from,target){
        var x1 = from.getX();
        var y1 = from.getY();
        var z1 = from.getZ();
        var x2 = target.getX()-x1;
        var y2 = target.getY()-y1;
        var z2 = target.getZ()-z1;
        var d = Math.sqrt(Math.abs(x2)*Math.abs(x2)+Math.abs(z2)*Math.abs(z2));
        var xQuadrant = getQuadrant(x2,z2);
        var yQuadrant = getQuadrant(z2,y2);
        var x;
        var y;
        switch(xQuadrant){
                case 1:
                        x = 270+Math.toDegrees(Math.asin(Math.abs(z2)/Math.sqrt(Math.abs(x2)*Math.abs(x2)+Math.abs(z2)*Math.abs(z2))));
                        break;
                case 2:
                        x = 90-Math.toDegrees(Math.asin(Math.abs(z2)/Math.sqrt(Math.abs(x2)*Math.abs(x2)+Math.abs(z2)*Math.abs(z2))));
                        break;
                case 3:
                        x = 90+Math.toDegrees(Math.asin(Math.abs(z2)/Math.sqrt(Math.abs(x2)*Math.abs(x2)+Math.abs(z2)*Math.abs(z2))));
                        break;
                case 4:
                        x = 270-Math.toDegrees(Math.asin(Math.abs(z2)/Math.sqrt(Math.abs(x2)*Math.abs(x2)+Math.abs(z2)*Math.abs(z2))));
                        break;
                case 5:
                        x = 0;
                        break;
                case 6:
                        x = 90;
                        break;
                case 7:
                        x = 180;
                        break;
                case 8:
                        x = 270;
                        break;
                case 9:
                        x = 0;
                        break;
        }
        switch(yQuadrant){
                case 1:
                        y = Math.toDegrees(Math.asin(Math.abs(y2)/Math.sqrt(Math.abs(d)*Math.abs(d)+Math.abs(y2)*Math.abs(y2))));
                        break;
                case 2:
                        y = 0-Math.toDegrees(Math.asin(Math.abs(y2)/Math.sqrt(Math.abs(d)*Math.abs(d)+Math.abs(y2)*Math.abs(y2))));
                        break;
                case 3:
                        y = 0-Math.toDegrees(Math.asin(Math.abs(y2)/Math.sqrt(Math.abs(d)*Math.abs(d)+Math.abs(y2)*Math.abs(y2))));
                        break;
                case 4:
                        y = Math.toDegrees(Math.asin(Math.abs(y2)/Math.sqrt(Math.abs(d)*Math.abs(d)+Math.abs(y2)*Math.abs(y2))));
                        break;
                case 5:
                        y = -90;
                        break;
                case 6:
                        y = 0;
                        break;
                case 7:
                        y = 90;
                        break;
                case 8:
                        y = 0;
                        break;
                case 9:
                        y = 0;
                        break;
        }
        return new LookSight(x,y);
}
/**
 * 获取坐标象限
 * 1~4对应象限
 * 5~8对应从y正半轴逆时针旋转的坐标轴
 * 9对应原点
 * ps:可以写的更简洁一些,只是我个人喜欢看这种排版
 */
function getQuadrant(x,y){
        if(x>0&&y>0)
                return 1;
        if(x<0&&y>0)
                return 2;
        if(x<0&&y<0)
                return 3;
        if(x>0&&y<0)
                return 4;
        if(x==0){
                if(y>0)
                        return 5;
                if(y<0)
                        return 7;
        }
        if(y==0){
                if(x<0)
                        return 6;
                if(x>0)
                        return 8;
        }
        if(x==0&&y==0)
                return 9;
        return -1;
}

评分

参与人数 1金粒 +20 收起 理由
早上 + 20 我超,大佬,牛逼!

查看全部评分

暂时没有想好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表