4U      nut scripts/vscripts director_base_addon Yh    l  aitk_bhop4 U7  *f     aitk_bhop3 y  dE     aitk_bhop2 lŔ  $     aitk_bhop ߺ         txt   addoninfo 𽶧           // The addoninfo.txt file is a metadata file that is required by all Source Engine Add-ons.

"AddonInfo"
{
	addonSteamAppID		550							// 500 is the app ID for Left 4 Dead, 550 for Left 4 Dead 2
	addontitle		"AI Tank Bunny Hop"						// Add-on title that shows up in Add-ons list. ~20 chars max
	addonversion		1.0							// Add-on version.
	addontagline		"AI Tank Bunny Hop"
	addonauthor		"ƊĄƦƘƝƏƘƟ¹ꝰꝰꝰ"						// Name/alias of the author
	addonSteamGroupName	""						// (Optional) Steam group related to the add-on. We use this to construct a URL to the group page.
	addonauthorSteamID	"https://steamcommunity.com/id/darkneko1999/"						// (Optional) Steam ID of author. We use this to construct a URL to the author's page.
	addonURL0		""			//An html home page for the add-on that includes a download link.

	// short description that appears in the Add-on list screen...
	addonDescription	"Credits to the original author (无畏澡八强) for this script..."
}const BoostForward=60.0; // Bhop
const PI = 3.141592653;
const Max_Velocity_hor_1 = 225;
enum VelocityOverride {
	VelocityOvr_None = 0,
	VelocityOvr_Velocity,
	VelocityOvr_OnlyWhenNegative,
	VelocityOvr_InvertReuseVelocity
};
if (Director.GetGameModeBase()=="coop"&&!Entities.FindByName(null, "bind_tkhop")) {SpawnEntityFromTable("logic_timer",{targetname="bind_tkhop",vscripts="aitk_bhop",RefireTime = 0.5 , OnTimer = "!caller,runscriptcode,Thinks()"});}
function Thinks()
{
    local i,ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            if (!Entities.FindByName(null, "tkbhop")) {
	        //Convars.SetValue("sv_airaccelerate",2000);
            SpawnEntityFromTable("logic_timer", {targetname = "tkbhop", vscripts="aitk_bhop",RefireTime = 0.06, OnTimer = "!caller,runscriptcode,Tankruncmd()"});
            }
        }
    }
}
function OnGameEvent_tank_killed(params)
{
    //Msg("no");
    local i;
    local tptk = 0;
    local ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            tptk+=1;
        }else if(ent == null)
        {
            break;
        }
    }
    if(tptk == 0)
    {
        EntFire("tkbhop","Kill",null,0,null);
    }
}
function GetAliveSurvivor()
{
    local tp_sr;
    local newi;
    local ent;
    for(newi = 0;newi < 18;newi++)
    {
        ent =Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            tp_sr=ent;
            break;
            //Msg(tp_sr[newi]);
        }else if(ent==null)
        {
            break;
        }
    }
        return tp_sr;
    
}
function GetVectorWithFloat(ent,propstring)
{
    local tpos;
    if(ent == null || ent.IsValid() == false)
    {
        return null;
    }else if(propstring == "origin")
    {
        tpos = ent.GetOrigin().tostring();
    }else if(propstring == "vel")
    {
        tpos = ent.GetVelocity().tostring();
    }
    else if(propstring == "eyeangle")
    {
        tpos = ent.EyeAngles().tostring();
    }
    local tp_1 = split(split(tpos,"(")[1],")")[0];
    local tp_2 = split(tp_1,",");
    local tp_3 = [tp_2[0].tofloat(),tp_2[1].tofloat(),tp_2[2].tofloat()];
    return tp_3;

}
function GetDistance(dis1,dis2)//方法是GetDistance([0，0，0],[0，0，0]);
{
    if(dis1 != null && dis2 != null)
    {   
        local tp_dis = pow(dis1[0]-dis2[0],2)+pow(dis1[1]-dis2[1],2)+pow(dis1[2]-dis2[2],2);
        return sqrt(tp_dis);
    }
    else return;
    
}
function GetClosetSurvivor(rp)//方法同上用[0，0，0]
{
    local surPos=[0,0,0];
    local closetSur = GetAliveSurvivor();
    surPos = GetVectorWithFloat(closetSur,"origin");
    local iclosetdis = GetDistance(rp,surPos);
    local i;
    local ent;
    for(i=0;i<18;i++)
    {
        ent = Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            surPos = GetVectorWithFloat(ent,"origin");
            local tp_posdis = GetDistance(rp,surPos);
            if(iclosetdis < 0)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }else if (tp_posdis < iclosetdis)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }
        }else if(ent == null)
        {
            break;
        }
    }
    return closetSur;
}
function DisableButton(ent,button)//能够使不按下此按钮。
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons | button ) );
}
function EnableButton(ent,button)
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons & ~button ) );
}
function ForceButton(ent,button)
{
	local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",(buttons | button));
}
function UnForceButton(ent,button)
{
    local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",( buttons & ~button ));
}
function Tankruncmd()
{
    //local tp_tank;
    local flags;
    local fVelocity;
    local currentspeed;
    local clienteyes;
    local tankpos;
    local closetsur;
    local hassight;
    local tank_ent;
    local i;
    for(i=0;i<16;i++)
    {
        tank_ent = Entities.FindByClassname(tank_ent,"player");
        if(tank_ent != null && tank_ent.GetZombieType() == 8 && !tank_ent.IsDead() && !tank_ent.IsDying())
        {
            //Msg(tp_tank[1]+"\n");
            //DisableButton(tank_ent,2048);
            flags=NetProps.GetPropInt(tank_ent,"m_fFlags");
            fVelocity=GetVectorWithFloat(tank_ent,"vel");
            currentspeed=sqrt(pow(fVelocity[0],2.0)+pow(fVelocity[1],2.0));
            //clienteyes=GetVectorWithFloat(tank_ent,"eyeangle");
            tankpos=GetVectorWithFloat(tank_ent,"origin");
            closetsur=GetClosetSurvivor(tankpos);
            hassight=NetProps.GetPropInt(tank_ent,"m_hasVisibleThreats");
            if (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 0) && NetProps.GetPropInt(tank_ent,"m_nButtons") & (1 << 1)) {
				local up_speed = (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 1) /* Player is fully crouched */ ) ? 297 : 247;
				local Angles = tank_ent.EyeAngles();
				local Velocity_x = Max_Velocity_hor_1*cos(Angles.y*PI/180);
				local Velocity_y = Max_Velocity_hor_1*sin(Angles.y*PI/180);
				NetProps.SetPropVector(tank_ent,"m_vecBaseVelocity",Vector(Velocity_x,Velocity_y,up_speed));
				//Say(null, "your speed = " + getHirozontalSpeed(ent), false);
			}
            local tp_dist = GetDistance((GetVectorWithFloat(closetsur,"origin")),tankpos);
            //Msg(flags+"\n");
            if(hassight && 650 > tp_dist && tp_dist > 180 && (currentspeed > 190.0))
            {
                 
                if(flags & 1)
                {
                    ForceButton(tank_ent,4);
                    ForceButton(tank_ent,2);
                    //ForceButton(tank_ent,8);
                    
                    if(tank_ent.GetButtonMask() == 8)
                    {
                        //Msg(currentspeed+"前进\n");
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&16)
                    {
                        //Msg(currentspeed+"后退\n");
                        //clienteyes[1]+=180.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&512)
                    {
                        //Msg(currentspeed+"左边\n");
                        //clienteyes[1]+=90.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&1024)
                    {
                        //Msg(currentspeed+"右边\n");
                        //clienteyes[1]+=-90.0;
                        ClientPush(tank_ent);
                    }
                }
                if(NetProps.GetPropInt(tank_ent,"movetype") == 9)
                {
                    UnForceButton(tank_ent,2);
                    UnForceButton(tank_ent,4);
                    //UnForceButton(tank_ent,8);
                }
            }else if((tp_dist>650 || tp_dist<180)&&currentspeed<190.0)
            {
                //Msg(1+"\n")
                UnForceButton(tank_ent,2);
                UnForceButton(tank_ent,4);
                //UnForceButton(tank_ent,8);
            }
        }else if(tank_ent != null && tank_ent.GetZombieType() != 8)
        {
            continue;
        }else if (tank_ent == null)
        {
            break;
        }
    }
    
}

function ClientPush(ent)
{
    local newvel = GetVectorWithFloat(ent,"vel");
    ent.SetVelocity(Vector(newvel[0]+10,newvel[1]+10,newvel[2]));
    
}const BoostForward=60.0; // Bhop
const PI = 3.141592653;
const Max_Velocity_hor_1 = 225;
enum VelocityOverride {
	VelocityOvr_None = 0,
	VelocityOvr_Velocity,
	VelocityOvr_OnlyWhenNegative,
	VelocityOvr_InvertReuseVelocity
};
if (Director.GetGameModeBase()=="survival"&&!Entities.FindByName(null, "bind_tkhop")) {SpawnEntityFromTable("logic_timer",{targetname="bind_tkhop",vscripts="aitk_bhop2",RefireTime = 0.5 , OnTimer = "!caller,runscriptcode,Thinks()"});}
function Thinks()
{
    local i,ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            if (!Entities.FindByName(null, "tkbhop")) {
	        //Convars.SetValue("sv_airaccelerate",2000);
            SpawnEntityFromTable("logic_timer", {targetname = "tkbhop", vscripts="aitk_bhop2",RefireTime = 0.06, OnTimer = "!caller,runscriptcode,Tankruncmd()"});
            }
        }
    }
}
function OnGameEvent_tank_killed(params)
{
    //Msg("no");
    local i;
    local tptk = 0;
    local ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            tptk+=1;
        }else if(ent == null)
        {
            break;
        }
    }
    if(tptk == 0)
    {
        EntFire("tkbhop","Kill",null,0,null);
    }
}
function GetAliveSurvivor()
{
    local tp_sr;
    local newi;
    local ent;
    for(newi = 0;newi < 18;newi++)
    {
        ent =Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            tp_sr=ent;
            break;
            //Msg(tp_sr[newi]);
        }else if(ent==null)
        {
            break;
        }
    }
        return tp_sr;
    
}
function GetVectorWithFloat(ent,propstring)
{
    local tpos;
    if(ent == null || ent.IsValid() == false)
    {
        return null;
    }else if(propstring == "origin")
    {
        tpos = ent.GetOrigin().tostring();
    }else if(propstring == "vel")
    {
        tpos = ent.GetVelocity().tostring();
    }
    else if(propstring == "eyeangle")
    {
        tpos = ent.EyeAngles().tostring();
    }
    local tp_1 = split(split(tpos,"(")[1],")")[0];
    local tp_2 = split(tp_1,",");
    local tp_3 = [tp_2[0].tofloat(),tp_2[1].tofloat(),tp_2[2].tofloat()];
    return tp_3;

}
function GetDistance(dis1,dis2)//方法是GetDistance([0，0，0],[0，0，0]);
{
    if(dis1 != null && dis2 != null)
    {   
        local tp_dis = pow(dis1[0]-dis2[0],2)+pow(dis1[1]-dis2[1],2)+pow(dis1[2]-dis2[2],2);
        return sqrt(tp_dis);
    }
    else return;
    
}
function GetClosetSurvivor(rp)//方法同上用[0，0，0]
{
    local surPos=[0,0,0];
    local closetSur = GetAliveSurvivor();
    surPos = GetVectorWithFloat(closetSur,"origin");
    local iclosetdis = GetDistance(rp,surPos);
    local i;
    local ent;
    for(i=0;i<18;i++)
    {
        ent = Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            surPos = GetVectorWithFloat(ent,"origin");
            local tp_posdis = GetDistance(rp,surPos);
            if(iclosetdis < 0)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }else if (tp_posdis < iclosetdis)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }
        }else if(ent == null)
        {
            break;
        }
    }
    return closetSur;
}
function DisableButton(ent,button)//能够使不按下此按钮。
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons | button ) );
}
function EnableButton(ent,button)
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons & ~button ) );
}
function ForceButton(ent,button)
{
	local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",(buttons | button));
}
function UnForceButton(ent,button)
{
    local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",( buttons & ~button ));
}
function Tankruncmd()
{
    //local tp_tank;
    local flags;
    local fVelocity;
    local currentspeed;
    local clienteyes;
    local tankpos;
    local closetsur;
    local hassight;
    local tank_ent;
    local i;
    for(i=0;i<16;i++)
    {
        tank_ent = Entities.FindByClassname(tank_ent,"player");
        if(tank_ent != null && tank_ent.GetZombieType() == 8 && !tank_ent.IsDead() && !tank_ent.IsDying())
        {
            //Msg(tp_tank[1]+"\n");
            //DisableButton(tank_ent,2048);
            flags=NetProps.GetPropInt(tank_ent,"m_fFlags");
            fVelocity=GetVectorWithFloat(tank_ent,"vel");
            currentspeed=sqrt(pow(fVelocity[0],2.0)+pow(fVelocity[1],2.0));
            //clienteyes=GetVectorWithFloat(tank_ent,"eyeangle");
            tankpos=GetVectorWithFloat(tank_ent,"origin");
            closetsur=GetClosetSurvivor(tankpos);
            hassight=NetProps.GetPropInt(tank_ent,"m_hasVisibleThreats");
            if (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 0) && NetProps.GetPropInt(tank_ent,"m_nButtons") & (1 << 1)) {
				local up_speed = (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 1) /* Player is fully crouched */ ) ? 297 : 247;
				local Angles = tank_ent.EyeAngles();
				local Velocity_x = Max_Velocity_hor_1*cos(Angles.y*PI/180);
				local Velocity_y = Max_Velocity_hor_1*sin(Angles.y*PI/180);
				NetProps.SetPropVector(tank_ent,"m_vecBaseVelocity",Vector(Velocity_x,Velocity_y,up_speed));
				//Say(null, "your speed = " + getHirozontalSpeed(ent), false);
			}
            local tp_dist = GetDistance((GetVectorWithFloat(closetsur,"origin")),tankpos);
            //Msg(flags+"\n");
            if(hassight && 650 > tp_dist && tp_dist > 180 && (currentspeed > 190.0))
            {
                 
                if(flags & 1)
                {
                    ForceButton(tank_ent,4);
                    ForceButton(tank_ent,2);
                    //ForceButton(tank_ent,8);
                    
                    if(tank_ent.GetButtonMask() == 8)
                    {
                        //Msg(currentspeed+"前进\n");
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&16)
                    {
                        //Msg(currentspeed+"后退\n");
                        //clienteyes[1]+=180.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&512)
                    {
                        //Msg(currentspeed+"左边\n");
                        //clienteyes[1]+=90.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&1024)
                    {
                        //Msg(currentspeed+"右边\n");
                        //clienteyes[1]+=-90.0;
                        ClientPush(tank_ent);
                    }
                }
                if(NetProps.GetPropInt(tank_ent,"movetype") == 9)
                {
                    UnForceButton(tank_ent,2);
                    UnForceButton(tank_ent,4);
                    //UnForceButton(tank_ent,8);
                }
            }else if((tp_dist>650 || tp_dist<180)&&currentspeed<190.0)
            {
                //Msg(1+"\n")
                UnForceButton(tank_ent,2);
                UnForceButton(tank_ent,4);
                //UnForceButton(tank_ent,8);
            }
        }else if(tank_ent != null && tank_ent.GetZombieType() != 8)
        {
            continue;
        }else if (tank_ent == null)
        {
            break;
        }
    }
    
}

function ClientPush(ent)
{
    local newvel = GetVectorWithFloat(ent,"vel");
    ent.SetVelocity(Vector(newvel[0]+10,newvel[1]+10,newvel[2]));
    
}const BoostForward=60.0; // Bhop
const PI = 3.141592653;
const Max_Velocity_hor_1 = 225;
enum VelocityOverride {
	VelocityOvr_None = 0,
	VelocityOvr_Velocity,
	VelocityOvr_OnlyWhenNegative,
	VelocityOvr_InvertReuseVelocity
};
if (Director.GetGameModeBase()=="realism"&&!Entities.FindByName(null, "bind_tkhop")) {SpawnEntityFromTable("logic_timer",{targetname="bind_tkhop",vscripts="aitk_bhop3",RefireTime = 0.5 , OnTimer = "!caller,runscriptcode,Thinks()"});}
function Thinks()
{
    local i,ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            if (!Entities.FindByName(null, "tkbhop")) {
	        //Convars.SetValue("sv_airaccelerate",2000);
            SpawnEntityFromTable("logic_timer", {targetname = "tkbhop", vscripts="aitk_bhop3",RefireTime = 0.06, OnTimer = "!caller,runscriptcode,Tankruncmd()"});
            }
        }
    }
}
function OnGameEvent_tank_killed(params)
{
    //Msg("no");
    local i;
    local tptk = 0;
    local ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            tptk+=1;
        }else if(ent == null)
        {
            break;
        }
    }
    if(tptk == 0)
    {
        EntFire("tkbhop","Kill",null,0,null);
    }
}
function GetAliveSurvivor()
{
    local tp_sr;
    local newi;
    local ent;
    for(newi = 0;newi < 18;newi++)
    {
        ent =Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            tp_sr=ent;
            break;
            //Msg(tp_sr[newi]);
        }else if(ent==null)
        {
            break;
        }
    }
        return tp_sr;
    
}
function GetVectorWithFloat(ent,propstring)
{
    local tpos;
    if(ent == null || ent.IsValid() == false)
    {
        return null;
    }else if(propstring == "origin")
    {
        tpos = ent.GetOrigin().tostring();
    }else if(propstring == "vel")
    {
        tpos = ent.GetVelocity().tostring();
    }
    else if(propstring == "eyeangle")
    {
        tpos = ent.EyeAngles().tostring();
    }
    local tp_1 = split(split(tpos,"(")[1],")")[0];
    local tp_2 = split(tp_1,",");
    local tp_3 = [tp_2[0].tofloat(),tp_2[1].tofloat(),tp_2[2].tofloat()];
    return tp_3;

}
function GetDistance(dis1,dis2)//方法是GetDistance([0，0，0],[0，0，0]);
{
    if(dis1 != null && dis2 != null)
    {   
        local tp_dis = pow(dis1[0]-dis2[0],2)+pow(dis1[1]-dis2[1],2)+pow(dis1[2]-dis2[2],2);
        return sqrt(tp_dis);
    }
    else return;
    
}
function GetClosetSurvivor(rp)//方法同上用[0，0，0]
{
    local surPos=[0,0,0];
    local closetSur = GetAliveSurvivor();
    surPos = GetVectorWithFloat(closetSur,"origin");
    local iclosetdis = GetDistance(rp,surPos);
    local i;
    local ent;
    for(i=0;i<18;i++)
    {
        ent = Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            surPos = GetVectorWithFloat(ent,"origin");
            local tp_posdis = GetDistance(rp,surPos);
            if(iclosetdis < 0)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }else if (tp_posdis < iclosetdis)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }
        }else if(ent == null)
        {
            break;
        }
    }
    return closetSur;
}
function DisableButton(ent,button)//能够使不按下此按钮。
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons | button ) );
}
function EnableButton(ent,button)
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons & ~button ) );
}
function ForceButton(ent,button)
{
	local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",(buttons | button));
}
function UnForceButton(ent,button)
{
    local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",( buttons & ~button ));
}
function Tankruncmd()
{
    //local tp_tank;
    local flags;
    local fVelocity;
    local currentspeed;
    local clienteyes;
    local tankpos;
    local closetsur;
    local hassight;
    local tank_ent;
    local i;
    for(i=0;i<16;i++)
    {
        tank_ent = Entities.FindByClassname(tank_ent,"player");
        if(tank_ent != null && tank_ent.GetZombieType() == 8 && !tank_ent.IsDead() && !tank_ent.IsDying())
        {
            //Msg(tp_tank[1]+"\n");
            //DisableButton(tank_ent,2048);
            flags=NetProps.GetPropInt(tank_ent,"m_fFlags");
            fVelocity=GetVectorWithFloat(tank_ent,"vel");
            currentspeed=sqrt(pow(fVelocity[0],2.0)+pow(fVelocity[1],2.0));
            //clienteyes=GetVectorWithFloat(tank_ent,"eyeangle");
            tankpos=GetVectorWithFloat(tank_ent,"origin");
            closetsur=GetClosetSurvivor(tankpos);
            hassight=NetProps.GetPropInt(tank_ent,"m_hasVisibleThreats");
            if (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 0) && NetProps.GetPropInt(tank_ent,"m_nButtons") & (1 << 1)) {
				local up_speed = (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 1) /* Player is fully crouched */ ) ? 297 : 247;
				local Angles = tank_ent.EyeAngles();
				local Velocity_x = Max_Velocity_hor_1*cos(Angles.y*PI/180);
				local Velocity_y = Max_Velocity_hor_1*sin(Angles.y*PI/180);
				NetProps.SetPropVector(tank_ent,"m_vecBaseVelocity",Vector(Velocity_x,Velocity_y,up_speed));
				//Say(null, "your speed = " + getHirozontalSpeed(ent), false);
			}
            local tp_dist = GetDistance((GetVectorWithFloat(closetsur,"origin")),tankpos);
            //Msg(flags+"\n");
            if(hassight && 650 > tp_dist && tp_dist > 180 && (currentspeed > 190.0))
            {
                 
                if(flags & 1)
                {
                    ForceButton(tank_ent,4);
                    ForceButton(tank_ent,2);
                    //ForceButton(tank_ent,8);
                    
                    if(tank_ent.GetButtonMask() == 8)
                    {
                        //Msg(currentspeed+"前进\n");
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&16)
                    {
                        //Msg(currentspeed+"后退\n");
                        //clienteyes[1]+=180.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&512)
                    {
                        //Msg(currentspeed+"左边\n");
                        //clienteyes[1]+=90.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&1024)
                    {
                        //Msg(currentspeed+"右边\n");
                        //clienteyes[1]+=-90.0;
                        ClientPush(tank_ent);
                    }
                }
                if(NetProps.GetPropInt(tank_ent,"movetype") == 9)
                {
                    UnForceButton(tank_ent,2);
                    UnForceButton(tank_ent,4);
                    //UnForceButton(tank_ent,8);
                }
            }else if((tp_dist>650 || tp_dist<180)&&currentspeed<190.0)
            {
                //Msg(1+"\n")
                UnForceButton(tank_ent,2);
                UnForceButton(tank_ent,4);
                //UnForceButton(tank_ent,8);
            }
        }else if(tank_ent != null && tank_ent.GetZombieType() != 8)
        {
            continue;
        }else if (tank_ent == null)
        {
            break;
        }
    }
    
}

function ClientPush(ent)
{
    local newvel = GetVectorWithFloat(ent,"vel");
    ent.SetVelocity(Vector(newvel[0]+10,newvel[1]+10,newvel[2]));
    
}const BoostForward=60.0; // Bhop
const PI = 3.141592653;
const Max_Velocity_hor_1 = 225;
enum VelocityOverride {
	VelocityOvr_None = 0,
	VelocityOvr_Velocity,
	VelocityOvr_OnlyWhenNegative,
	VelocityOvr_InvertReuseVelocity
};
if (Director.GetGameModeBase()=="versus"&&!Entities.FindByName(null, "bind_tkhop")) {SpawnEntityFromTable("logic_timer",{targetname="bind_tkhop",vscripts="aitk_bhop4",RefireTime = 0.5 , OnTimer = "!caller,runscriptcode,Thinks()"});}
function Thinks()
{
    local i,ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            if (!Entities.FindByName(null, "tkbhop")) {
	        //Convars.SetValue("sv_airaccelerate",2000);
            SpawnEntityFromTable("logic_timer", {targetname = "tkbhop", vscripts="aitk_bhop4",RefireTime = 0.06, OnTimer = "!caller,runscriptcode,Tankruncmd()"});
            }
        }
    }
}
function OnGameEvent_tank_killed(params)
{
    //Msg("no");
    local i;
    local tptk = 0;
    local ent;
    for(i=0;i<16;i++)
    {
        ent=Entities.FindByClassname(ent,"player");
        if(ent !=null &&ent.GetZombieType()==8&&!ent.IsDead()&&!ent.IsDying())
        {
            tptk+=1;
        }else if(ent == null)
        {
            break;
        }
    }
    if(tptk == 0)
    {
        EntFire("tkbhop","Kill",null,0,null);
    }
}
function GetAliveSurvivor()
{
    local tp_sr;
    local newi;
    local ent;
    for(newi = 0;newi < 18;newi++)
    {
        ent =Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            tp_sr=ent;
            break;
            //Msg(tp_sr[newi]);
        }else if(ent==null)
        {
            break;
        }
    }
        return tp_sr;
    
}
function GetVectorWithFloat(ent,propstring)
{
    local tpos;
    if(ent == null || ent.IsValid() == false)
    {
        return null;
    }else if(propstring == "origin")
    {
        tpos = ent.GetOrigin().tostring();
    }else if(propstring == "vel")
    {
        tpos = ent.GetVelocity().tostring();
    }
    else if(propstring == "eyeangle")
    {
        tpos = ent.EyeAngles().tostring();
    }
    local tp_1 = split(split(tpos,"(")[1],")")[0];
    local tp_2 = split(tp_1,",");
    local tp_3 = [tp_2[0].tofloat(),tp_2[1].tofloat(),tp_2[2].tofloat()];
    return tp_3;

}
function GetDistance(dis1,dis2)//方法是GetDistance([0，0，0],[0，0，0]);
{
    if(dis1 != null && dis2 != null)
    {   
        local tp_dis = pow(dis1[0]-dis2[0],2)+pow(dis1[1]-dis2[1],2)+pow(dis1[2]-dis2[2],2);
        return sqrt(tp_dis);
    }
    else return;
    
}
function GetClosetSurvivor(rp)//方法同上用[0，0，0]
{
    local surPos=[0,0,0];
    local closetSur = GetAliveSurvivor();
    surPos = GetVectorWithFloat(closetSur,"origin");
    local iclosetdis = GetDistance(rp,surPos);
    local i;
    local ent;
    for(i=0;i<18;i++)
    {
        ent = Entities.FindByClassname(ent,"player");
        if(ent != null && ent.IsSurvivor() && !ent.IsDead() && !ent.IsDying())
        {
            surPos = GetVectorWithFloat(ent,"origin");
            local tp_posdis = GetDistance(rp,surPos);
            if(iclosetdis < 0)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }else if (tp_posdis < iclosetdis)
            {
                iclosetdis = tp_posdis;
                closetSur = ent;
            }
        }else if(ent == null)
        {
            break;
        }
    }
    return closetSur;
}
function DisableButton(ent,button)//能够使不按下此按钮。
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons | button ) );
}
function EnableButton(ent,button)
{

	
	local buttons = NetProps.GetPropInt(ent,"m_afButtonDisabled" );
	NetProps.SetPropInt(ent,"m_afButtonDisabled", ( buttons & ~button ) );
}
function ForceButton(ent,button)
{
	local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",(buttons | button));
}
function UnForceButton(ent,button)
{
    local buttons = NetProps.GetPropInt(ent,"m_afButtonForced");	
	NetProps.SetPropInt(ent,"m_afButtonForced",( buttons & ~button ));
}
function Tankruncmd()
{
    //local tp_tank;
    local flags;
    local fVelocity;
    local currentspeed;
    local clienteyes;
    local tankpos;
    local closetsur;
    local hassight;
    local tank_ent;
    local i;
    for(i=0;i<16;i++)
    {
        tank_ent = Entities.FindByClassname(tank_ent,"player");
        if(tank_ent != null && tank_ent.GetZombieType() == 8 && !tank_ent.IsDead() && !tank_ent.IsDying())
        {
            //Msg(tp_tank[1]+"\n");
            //DisableButton(tank_ent,2048);
            flags=NetProps.GetPropInt(tank_ent,"m_fFlags");
            fVelocity=GetVectorWithFloat(tank_ent,"vel");
            currentspeed=sqrt(pow(fVelocity[0],2.0)+pow(fVelocity[1],2.0));
            //clienteyes=GetVectorWithFloat(tank_ent,"eyeangle");
            tankpos=GetVectorWithFloat(tank_ent,"origin");
            closetsur=GetClosetSurvivor(tankpos);
            hassight=NetProps.GetPropInt(tank_ent,"m_hasVisibleThreats");
            if (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 0) && NetProps.GetPropInt(tank_ent,"m_nButtons") & (1 << 1)) {
				local up_speed = (NetProps.GetPropInt(tank_ent,"m_fFlags") & (1 << 1) /* Player is fully crouched */ ) ? 297 : 247;
				local Angles = tank_ent.EyeAngles();
				local Velocity_x = Max_Velocity_hor_1*cos(Angles.y*PI/180);
				local Velocity_y = Max_Velocity_hor_1*sin(Angles.y*PI/180);
				NetProps.SetPropVector(tank_ent,"m_vecBaseVelocity",Vector(Velocity_x,Velocity_y,up_speed));
				//Say(null, "your speed = " + getHirozontalSpeed(ent), false);
			}
            local tp_dist = GetDistance((GetVectorWithFloat(closetsur,"origin")),tankpos);
            //Msg(flags+"\n");
            if(hassight && 650 > tp_dist && tp_dist > 180 && (currentspeed > 190.0))
            {
                 
                if(flags & 1)
                {
                    ForceButton(tank_ent,4);
                    ForceButton(tank_ent,2);
                    //ForceButton(tank_ent,8);
                    
                    if(tank_ent.GetButtonMask() == 8)
                    {
                        //Msg(currentspeed+"前进\n");
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&16)
                    {
                        //Msg(currentspeed+"后退\n");
                        //clienteyes[1]+=180.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&512)
                    {
                        //Msg(currentspeed+"左边\n");
                        //clienteyes[1]+=90.0;
                        ClientPush(tank_ent);
                    }
                    if(tank_ent.GetButtonMask()&1024)
                    {
                        //Msg(currentspeed+"右边\n");
                        //clienteyes[1]+=-90.0;
                        ClientPush(tank_ent);
                    }
                }
                if(NetProps.GetPropInt(tank_ent,"movetype") == 9)
                {
                    UnForceButton(tank_ent,2);
                    UnForceButton(tank_ent,4);
                    //UnForceButton(tank_ent,8);
                }
            }else if((tp_dist>650 || tp_dist<180)&&currentspeed<190.0)
            {
                //Msg(1+"\n")
                UnForceButton(tank_ent,2);
                UnForceButton(tank_ent,4);
                //UnForceButton(tank_ent,8);
            }
        }else if(tank_ent != null && tank_ent.GetZombieType() != 8)
        {
            continue;
        }else if (tank_ent == null)
        {
            break;
        }
    }
    
}

function ClientPush(ent)
{
    local newvel = GetVectorWithFloat(ent,"vel");
    ent.SetVelocity(Vector(newvel[0]+10,newvel[1]+10,newvel[2]));
    
}//兼容性文件
Msg("[INFO]PreLib Loaded\n");

	//::globe_vars <-{};
	//Msg("2nd load");
	IncludeScript("doubleweapons");
	//IncludeScript("pause");
	IncludeScript("selfhelp");
	IncludeScript("bhops");
	IncludeScript("aitk_bhop");
	IncludeScript("aitk_bhop2");
	IncludeScript("aitk_bhop3");
	IncludeScript("aitk_bhop4");
	IncludeScript("dis_reg");
