Hey, I just thought I'd post the important emails that is going in the HLCoders list in case people didn't catch it.
Original email by DrEvil
Quote:
I read recently that after Lost Coast is released there will be an SDK
update on the way. I'd like to ask that the missing functionality necessary
for server plugin based bots please be added as well. There is a good sized
community of bot coders that have strong desire to make bots for HL2, as we
could do with HL1. The server plugins are the only real way that is
possible, but there is some critical stuff missing from the currently
available bot functionality in order to make a fully functional bot.
A while back I got as far as I could creating a HL2DM bot, and it was
playable, but due to missing functionality it was very primitive in many
ways. Here is my list of things that are missing from the server plugins
that are pretty much necessary for a fully functional bot. HL2 has pretty
much crippled what was once a large and thriving community of bot authors
for HL1, and our attempts to ask for the missing functionality have been
largely ignored. So I ask and detail again requests on behalf of myself and
the rest of the Bots United community at
http://forums.bots-united.com/index.php?
Stuff missing for full bot functionality
* 1) *Check if a bot has a certain weapon or item. A bool
IBotController.HasWeapon(const char *) would be nice, as well as a
HasItem(const char *) that mods can implement for custom non-weapon
equipment(kevlar vests, helmets...)
* 2) *Access to an entities velocity? This is critical for some weapons to
calculate proper leading. I'd rather not hack around this by getting the
position each frame and calculating this myself, though I will if I have to
I suppose.
* 3) *Access to any entities position/orientation/velocity. Seems right now
we're limited to players, but any decent bot is probably going to want to
have perceptions of projectiles/grenades/dynamic map props for avoidance and
such.
* 4) *Access to any entity in general. I suppose we can blindly loop through
the edict list, but an interface to CGlobalEntityList would be so much
better. Perhaps not direct access, but an interface that wraps read only
accessors to entity flags, entity properties mentioned in #3, and other
useful info.
* 5) *IPlayerInfo.ChangeClass would be nice. Empty by default, but at least
provides an interface for future mods to implement. More mods than not will
likely be class based.
* 6) *Can we have access to trace_t.GetEdict() ? It's wrapped in #if
defined( ENGINE_DLL ). Is it safe to define these in a plugin?
* 7) *Minor nitpick, is there a reason IBotController and IPlayerInfo
returns angles/vectors by value as opposed to const & ?
*8 )* We need access to ammo values without switching to the weapon. Perhaps
IBotController.GetWeaponAmmo(const char *weaponname, int &_curClip1, int
&_curClip2, int &_maxclip1, int &_maxclip2). The reason there are 2 is to
support weapons that use different ammo types for their alt-fire. Other
stuff like max ammo, max clip size, ammo per shot I suppose are normally
constants so I don't suppose we need access to them if we know the mod. Also
what would be useful is IBotController.GetAmmo(const char *ammoname, int
&_current, int &_max), to get the total amount of ammo the bot has, not
counting what's in the weapon clips(or counting I guess it doesnt matter).
*9)* How to choose the model for a bot? How about spraypaint?
Things wrong with the current bot functionality
1) IPlayerInfo.SetActiveWeapon is pretty useless. It creates a new weapon
every time its called, whether the bot has it or not. Crashes the game with
too many entities before long. My bot has to be limited to 1 weapon for this
reason. IMO this function should not create a weapon, it should return bool
if the bot has the weapon and was able to equip it. False if not. This would
give some of the functionality of #1 above. Preferably a HasItem would be
added instead though that queries for the presence of weapons or items. Mods
can extend it to allow querying of custom stuff.
2) CBotCmd.weaponselect is useless. It doesnt represent a constant value,
but instead appears to represent an the index of an entity in the master
entity table or edict list, which we don't have access to querying, or
finding out which a particular bot has.
3) No access to velocities
4) No access to anything other than players, and missing a bunch from that
access.
Things I would love to see
1) virtual const Vector IPlayerInfo::GetVelocity();
2) virtual const char *IPlayerInfo::SetModelName();
3) virtual const int IPlayerInfo::GetArmor();
4) virtual const int IPlayerInfo::GetMaxArmor();
5) virtual bool IPlayerInfo::ChangeTeam( int iTeamNum ); // just changed the
return value for success/failure.
6) virtual bool IPlayerInfo::ChangeClass(int _classId); // or classname
7) virtual bool IBotController::HasItem(const char *_name);
Merge IPlayerInfo and IBotController interfaces. They return the same
struct anyways. (GetBotController() & GetPlayerInfo())
typedef CUtlVector<int> AmmoList; // indexed by an ammo enum/id, holds ammo
counts
9) virtual bool IBotController::GetAmmo (AmmoList &_ammo);
// In this case, the AmmoList can be indexed by fire modes. Most mods
probably have 2 max, but for extendibility purposes, dont limit it.
10) virtual bool IBotController::GetAmmoForWeapon(const char *_weaponname,
AmmoList &_ammo);
11) An EntityInfo interface, similar to PlayerInfo, accessible from any
entity by either its index or edict. Wraps access to mostly CBaseEntity
stuff. Should contain the following.
const Vector GetLocalOrigin();
const Vector GetAbsOrigin();
const QAngle GetLocalAngles();
const QAngle GetAbsAngles();
const Vector GetLocalVelocity(); // object space
const Vector GetAbsVelocity(); // world space
const Vector GetMins();
const Vector GetMaxs();
const char *GetClassName(); // think this might exist already in the edict?
int GetHealth(); // for objects with health
int or edict_t GetParent(); // for objects that can be carried. Flags,
weapons, etc...
int GetEFlags();
int GetWaterLevel();
12) Change IPlayerInfo.SetActiveWeapon to bool
IPlayerInfo.SetActiveWeapon(const
char *_name, bool create); The bool return value for success/failure, and
the create parameter to control whether its created if the player doesn't
have it.
13) Make CBotCmd.weaponselect useful in some way. Maybe another accessor
that fills in a CUtlVector<int> with the bots weapons, and these ints can be
used in weaponselect. Though I imagine that this parameter can be ignored in
favor of #12.
There's probably more but these are the main things now. All these additions
shouldn't take long to add. The key here is that not only do us bot authors
need them to do bots, but it would be great if the functions could actually
be implemented in the Valve mods such as HL2DM, DOD:S and CS:S(yes there are
still many people wanting to do CS:S bots despite an official one). Most of
the functionality would be the same, it would probably just be the
ChangeClass/ChangeTeam/Ammo function implementations that will differ per
mod, with most simply being a wrapper function for other functions that
already exist.
To whom it may concern at Valve, can someone please add the missing
functionality for complete bot support? At the very least can we get some
sort of response this time? It has been frustrating to be completely ignored
when previously asking for help with these bot matters. If it is not in
valves time or budget to add these changes, would valve consider integrating
them into official mods if someone else did it?
Thanks
DrEvil
www.omni-bot.com <http://www.omni-bot.com>
|
Response by VALVE:
Quote:
Life has been very busy with Lost Coast and other projects. I am going to chase this request up internally. We actually have bigger plans for a bot SDK, that is why I hesitated with my answer.
This is also the first time I saw this request, please feel free to email this questions directly in the future to ensure they get our attention.
- Alfred
|
Woot!
Can't wait for the Bot SDK!