pweot17951
小水手

UID 29739
精华
0
积分 2
帖子 2
阅读权限 10
注册 2007-3-6 来自 广东
状态 离线
|
帮忙啊!
这个代码在算法上有欠缺,麻烦高手补全!!
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mmsystem.h>
#include <vector>
#include "client.h"
#include "engine/cl_entity.h"
#include "calcscreen.h"
#include "common/event_api.h"
#include "engine/pmtrace.h"
#include "engine/pm_defs.h"
#include "walkbot.h"
WalkBot wBot;
void DrawHudStringCenter (int x, int y, int r, int g, int b, const char *fmt, ... );
bool wayFree(float* from,float* to)
{
pmtrace_t tr;
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( from, to, PM_GLASS_IGNORE, me.ent->index, &tr );
return ( tr.fraction == 1.0 );
}
void WalkBot::addWaypoint(vec3_t input) //添加路点
{
waypoint wTemp;
VectorCopy(input,wTemp.origin);
wPoints.push_back(wTemp);
}
void WalkBot::adjustWaypoint(int ID, float x, float y, float z) //调整路点
{
wPoints[ID].origin[0] = x;
wPoints[ID].origin[1] = y;
wPoints[ID].origin[2] = z;
}
bool WalkBot::wBotMeIsinRadius(int ID) //路点是否在范围内
{
if ((me.ent->origin[0] <= (wPoints[ID].origin[0] + cvar.walkbot_radius)) &&
(me.ent->origin[0] >= (wPoints[ID].origin[0] - cvar.walkbot_radius)) &&
(me.ent->origin[1] <= (wPoints[ID].origin[1] + cvar.walkbot_radius)) &&
(me.ent->origin[1] >= (wPoints[ID].origin[1] - cvar.walkbot_radius)))
{
return true;
}
else
return false;
}
void WalkBot::wBotDraw() //路点样式
{
float vecScreen[2];
for (int i = 0;i < wBot.wPoints.size();i++) {
if (wPoints.visible) {
if (NewCalcScreen(wBot.wPoints.origin, vecScreen)) {
if (wBot.wPoints.visible) {
DrawHudStringCenter(vecScreen[0]+(cvar.walkbot_draw_w/2), vecScreen[1]-20, 0, 255, 0, "ID: %i",i);
gEngfuncs.pfnFillRGBA(vecScreen[0], vecScreen[1], cvar.walkbot_draw_w, cvar.walkbot_draw_h, 0, 255, 0, 255);
}
else if (!wBot.wPoints.visible) {
DrawHudStringCenter(vecScreen[0]+(cvar.walkbot_draw_w/2), vecScreen[1]-20, 255, 0, 0, "ID: %i",i);
gEngfuncs.pfnFillRGBA(vecScreen[0], vecScreen[1], cvar.walkbot_draw_w, cvar.walkbot_draw_h, 255, 0, 0, 255);
}
}
}
}
}
void WalkBot::wBotVisibility()//路点可见性
{
for (int i = 0;i < wBot.wPoints.size();i++)
wBot.wBotCheckVisibility(i);
}
void WalkBot::wBotCheckVisibility(int ID) //检查路点是否可见
{
vec3_t wTemp, wOutput, forward, right, up;
VectorCopy(wPoints[ID].origin, wOutput);
wTemp[0] = 0.0f;
wTemp[1] = wPoints[ID].origin[1];
wTemp[2] = 0.0f;
gEngfuncs.pfnAngleVectors(wTemp, forward, right, up);
wTemp[2] = -wTemp[2];
wOutput[0] = wOutput[0] + forward[0] + up[0] + right[0];
wOutput[1] = wOutput[1] + forward[1] + up[1] + right[1];
wOutput[2] = wOutput[2] + forward[2] + up[2] + right[2];
if (wayFree(me.pmEyePos, wOutput))
wPoints[ID].visible = true;
else {
wPoints[ID].visible = false;
if (target != -1) {
if (ID == target)
wBotSelectWaypoint();
}
}
}
void WalkBot::wBotSelectWaypoint() //寻点算法
{
target = oldtarget;
if (target == -1)
target = 0;
else if (target == wPoints.size() - 1) {
if (wBotMeIsinRadius(target)) //路点是否在范围内
{
target = -1;
wBot.onSwitch = false;
}
}
else if (wBotMeIsinRadius(target) && !wPoints[target].hasBeenUsed/*是否已使用*/ && wPoints[target].visible/*是否为有效*/)
{
wPoints[target].hasBeenUsed = true;
target++;
}
else if (!wPoints[target].visible) {
wPoints[target].hasBeenUsed = false;
target--;
}
oldtarget = target;
}
void WalkBot::wBotCalculateAimingSpot() //计算路点瞄准范围
{
vec3_t wTemp, wTempOutput, forward, right, up;
VectorCopy(wPoints[target].origin, wTempOutput);
wTemp[0] = 0.0f;
wTemp[1] = wPoints[target].origin[1];
wTemp[2] = 0.0f;
gEngfuncs.pfnAngleVectors(wTemp, forward, right, up);
wTempOutput[0] = wTempOutput[0] + forward[0] + up[0] + right[0] - me.pmEyePos[0];
wTempOutput[1] = wTempOutput[1] + forward[1] + up[1] + right[1] - me.pmEyePos[1];
wTempOutput[2] = wTempOutput[2] + forward[2] + up[2] + right[2] - me.pmEyePos[2];
VectorAngles(wTempOutput, wBotAimingSpot);
wBotAimingSpot[0] = 0.0f;
if (wBotAimingSpot[1] > 180)
wBotAimingSpot[1] -= 360;
}
|
|