[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());
}
调用时,只需要对每个怪物刷新点赋予一个独特的ID,之后想要生成一个怪物只需要ForceSpawn一下 卡点,又水了一贴(doge) 貌似只能用mass=1的模型,而且如果怪物刷新在空中以及怪物撞上了怪物很容易侧翻 {:37_1052:} 牛逼啊 6 {:34_968:} {:35_1013:} {:35_1001:} {:27_135:} {:27_127:} {:32_771:} {:37_1057:} {:27_128:} {:37_1056:} {:32_772:} {:37_1059:} {:27_128:} {:32_772:} {:37_1048:}
页:
[1]
2