Member
|
12-07-2017
, 04:06
Re: [TF2] Making your very own NextBot NPC with base_boss (Making base_boss your bitc
|
#10
|
Quote:
Originally Posted by Pelipoika
You need to call ILocomotion::Run
|
Thanks for quick reply !
EDIT: It does work now on both windows and linux, got ::Run offset mixed up offset, even after a double-check :\
EDIT2: pStudioHdr offset was different on linux, modified to get it to work on both w & l
Code:
#include <sdktools>
#include <sdkhooks>
#include <dhooks>
#pragma newdecls required
#define MODEL_NPC "models/bots/headless_hatman.mdl"
#define ANIM_MOVE 50
#define ANIM_IDLE 37
#define ANIM_AIR 50
Handle g_hMyNextBotPointer;
Handle g_hGetLocomotionInterface;
Handle g_hGetBodyInterface;
Handle g_hGetGroundNormal;
Handle g_hRun;
Handle g_hApproach;
Handle g_hFaceTowards;
Handle g_hResetSequence;
Handle g_hGetStepHeight;
Handle g_hGetGravity;
Handle g_hStudioFrameAdvance;
Handle g_hShouldCollideWith;
Handle g_hGetSolidMask;
Handle g_hGetHullWidth;
Handle g_hGetStandHullHeight;
Handle g_hGetHullMins;
Handle g_hGetHullMaxs;
Handle g_hGetHullHeight;
Handle g_hGetCrouchHullHeight;
Handle g_hGetCollisionGroup;
Handle g_hGetGroundSpeed;
Handle g_hGetVectors;
Handle g_hGetGroundMotionVector;
Handle g_hGetMaxAcceleration;
Handle g_hLookupPoseParameter;
Handle g_hSetPoseParameter;
//Handle g_hGetPoseParameter;
//NPC Formation like TFBots!
//Disgusting
float vecGoal[3];
int g_m_bResolveCollisionsOffset;
int g_studioHdrOffset;
ArrayList gBots
public Plugin myinfo =
{
name = "[TF2] LegAnim9Way_TestNPC",
author = "Pelipoika",
description = "",
version = "1.0",
url = "http://www.sourcemod.net/plugins.php?author=Pelipoika&search=1"
};
public void OnPluginStart()
{
RegAdminCmd("sm_npc", test, ADMFLAG_ROOT);
RegAdminCmd("sm_npcgoal", test2, ADMFLAG_ROOT);
gBots = new ArrayList()
Handle hConf = LoadGameConfigFile("tfnextbot");
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "CBaseAnimating::StudioFrameAdvance");
if ((g_hStudioFrameAdvance = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create SDKCall for CBaseAnimating::StudioFrameAdvance offset!");
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Signature, "CBaseAnimating::ResetSequence");
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
if ((g_hResetSequence = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create SDKCall for CBaseAnimating::ResetSequence signature!");
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "CBaseEntity::MyNextBotPointer");
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
if ((g_hMyNextBotPointer = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create SDKCall for CBaseEntity::MyNextBotPointer offset!");
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "INextBot::GetLocomotionInterface");
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
if((g_hGetLocomotionInterface = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for INextBot::GetLocomotionInterface!");
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "INextBot::GetBodyInterface");
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
if((g_hGetBodyInterface = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for INextBot::GetBodyInterface!");
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "NextBotGroundLocomotion::Run");
if((g_hRun = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for NextBotGroundLocomotion::Run!");
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "NextBotGroundLocomotion::Approach");
PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
if((g_hApproach = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for NextBotGroundLocomotion::Approach!");
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "NextBotGroundLocomotion::FaceTowards");
PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef);
if((g_hFaceTowards = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for NextBotGroundLocomotion::FaceTowards!");
//https://github.com/Andersso/SM-WeaponModels/blob/master/scripting/weaponmodels/entitydata.sp
//explains how we retrieves this
g_studioHdrOffset = GameConfGetOffset(hConf, "Animating_StudioHdr");
if(g_studioHdrOffset == -1) SetFailState("Failed to get offset of Animating_StudioHdr");
int lightingOriginOffset = FindSendPropInfo("CBaseAnimating", "m_hLightingOrigin");
g_studioHdrOffset += lightingOriginOffset
int iOffset = GameConfGetOffset(hConf, "CTFBaseBossLocomotion::GetStepHeight");
if(iOffset == -1) SetFailState("Failed to get offset of CTFBaseBossLocomotion::GetStepHeight");
g_hGetStepHeight = DHookCreate(iOffset, HookType_Raw, ReturnType_Float, ThisPointer_Address, NextBotGroundLocomotion_GetStepHeight);
iOffset = GameConfGetOffset(hConf, "NextBotGroundLocomotion::GetGravity");
if(iOffset == -1) SetFailState("Failed to get offset of NextBotGroundLocomotion::GetGravity");
g_hGetGravity = DHookCreate(iOffset, HookType_Raw, ReturnType_Float, ThisPointer_Address, NextBotGroundLocomotion_GetGravity);
iOffset = GameConfGetOffset(hConf, "IBody::GetSolidMask");
if(iOffset == -1) SetFailState("Failed to get offset of IBody::GetSolidMask");
g_hGetSolidMask = DHookCreate(iOffset, HookType_Raw, ReturnType_Int, ThisPointer_Address, IBody_GetSolidMask);
iOffset = GameConfGetOffset(hConf, "NextBotGroundLocomotion::GetGroundNormal");
if(iOffset == -1) SetFailState("Failed to get offset of NextBotGroundLocomotion::GetGroundNormal");
g_hGetGroundNormal = DHookCreate(iOffset, HookType_Raw, ReturnType_VectorPtr, ThisPointer_Address, NextBotGroundLocomotion_GetGroundNormal);
iOffset = GameConfGetOffset(hConf, "NextBotGroundLocomotion::ShouldCollideWith");
if(iOffset == -1) SetFailState("Failed to get offset of NextBotGroundLocomotion::ShouldCollideWith");
g_hShouldCollideWith = DHookCreate(iOffset, HookType_Raw, ReturnType_Bool, ThisPointer_Address, NextBotGroundLocomotion_ShouldCollideWith);
DHookAddParam(g_hShouldCollideWith, HookParamType_CBaseEntity);
iOffset = GameConfGetOffset(hConf, "IBody::GetHullWidth");
if(iOffset == -1) SetFailState("Failed to get offset of IBody::GetHullWidth");
g_hGetHullWidth = DHookCreate(iOffset, HookType_Raw, ReturnType_Float, ThisPointer_Address, IBody_GetHullWidth);
iOffset = GameConfGetOffset(hConf, "IBody::GetStandHullHeight");
if(iOffset == -1) SetFailState("Failed to get offset of IBody::GetStandHullHeight");
g_hGetStandHullHeight = DHookCreate(iOffset, HookType_Raw, ReturnType_Float, ThisPointer_Address, IBody_GetStandHullHeight);
//Put into gamedata config
g_hGetMaxAcceleration = DHookCreate(
GameConfGetOffset(hConf, "ILocomotion::GetMaxAcceleration"),
HookType_Raw, ReturnType_Float, ThisPointer_Address, ILocomotion_GetMaxAcceleration);
g_hGetHullMins = DHookCreate(GameConfGetOffset(hConf, "IBody::GetHullMins"),
HookType_Raw, ReturnType_VectorPtr, ThisPointer_Address, IBody_GetHullMins);
g_hGetHullMaxs = DHookCreate(GameConfGetOffset(hConf, "IBody::GetHullMaxs"),
HookType_Raw, ReturnType_VectorPtr, ThisPointer_Address, IBody_GetHullMaxs);
g_hGetHullHeight = DHookCreate(GameConfGetOffset(hConf, "IBody::GetHullHeight"),
HookType_Raw, ReturnType_Float, ThisPointer_Address, IBody_GetHullHeight);
g_hGetCrouchHullHeight = DHookCreate(GameConfGetOffset(hConf, "IBody::GetCrouchHullHeight"),
HookType_Raw, ReturnType_Float, ThisPointer_Address, IBody_GetCrouchHullHeight);
g_hGetCollisionGroup = DHookCreate(GameConfGetOffset(hConf, "IBody::GetCollisionGroup"),
HookType_Raw, ReturnType_Int, ThisPointer_Address, IBody_GetCollisionGroup);
//ILocomotion::GetGroundSpeed()
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "ILocomotion::GetGroundSpeed");
PrepSDKCall_SetReturnInfo(SDKType_Float, SDKPass_Plain);
if((g_hGetGroundSpeed = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for ILocomotion::GetGroundSpeed!");
//ILocomotion::GetGroundMotionVector()
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "ILocomotion::GetGroundMotionVector");
PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_ByRef);
if((g_hGetGroundMotionVector = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for ILocomotion::GetGroundMotionVector!");
//CBaseEntity::GetVectors(Vector*, Vector*, Vector*)
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Virtual, "CBaseEntity::GetVectors");
PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef, _, VENCODE_FLAG_COPYBACK);
PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef, _, VENCODE_FLAG_COPYBACK);
PrepSDKCall_AddParameter(SDKType_Vector, SDKPass_ByRef, _, VENCODE_FLAG_COPYBACK);
if((g_hGetVectors = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Virtual Call for CBaseEntity::GetVectors!");
//SetPoseParameter( CStudioHdr *pStudioHdr, int iParameter, float flValue );
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Signature, "CBaseAnimating::SetPoseParameter");
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
PrepSDKCall_SetReturnInfo(SDKType_Float, SDKPass_Plain);
if((g_hSetPoseParameter = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Call for CBaseAnimating::SetPoseParameter");
//GetPoseParameter( int iParameter )
// StartPrepSDKCall(SDKCall_Entity);
// PrepSDKCall_SetSignature(SDKLibrary_Server, "\x55\x8B\xEC\x56\x8B\xF1\x57\x80\xBE\x41\x03\x00\x00\x00\x75\x2A\x83\xBE\x6C\x04\x00\x00\x00\x75\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8B\xBE\x6C\x04\x00\x00", 47);
// PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
// PrepSDKCall_SetReturnInfo(SDKType_Float, SDKPass_Plain);
// if((g_hGetPoseParameter = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Call for CBaseAnimating::GetPoseParameter");
//LookupPoseParameter( CStudioHdr *pStudioHdr, const char *szName );
StartPrepSDKCall(SDKCall_Entity);
PrepSDKCall_SetFromConf(hConf, SDKConf_Signature, "CBaseAnimating::LookupPoseParameter");
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer);
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
if((g_hLookupPoseParameter = EndPrepSDKCall()) == INVALID_HANDLE) SetFailState("Failed to create Call for CBaseAnimating::LookupPoseParameter");
g_m_bResolveCollisionsOffset = FindSendPropInfo("CTFBaseBoss", "m_lastHealthPercentage")
+ GameConfGetOffset(hConf, "m_bResolveCollisions");
delete hConf;
}
public void OnMapStart()
{
PrecacheModel(MODEL_NPC);
}
public Action test2(int client, int args){
int len = gBots.Length
GetAimPos(client, vecGoal);
for (int i = 0; i < len; i++){
int npc = EntRefToEntIndex(gBots.Get(i))
if (IsValidEntity(npc)){
PrintToServer(" PluginBot_Approach: %d", npc)
PluginBot_Approach(npc, vecGoal)
}
}
return Plugin_Handled;
}
public Action test(int client, int args)
{
float vecPos[3], vecAng[3];
GetAimPos(client, vecPos);
GetClientEyeAngles(client, vecAng);
vecAng[0] = 0.0;
GetAimPos(client, vecGoal);
int npc = CreateEntityByName("base_boss"); //We use base_boss because it's movement is smooth regardless of the clients network settings.
DispatchKeyValueVector(npc, "origin", vecPos);
DispatchKeyValueVector(npc, "angles", vecAng);
DispatchKeyValue(npc, "model", MODEL_NPC);
DispatchKeyValue(npc, "modelscale", "0.7");
DispatchKeyValue(npc, "health", "100");
SetEntProp(npc, Prop_Send, "m_usSolidFlags", 2); //FSOLID_CUSTOMBOXTEST
SetEntProp(npc, Prop_Data, "m_usSolidFlags", 2); //FSOLID_CUSTOMBOXTEST
DispatchSpawn(npc);
ActivateEntity(npc);
DispatchKeyValue(npc, "speed", "900.0");
//SetEntProp(npc, Prop_Data, "m_speed", 900);
//ResolvePlayerCollisions, by default base_boss will push nearby players away like the mvm tank, this disables that.
SetEntData(npc,
g_m_bResolveCollisionsOffset,
false, 4, true);
//SetEntData(npc, FindSendPropInfo("CTFBaseBoss", "m_lastHealthPercentage") + 24, false, 4, true);
float pos[3];
// NavArea area = TheNavMesh.GetNearestNavArea_Vec(vecPos);
// area.GetCenter(pos);
GetClientAbsOrigin(client, vecGoal);
Address pLoco = GetLocomotionInterface(npc);
DHookRaw(g_hShouldCollideWith, true, pLoco); //Don't need to collide with anything but world
DHookRaw(g_hGetStepHeight, true, pLoco); //The default step height on a base_boss is 1000.0 and this causes it to be able to climb HUGE gaps, limit it to 18.0
DHookRaw(g_hGetGravity, true, pLoco); //The default gravity on base_boss is too big and causes it to fall onto the ground way too fast.
DHookRaw(g_hGetGroundNormal, true, pLoco); //The default base_boss rotates itself to the ground normal, this prevents that.
DHookRaw(g_hGetMaxAcceleration, true, pLoco); //We want to accelerate faster than by default.
Address pBody = GetBodyInterface(npc);
DHookRaw(g_hGetHullMins, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetHullMaxs, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetHullWidth, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetSolidMask, true, pBody); //The default mask causes base_boss to fall through some things players could walk on.
DHookRaw(g_hGetStandHullHeight, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetCrouchHullHeight, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetHullHeight, true, pBody); //Fixes the NPC getting stuck so much
DHookRaw(g_hGetCollisionGroup, true, pBody); //Fixes the NPC getting stuck so much
SDKHook(npc, SDKHook_ThinkPost, OnBotThink);
gBots.Push(EntIndexToEntRef(npc))
return Plugin_Handled;
}
//Does the 9way leg movement, reverse engineered from CHeadlessHatmanBody::Update
public void OnBotThink(int iEntity)
{
Address pLocomotion = GetLocomotionInterface(iEntity);
if(pLocomotion == Address_Null){
return;
}
//Needed to make the npc move
PluginBot_Approach(iEntity, vecGoal)
SDKCall(g_hRun, pLocomotion);
Address pStudioHdr = view_as<Address>(GetEntData(iEntity, g_studioHdrOffset));
int m_iMoveX = SDKCall(g_hLookupPoseParameter, iEntity, pStudioHdr, "move_x");
int m_iMoveY = SDKCall(g_hLookupPoseParameter, iEntity, pStudioHdr, "move_y");
if ( m_iMoveX < 0 || m_iMoveY < 0 )
return;
int iSequence = GetEntProp(iEntity, Prop_Send, "m_nSequence");
if(!(GetEntityFlags(iEntity) & FL_ONGROUND))
{
if(iSequence != ANIM_AIR)
{
//Set animation.
SDKCall(g_hResetSequence, iEntity, ANIM_AIR);
}
return;
}
float flGroundSpeed = SDKCall(g_hGetGroundSpeed, pLocomotion);
if ( flGroundSpeed <= 0.01 )
{
SDKCall(g_hSetPoseParameter, iEntity, pStudioHdr, m_iMoveX, 0.0);
SDKCall(g_hSetPoseParameter, iEntity, pStudioHdr, m_iMoveY, 0.0);
if(iSequence != ANIM_IDLE)
{
//Set animation.
SDKCall(g_hResetSequence, iEntity, ANIM_IDLE);
}
}
else
{
if(iSequence != ANIM_MOVE)
{
//Set animation.
SDKCall(g_hResetSequence, iEntity, ANIM_MOVE);
}
float vecForward[3], vecRight[3], vecUp[3];
SDKCall(g_hGetVectors, iEntity, vecForward, vecRight, vecUp);
float vecMotion[3]
SDKCall(g_hGetGroundMotionVector, pLocomotion, vecMotion);
SDKCall(g_hSetPoseParameter, iEntity, pStudioHdr, m_iMoveX, GetVectorDotProduct(vecMotion, vecForward));
SDKCall(g_hSetPoseParameter, iEntity, pStudioHdr, m_iMoveY, GetVectorDotProduct(vecMotion, vecRight));
}
float m_flGroundSpeed = GetEntPropFloat(iEntity, Prop_Data, "m_flGroundSpeed");
if(m_flGroundSpeed != 0.0)
{
float flReturnValue = clamp(flGroundSpeed / m_flGroundSpeed, -4.0, 12.0);
SetEntPropFloat(iEntity, Prop_Send, "m_flPlaybackRate", flReturnValue);
}
//Advances the animation
SDKCall(g_hStudioFrameAdvance, iEntity);
// float flPlaybackRate = GetEntPropFloat(iEntity, Prop_Send, "m_flPlaybackRate");
// PrintToServer("m_nSequence %i m_flPlaybackRate %f m_flGroundSpeed %f", iSequence, flPlaybackRate, flGroundSpeed);
}
//My PathFinding stuff the only thing useful for you is g_hApproach and g_hFaceTowards
//which will make the NPC approach and rotate towards a certain position and you'll be using this for moving the NPC.
public void PluginBot_Approach(int bot_entidx, const float vec[3])
{
Address pLocomotion = GetLocomotionInterface(bot_entidx);
SDKCall(g_hApproach, pLocomotion, vec, 0.1);
SDKCall(g_hFaceTowards, pLocomotion, vec);
float vecMyPos[3];
GetEntPropVector(bot_entidx, Prop_Data, "m_vecAbsOrigin", vecMyPos);
float flDistance = GetVectorDistance(vecGoal, vecMyPos);
if(flDistance <= 30.0)
{
float vecDirection[3];
vecDirection[0] = GetRandomFloat(-1.0, 1.0);
vecDirection[1] = GetRandomFloat(-1.0, 1.0);
vecDirection[2] = 0.0;
ScaleVector(vecDirection, 2000.0);
AddVectors(vecMyPos, vecDirection, vecMyPos);
}
}
public bool PluginBot_IsTraverSable(int bot_entidx, int other_entidx)
{
return true;
}
public float clamp(float a, float b, float c)
{
return (a > c ? c : (a < b ? b : a));
}
public MRESReturn IBody_GetHullWidth(Address pThis, Handle hReturn, Handle hParams)
{
// PrintToServer("GetHullWidth %f", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, 26.0);
return MRES_Supercede;
}
public MRESReturn IBody_GetStandHullHeight(Address pThis, Handle hReturn, Handle hParams)
{
// PrintToServer("GetStandHullHeight %f", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, 68.0);
return MRES_Supercede;
}
public MRESReturn IBody_GetHullHeight(Address pThis, Handle hReturn, Handle hParams)
{
// PrintToServer("GetHullHeight %f", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, 68.0);
return MRES_Supercede;
}
public MRESReturn IBody_GetCrouchHullHeight(Address pThis, Handle hReturn, Handle hParams)
{
// PrintToServer("GetCrouchHullHeight %f", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, 32.0);
return MRES_Supercede;
}
public MRESReturn IBody_GetCollisionGroup(Address pThis, Handle hReturn, Handle hParams)
{
//PrintToServer("GetCollisionGroup %i", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, 0);
return MRES_Supercede;
//return MRES_Ignored
}
public MRESReturn IBody_GetHullMins(Address pThis, Handle hReturn, Handle hParams)
{
// float vecReturn[3];
// DHookGetReturnVector(hReturn, vecReturn);
// PrintToServer("GetHullMins %f %f %f", vecReturn[0], vecReturn[1], vecReturn[2]);
DHookSetReturnVector(hReturn, view_as<float>( { -13.0, -13.0, 0.0 } ));
return MRES_Supercede;
}
public MRESReturn IBody_GetHullMaxs(Address pThis, Handle hReturn, Handle hParams)
{
// float vecReturn[3];
// DHookGetReturnVector(hReturn, vecReturn);
// PrintToServer("GetHullMaxs %f %f %f", vecReturn[0], vecReturn[1], vecReturn[2]);
DHookSetReturnVector(hReturn, view_as<float>( { 13.0, 13.0, 68.0 } ));
return MRES_Supercede;
}
public MRESReturn IBody_GetSolidMask(Address pThis, Handle hReturn, Handle hParams)
{
// PrintToServer("GetSolidMask 0x%x", DHookGetReturn(hReturn));
DHookSetReturn(hReturn, MASK_NPCSOLID | MASK_PLAYERSOLID);
return MRES_Supercede;
}
public MRESReturn ILocomotion_GetMaxAcceleration(Address pThis, Handle hReturn, Handle hParams)
{
DHookSetReturn(hReturn, 500.0);
return MRES_Supercede;
}
public MRESReturn NextBotGroundLocomotion_GetStepHeight(Address pThis, Handle hReturn, Handle hParams)
{
DHookSetReturn(hReturn, 18.0);
return MRES_Supercede;
}
public MRESReturn NextBotGroundLocomotion_ShouldCollideWith(Address pThis, Handle hReturn, Handle hParams)
{
DHookSetReturn(hReturn, false);
return MRES_Supercede;
}
public MRESReturn NextBotGroundLocomotion_GetGravity(Address pThis, Handle hReturn, Handle hParams)
{
DHookSetReturn(hReturn, 800.0);
return MRES_Supercede;
}
public MRESReturn NextBotGroundLocomotion_GetGroundNormal(Address pThis, Handle hReturn, Handle hParams)
{
DHookSetReturnVector(hReturn, view_as<float>( { 0.0, 0.0, 1.0 } ));
return MRES_Supercede;
}
public Address GetLocomotionInterface(int index)
{
Address pNB = SDKCall(g_hMyNextBotPointer, index);
return SDKCall(g_hGetLocomotionInterface, pNB);
}
public Address GetBodyInterface(int index)
{
Address pNB = SDKCall(g_hMyNextBotPointer, index);
return SDKCall(g_hGetBodyInterface, pNB);
}
stock bool GetAimPos(int client, float vecPos[3])
{
float StartOrigin[3], Angles[3];
GetClientEyeAngles(client, Angles);
GetClientEyePosition(client, StartOrigin);
Handle TraceRay = TR_TraceRayFilterEx(StartOrigin, Angles, MASK_NPCSOLID | MASK_PLAYERSOLID, RayType_Infinite, ExcludeFilter, client);
if (TR_DidHit(TraceRay))
{
TR_GetEndPosition(vecPos, TraceRay);
}
vecPos[2] += 90.0
delete TraceRay;
}
public bool ExcludeFilter(int entityhit, int mask, any entity)
{
if (entityhit > MaxClients && entityhit != entity)
{
return true;
}
return false;
}
Gamedata
Code:
"Games"
{
/* Team Fortress 2 */
"tf"
{
"Signatures"
{
/*"GetAnimationEvent_"
{
"library" "server"
"windows" "\x55\x8B\xEC\x53\x56\x8B\x75\x08\x85\xF6\x0F\x84\x2A\x2A\x2A\x2A"
}
"CBasePlayer::SnapEyeAngles"
{
"windows" "\x55\x8B\xEC\x8B\x45\x08\xD9\x00\xD9\x99\x58\x0A\x00\x00"
"linux" "@_ZN11CBasePlayer13SnapEyeAnglesERK6QAngle"
}
*/
"CBaseAnimating::ResetSequence" //(int nSequence) "ResetSequence : %s: %s -> %s\n"
{
"windows" "\x55\x8B\xEC\xA1\x2A\x2A\x2A\x2A\x53\x56\x57\x83\x78\x30\x00\x8B\xD9\x8B\x7D\x08"
"linux" "@_ZN14CBaseAnimating13ResetSequenceEi"
}
"CBaseAnimating::ResetSequenceInfo" //( )
{
"windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x83\xBE\xAC\x03\x00\x00\xFF"
"linux" "@_ZN14CBaseAnimating17ResetSequenceInfoEv"
}
"CBaseAnimating::SetPoseParameter" //( CStudioHdr *pStudioHdr, int iParameter, float flValue )
{
"windows" "\x55\x8B\xEC\x8B\x45\x08\xD9\x45\x10"
"linux" "@_ZN14CBaseAnimating16SetPoseParameterEP10CStudioHdrif"
}
"CBaseAnimating::LookupPoseParameter" //( CStudioHdr *pStudioHdr, const char *szName )
{
"windows" "\x55\x8B\xEC\x57\x8B\x7D\x08\x85\xFF\x75\x2A\x33\xC0\x5F\x5D\xC2\x08\x00"
"linux" "@_ZN14CBaseAnimating19LookupPoseParameterEP10CStudioHdrPKc"
}
"CBaseAnimating::GetPoseParameter" //( int iParameter ) "aim_pitch" 2nd in xrefs
{
"windows" "\x55\x8B\xEC\x56\x8B\xF1\x57\x80\xBE\x41\x03\x00\x00\x00\x75\x2A\x83\xBE\x6C\x04\x00\x00\x00\x75\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8B\xBE\x6C\x04\x00\x00"
"linux" "@_ZN14CBaseAnimating16GetPoseParameterEi"
}
"LookupSequence" //int ( CStudioHdr *pstudiohdr, const char *label ) "spew_bars_context" NOTE: NOT CBaseAnimating::LookupSequence
{
"windows" "\x55\x8B\xEC\x56\x8B\x75\x08\x85\xF6\x75\x2A\x33\xC0\x5E\x5D\xC3\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x84\xC0\x74\x2A\x53"
"linux" "@_Z14LookupSequenceP10CStudioHdrPKc"
}
"CTFPlayer::GetMaxAmmo" //int (int AmmoType, int idk) "mult_maxammo_primary"
{
"windows" "\x55\x8B\xEC\x8B\x45\x0C\x56\x57\x8B\xF9\x83\xF8\xFF"
"linux" "@_ZN9CTFPlayer10GetMaxAmmoEii"
}
"Studio_FindAttachment" //int ( const CStudioHdr *pStudioHdr, const char *pAttachmentName ) <- "alt-origin"
{
"windows" "\x55\x8B\xEC\x53\x56\x57\x8B\x7D\x08\x85\xFF"
"linux" "@_Z21Studio_FindAttachmentPK10CStudioHdrPKc"
}
"CBaseAnimating::GetAttachment" //bool ( int iAttachment, Vector &absOrigin, QAngle &absAngles ) <- "alt-origin"
{
"windows" "\x55\x8B\xEC\x8B\x01\x8D\x55\xD0\x83\xEC\x30\x8B\x80\x40\x03\x00\x00\x53\x52\xFF\x75\x08\xFF\xD0\xFF\x75\x10"
"linux" "@_ZN14CBaseAnimating13GetAttachmentEiR6VectorR6QAngle"
}
"CBaseAnimatingOverlay::IsPlayingGesture" // (Activity activity)
{
"windows" "\x55\x8B\xEC\xFF\x75\x08\xE8\x2A\x2A\x2A\x2A\x83\xF8\xFF"
"linux" "@_ZN21CBaseAnimatingOverlay16IsPlayingGestureE8Activity"
}
"CBaseAnimatingOverlay::AddGestureSequence" //( int sequence, bool autokill )
{
"windows" "\x55\x8B\xEC\x56\x6A\x00\xFF\x75\x08\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x85\xC0\x78\x2A"
"linux" "@_ZN21CBaseAnimatingOverlay18AddGestureSequenceEib"
}
"CBaseEntity::GetNextThink" //( const char *szContext ) <- "group_respawn_context"
{
"windows" "\x55\x8B\xEC\x8B\x45\x08\x56\x8B\xF1\x85\xC0\x75\x2A\x8B\x86\xD0\x00\x00\x00\x89\x45\x08"
"linux" "@_ZN11CBaseEntity12GetNextThinkEPKc"
}
}
"Offsets"
{
"m_bResolveCollisions" //2492
{
"windows" "28"
"linux" "28"
}
"Animating_StudioHdr"
{
"windows" "60"
"linux" "60"
}
"CTFPlayer::GetAmmoCount" //(int)
{
"windows" "258"
"linux" "259"
}
"CTFWeaponBaseGun::GetWeaponID" //(int)
{
"windows" "371"
"linux" "377"
}
"CTFWeaponBaseGun::HasAmmo" //()
{
"windows" "232"
"linux" "238"
}
"CTFWeaponBaseGun::GetProjectileSpeed" //(float)
{
"windows" "472"
"linux" "479"
}
"CTFWeaponBaseGun::GetProjectileGravity" //(float)
{
"windows" "473"
"linux" "480"
}
"CTFBaseBoss::GetCurrencyValue"
{
"windows" "328"
"linux" "333"
}
"CBaseEntity::WorldSpaceCenter"
{
"windows" "149"
"linux" "150"
}
"CBaseEntity::GetSmoothedVelocity"
{
"windows" "139"
"linux" "140"
}
"CBaseEntity::MyNextBotPointer"
{
"windows" "72"
"linux" "73"
}
"CBaseEntity::GetVectors"
{
"windows" "136"
"linux" "137"
}
"CBaseAnimating::StudioFrameAdvance"
{
"windows" "193"
"linux" "194"
}
"CBaseAnimating::DispatchAnimEvents"
{
"windows" "205"
"linux" "206"
}
"CBaseAnimating::HandleAnimEvent" //(animevent_t*)
{
"windows" "206"
"linux" "207"
}
"INextBot::GetLocomotionInterface"
{
"windows" "48"
"linux" "49"
}
"INextBot::GetBodyInterface"
{
"windows" "49"
"linux" "50"
}
"INextBot::GetVisionInterface"
{
"windows" "51"
"linux" "52"
}
"INextBot::Upkeep"
{
"windows" "44"
"linux" "45"
}
"INextBotComponent::GetBot"
{
"windows" "45"
"linux" "46"
}
"INextBotComponent::GetEntity"
{
"windows" "46"
"linux" "47"
}
"ILocomotion::Approach"
{
"windows" "46"
"linux" "47"
}
"ILocomotion::Run"
{
"windows" "55"
"linux" "56"
}
"ILocomotion::FaceTowards"
{
"windows" "73"
"linux" "74"
}
"ILocomotion::IsAttemptingToMove"
{
"windows" "98"
"linux" "99"
}
"ILocomotion::StuckMonitor"
{
"windows" "101"
"linux" "102"
}
"ILocomotion::ShouldCollideWith"
{
"windows" "99"
"linux" "100"
}
"ILocomotion::GetVelocity"
{
"windows" "86"
"linux" "87"
}
"ILocomotion::GetMotionVector"
{
"windows" "88"
"linux" "89"
}
"ILocomotion::GetGravity"
{
"windows" "105"
"linux" "106"
}
"ILocomotion::GetGroundNormal"
{
"windows" "65"
"linux" "66"
}
"ILocomotion::Jump"
{
"windows" "50"
"linux" "51"
}
"ILocomotion::GetMaxYawRate"
{
"windows" "108"
"linux" "109"
}
"ILocomotion::GetFrictionForward"
{
"windows" "106"
"linux" "107"
}
"ILocomotion::GetFrictionSideways"
{
"windows" "107"
"linux" "108"
}
"ILocomotion::IsOnGround"
{
"windows" "63"
"linux" "64"
}
"ILocomotion::IsStuck"
{
"windows" "95"
"linux" "96"
}
"ILocomotion::StuckMonitor"
{
"windows" "101"
"linux" "102"
}
"ILocomotion::ClearStuckStatus"
{
"windows" "97"
"linux" "98"
}
"ILocomotion::SetVelocity"
{
"windows" "104"
"linux" "105"
}
"ILocomotion::GetMaxDeceleration"
{
"windows" "85"
"linux" "86"
}
"ILocomotion::ClimbUpToLedge" //(Vector const&, Vector const&, CBaseEntity const*)
{
"windows" "48"
"linux" "49"
}
"ILocomotion::JumpAcrossGap" //(Vector const&, Vector const&)
{
"windows" "49"
"linux" "50"
}
"ILocomotion::IsGap" //(Vector const&, Vector const&)
{
"windows" "93"
"linux" "94"
}
"ILocomotion::GetRunSpeed"
{
"windows" "82"
"linux" "83"
}
"IBody::GetCollisionGroup"
{
"windows" "81"
"linux" "82"
}
"ILocomotion::GetStepHeight"
{
"windows" "79"
"linux" "80"
}
"ILocomotion::GetGroundSpeed"
{
"windows" "66"
"linux" "67"
}
"ILocomotion::GetGroundMotionVector"
{
"windows" "67"
"linux" "68"
}
"ILocomotion::GetMaxAcceleration"
{
"windows" "84"
"linux" "85"
}
"IVision::GetPrimaryKnownThreat"
{
"windows" "48"
"linux" "49"
}
"IVision::AddKnownEntity"//(CBaseEntity*)
{
"windows" "54"
"linux" "55"
}
"IVision::GetKnown"//(CBaseEntity const*)
{
"windows" "53"
"linux" "54"
}
"CKnownEntity::GetEntity"
{
"windows" "3"
"linux" "4"
}
"CKnownEntity::UpdatePosition"
{
"windows" "2"
"linux" "3"
}
"CKnownEntity::UpdateVisibilityStatus"
{
"windows" "10"
"linux" "11"
}
"IBody::GetSolidMask"
{
"windows" "80"
"linux" "81"
}
"IBody::StartActivity"
{
"windows" "58"
"linux" "59"
}
"IBody::GetHullWidth"
{
"windows" "74"
"linux" "75"
}
"IBody::GetHullHeight"
{
"windows" "75"
"linux" "76"
}
"IBody::GetStandHullHeight"
{
"windows" "76"
"linux" "77"
}
"IBody::GetCrouchHullHeight"
{
"windows" "77"
"linux" "78"
}
"IBody::GetHullMins"
{
"windows" "78"
"linux" "79"
}
"IBody::GetHullMaxs"
{
"windows" "79"
"linux" "80"
}
"CBaseCombatCharacter::ShouldGib"
{
"windows" "289"
"linux" "290"
}
"NextBotGroundLocomotion::GetGravity"
{
"windows" "105"
"linux" "106"
}
"NextBotGroundLocomotion::GetGroundNormal"
{
"windows" "65"
"linux" "66"
}
"NextBotGroundLocomotion::IsOnGround"
{
"windows" "63"
"linux" "64"
}
"NextBotGroundLocomotion::SetVelocity"
{
"windows" "104"
"linux" "105"
}
"NextBotGroundLocomotion::GetFrictionSidewaysForward"
{
"windows" "106"
"linux" "107"
}
"NextBotGroundLocomotion::GetFrictionSideways"
{
"windows" "107"
"linux" "108"
}
"NextBotGroundLocomotion::OnMoveToSuccess" //(Path const*)
{
"windows" "6"
"linux" "7"
}
"NextBotGroundLocomotion::OnMoveToFailure" //(Path const*, MoveToFailureType)
{
"windows" "7"
"linux" "8"
}
"NextBotGroundLocomotion::Run" //(Path const*, MoveToFailureType)
{
"windows" "55"
"linux" "56"
}
"NextBotGroundLocomotion::Approach" //(Vector const&, float)
{
"linux" "47"
"windows" "46"
}
"NextBotGroundLocomotion::FaceTowards" //(Vector const&)
{
"windows" "73"
"linux" "74"
}
"CTFBaseBossLocomotion::GetStepHeight" //()const
{
"windows" "79"
"linux" "80"
}
//"ILocomotion::ShouldCollideWith"//(CBaseEntity const*)
"NextBotGroundLocomotion::ShouldCollideWith"//(CBaseEntity const*)
{
"windows" "99"
"linux" "100"
}
}
}
}
__________________
Last edited by lobnico; 12-13-2017 at 12:22.
|
|