wangsir 发表于 2023-2-4 01:44:11

[hammer]关于移动怪物的制作以及刷怪点

看此贴以前,请移步到B站看个大佬的视频https://www.bilibili.com/video/BV1qD4y1n7AS/。以下内容默认已经读懂代码以及原理。对于单个BOSS,使用视频里的固然没啥问题,但想要制作一个刷怪点,就需要用class打包一下,以下是我本人基于原文件打包的代码,包含技能(这里只有加速)

//----------------------------BOSS------------------------------------
TICKRATE<-0.05;
TARGET_DISTANCE<-10000;
RETARGET_TIME<-20.00;
SPEED_FORWARD<-0.95;
SPEED_TURNING<-1.5;
class boss
{
        skiNOW=0;//是否处于技能中
        skiJL=0;//是否处于技能冷却状态
        skill=null;//默认NULL,如果怪物拥有技能,这里填上怪物模型的handle
        tf=null;
        ts=null;
        nnself=null;//自身handle
        id=null;//第几个怪物刷新点
        target = null;
        ttime = 0.00;
        ticking = false;
        CTICKRATE=null;
        CTARGET_DISTANCE=null;
        CRETARGET_TIME=null;
        CSPEED_FORWARD=null;
        CSPEED_TURNING=null;
        function CG(sf,idd,TICKRATE,TARGET_DISTANCE,RETARGET_TIME,SPEED_FORWARD,SPEED_TURNING)
        {
                nnself=Entities.FindByName(nnself,sf);
                id=idd;
                CTICKRATE=TICKRATE;
                CTARGET_DISTANCE=TARGET_DISTANCE;
                CRETARGET_TIME=RETARGET_TIME;
                CSPEED_FORWARD=SPEED_FORWARD;
                CSPEED_TURNING=SPEED_TURNING;
        }
        function CStart(){if(!ticking){ticking = true;CTick();}}
        function CStop(){if(ticking){ticking = false;}}
        function CTick()
        {
                if(ticking)
                        EntFireByHandle(nnself,"RunScriptCode","Tick("+id+");",CTICKRATE,null,null);
                else
                {
                        EntFireByHandle(tf,"Deactivate","",0.00,null,null);
                        EntFireByHandle(ts,"Deactivate","",0.00,null,null);
                        EntFireByHandle(nnself,"Kill","",0.05,null,null);
                        return;
                }
                EntFireByHandle(tf,"Deactivate","",0.00,null,null);
                EntFireByHandle(ts,"Deactivate","",0.00,null,null);       
                if(target==null||!target.IsValid()||target.GetHealth()<=0.00||target.GetTeam()!=3||ttime>=CRETARGET_TIME)
                        return CSearchTarget();
                if(skill!=null&&ttime<=15&&ttime>=3&&skiJL==0)//在切换攻击对象后的3——15秒内释放一次技能
                {
                        skiJL++;
                        _CSkill();
                }
                ttime+=CTICKRATE;
                EntFireByHandle(tf,"Activate","",0.02,null,null);
                EntFireByHandle(ts,"Activate","",0.02,null,null);
                local sa = nnself.GetAngles().y;
                local ta = CGetTargetYaw(nnself.GetOrigin(),target.GetOrigin());
                local ang = abs((sa-ta+360)%360);
                if(ang>=180)EntFireByHandle(ts,"AddOutput","angles 0 270 0",0.00,null,null);
                else EntFireByHandle(ts,"AddOutput","angles 0 90 0",0.00,null,null);
                local angdif = (sa-ta-180);
                while(angdif>360){angdif-=180;}
                while(angdif< -180){angdif+=360;}
                angdif=abs(angdif);
                local tdist = CGetDistance(nnself.GetOrigin(),target.GetOrigin());
                local tdistz = (target.GetOrigin().z-nnself.GetOrigin().z);
                if(skiNOW==1)
                {
                        //这里只是释放了“急速”技能
                        EntFireByHandle(tf,"AddOutput","force "+(3000*5).tostring(),0.00,null,null);
                        EntFireByHandle(ts,"AddOutput","force "+((3*2)*angdif).tostring(),0.00,null,null);
                }
                else
                {
                        EntFireByHandle(tf,"AddOutput","force "+(3000*CSPEED_FORWARD).tostring(),0.00,null,null);
                        EntFireByHandle(ts,"AddOutput","force "+((3*CSPEED_TURNING)*angdif).tostring(),0.00,null,null);
                }
        }
        function _CSkill()
        {
                ScriptPrintMessageCenterAll("BOSS开启冲刺技能");
                EntFireByHandle(skill,"SetAnimation","skill1",0,null,null);
                EntFireByHandle(nnself,"RunScriptCode","bosses["+id+"].skiNOW=0",3.9,null,null);
                skiNOW=1;
        }
        function CSearchTarget()
        {
                ttime = 0.00;
                skiJL=0;
                target = null;
                local h = null;
                local candidates = [];
                while(null!=(h=Entities.FindInSphere(h,nnself.GetOrigin(),CTARGET_DISTANCE)))
                {
                        if(h.GetClassname()=="player"&&h.GetTeam()==3&&h.GetHealth()>0)
                        {
                                if(TraceLine(nnself.GetOrigin()+Vector(0,0,40),h.GetOrigin()+Vector(0,0,48),nnself)==1.00)
                                        candidates.push(h);
                        }
                }
                if(candidates.len()==0)return;
                target = candidates;
                if(skill)_CSkill();
        }
        function CGetTargetYaw(start,target)
        {
                local yaw = 0.00;
                local v = Vector(start.x-target.x,start.y-target.y,start.z-target.z);
                local vl = sqrt(v.x*v.x+v.y*v.y);
                yaw = 180*acos(v.x/vl)/3.14159;
                if(v.y<0)
                        yaw=-yaw;
                return yaw;
        }
        function CSetThruster(string,forward){if(forward)tf=Entities.FindByName(tf,string);else ts=Entities.FindByName(ts,string);}
        function CGetDistance(v1,v2){return sqrt((v1.x-v2.x)*(v1.x-v2.x)+(v1.y-v2.y)*(v1.y-v2.y)+(v1.z-v2.z)*(v1.z-v2.z));}
}
used<-0;
bosses<-array(100,boss());
function Start(id)
{
        bosses.CG(self.GetName(),id,TICKRATE,TARGET_DISTANCE,RETARGET_TIME,SPEED_FORWARD,SPEED_TURNING);
        bosses.CStart();
}
function SetThruster(id,forward)
{
        bosses.CSetThruster(caller.GetName(),forward);
}
function Tick(id)
{
        bosses.CTick();
}
function Stop(id)
{
        bosses.CStop();
}
function sk(id)
{
        bosses.skill=Entities.FindByName(bosses.skill,caller.GetName());
}

wangsir 发表于 2023-2-4 01:45:32

调用时,只需要对每个怪物刷新点赋予一个独特的ID,之后想要生成一个怪物只需要ForceSpawn一下

wangsir 发表于 2023-2-4 01:46:21

卡点,又水了一贴(doge)

wangsir 发表于 2023-2-4 01:54:30

貌似只能用mass=1的模型,而且如果怪物刷新在空中以及怪物撞上了怪物很容易侧翻

a200487455 发表于 2023-2-4 02:05:25

{:37_1052:}

MUVIVIT 发表于 2023-2-4 02:32:14

牛逼啊 6

友人Z君 发表于 2023-2-4 02:42:09

{:34_968:}

0101010 发表于 2023-2-4 02:44:32

{:35_1013:}

树叶 发表于 2023-2-4 03:50:32

{:35_1001:}

苍崎青子 发表于 2023-2-4 04:15:27

{:27_135:}

流浪的胖次 发表于 2023-2-4 06:23:49

{:27_127:}

❀雨琳.☆ 发表于 2023-2-4 06:37:10

{:32_771:}

痒痒虫 发表于 2023-2-4 07:02:18

{:37_1057:}

椰羊萌萌哒 发表于 2023-2-4 07:28:06

{:27_128:}

广州周杰伦 发表于 2023-2-4 07:51:06

{:37_1056:}

局部有花丶 发表于 2023-2-4 08:48:33

{:32_772:}

八抱回啪 发表于 2023-2-4 08:57:04

{:37_1059:}

椰羊萌萌哒 发表于 2023-2-4 09:02:11

{:27_128:}

琉璃不是大佬 发表于 2023-2-4 09:34:55

{:32_772:}

zou18750120329 发表于 2023-2-4 09:41:58

{:37_1048:}
页: [1] 2
查看完整版本: [hammer]关于移动怪物的制作以及刷怪点