DEFINE_THINKFUNC is there to support saving the game. Datadescs implement entity serialization.
Jay > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of > Tom Edwards > Sent: Saturday, February 23, 2008 1:50 AM > To: [email protected] > Subject: Re: [hlcoders] Think() documentation > > Thanks Josh. I've added the updated article to VDC: > http://developer.valvesoftware.com/wiki/Think() . > > I know there is a DATADESC macro to define a Think > function, DEFINE_THINKFUNC. I'm not sure of what it gains > you, however, and from what I've been able to tell everything > works fine without it. > I'd guess that it prevents an entity from changing its mind > about something every time a saved game is loaded. It's a > good enough theory to be going on with. > > You mention ClientThink at the beginning of the document, > and then again at the end. I'd put them together. > There's actually a link down to the ClientThink heading in > the HTML version. That's the best way of doing it: you don't > want to less useful stuff pushing down the core information, > but you do want people who need to perform a special task to > be aware that the page will be useful to them. > > Are you sure the Think function is called automatically at Spawn? > > > Yes. :-) Think is the logic_auto of entities. > > I'd mention that passing 0 (some code samples I've seen use > NULL) to SetNextThink will prevent a Think function from > being fired again. > Good tip, I'll add that. > > The code samples and explanations are perfect for how to > use the Think > > functions and how they're based on time. Also, the more advanced > > example regarding the gun is a great way of showing how those > > functions can be expanded into something more detailed, that's not > > necessarily "AI". In other words, it's another use of the > Think functions. > What code samples? > > > Josh Rehm wrote: > > -- > > [ Picked text/plain from multipart/alternative ] Some good info. I > > learned a bit from it. I am by no means a professional > (anything), so > > take my comments with a grain of salt! This is all just my > own little > > opinion. > > > > I can't speak for everyone, but to me it would seem like anyone who > > understands basic programming concepts, functions, and > methods (member > > functions), should be able to realize they can call functions from > > anywhere (inside Think functions). I'd recommend picking a target > > audience that allows you to focus on explaining the purpose of the > > Think functions, how to use them, and write as if you're talking to > > them. Organize the document in such a way where it states its > > assumptions about the reader's knowledge, where the reader can find > > information about those assumptions (if they don't know > those things), and then the document itself. > > > > I know there is a DATADESC macro to define a Think function, > > DEFINE_THINKFUNC. I'm not sure of what it gains you, however, and > > from what I've been able to tell everything works fine without it. > > However, since it exists, it may be good to understand the > purpose of > > DATADESC so you can describe what using that macro gains > you. (This > > would teach me something > > too!) Though, following what I mention in the paragraph above, I > > wouldn't go into a lot of detail about the purpose of > DATADESC itself. > > You could write a separate document on that. > > > > As for AI, at most I would suggest that these functions > could be used > > for AI, and then cover the AI in another document. Again, > this keeps > > the document focused on the Think functions and how to use them. > > > > Elaborate a little on what "internal logic" is, as it's an > important > > concept in terms of what a Think function is for. Something like > > "Think functions are used to implement your entity's > internal logic, how your entity thinks. > > In other words, an Entity can use a think function to > determine how it > > should react to external stimuli and its current situation. For > > example, an entity that uses a weapon could use a Think function to > > check its current ammunition stock. If its low, it would switch to > > another Think function that implements how it should go > about finding > > ammunition." This could tie in well to the AI comment I made above. > > > > You mention ClientThink at the beginning of the document, and then > > again at the end. I'd put them together. > > > > Are you sure the Think function is called automatically at > Spawn? I > > always thought you had to set the correct think function with > > SetThink, and call SetNextThink from within Spawn() to get > the a Think > > function to fire the first time. I may be wrong here, and if so > > someone please correct me (I don't have the code available > to test it at the moment). > > > > I'd mention that passing 0 (some code samples I've seen use > NULL) to > > SetNextThink will prevent a Think function from being fired again. > > > > The code samples and explanations are perfect for how to > use the Think > > functions and how they're based on time. Also, the more advanced > > example regarding the gun is a great way of showing how those > > functions can be expanded into something more detailed, that's not > > necessarily "AI". In other words, it's another use of the > Think functions. > > > > Finally, I would elaborate a little on what you mean by "Don't put > > anything expensive in this function." > > > > I think it's a very useful document, especially to someone just > > getting started with the Source Engine. Great job! > > > > - Josh > > > > > > On Fri, Feb 22, 2008 at 11:56 AM, Tom Edwards > > <[EMAIL PROTECTED]> > > wrote: > > > > > >> [ Converted text/html to text/plain ] > >> > >> I'm in the process of writing some programming > documentation for VDC > >> (it's a fantastic way to learn). Before I make any > changes, I'd like > >> to hear some feedback. :-) > >> > >> Some concerns of mine: > >> > >> I don't explicitly mention that you can call the functions from > >> anywhere within a class, not just a think function. How > obvious is it > >> that you can do that? > >> I don't mention DATADESC. I don't understand it, can't > make it work, > >> and all of my experiments worked fine without it anyway. Is it > >> important? > >> I don't mention AI thinking. Should I? > >> Is it actually any good? > >> > >> Here's the copy. I hope you can view HTML e-mails: > >> > >> > >> > --------------------------------------------------------------------- > >> --------- > >> > >> Thinking > >> > >> An entity's Think() function is the "root" gateway used to run all > >> internal logic. It is called once on spawn, with any > subsequent calls > >> decided by the programmer - happening either on a regular > basis, or > >> in response to external events. > >> > >> Use ClientThink()[1] to have an entity think every frame. > >> > >> SetNextThink() > >> > >> Defines when the entity next thinks. > >> Accepts a floating point[2] value. > >> If more than one call is made in a single execution, the new value > >> overrides the old. > >> > >> void CMyEntity::Think() > >> { > >> Msg( "I think, therefore I am.\n" ); > >> SetNextThink( gpGlobals->curtime + 1.0f ); // Think > again in > >> 1.0seconds } > >> > >> This code causes the entity to print a message to the console once > >> per second. > >> Note the use of gpGlobals->curtime, which returns the time at > >> execution, and f, which tells the C++ compiler that we are > submitting > >> a floating-point value and not an integer[3]. > >> > >> SetThink() > >> > >> Changes the active think function > >> Accepts a function pointer[4]: add '&' before the name and > omit its > >> closing parentheses. > >> If more than one call is made in a single execution, the new value > >> overrides the old. > >> > >> void CMyEntity::Think() > >> { > >> Msg( "I think, therefore I am.\n" ); > >> SetThink( &CMyEntity::Think2 ); // Think with this > procedure next > >> SetNextThink( gpGlobals->curtime + 1.0f ); } > >> > >> void CMyEntity::Think2() > >> { > >> Msg( "Variety is the spice of life.\n" ); > >> SetThink( &CMyEntity::Think ); // Think with this > procedure next > >> SetNextThink( gpGlobals->curtime + 1.0f ); } > >> > >> This code switches thinking between two functions. A real-world > >> application is to change an entity between various life stages: > >> consider a buildable gun turret[5]. One think function would run > >> while it waits to be unpackaged, another while it is being built, > >> another while it is active, and a fourth when it dies. > Creating think > >> functions for each discrete stage increases code stability > and aids > >> debugging. > >> > >> ClientThink() > >> > >> Thinking can also occur on the client, but its effects are limited. > >> Additionally, only one think function is supported for each entity. > >> > >> void C_MyEntity::ClientThink() > >> { > >> DevMsg( "Don't put anything expensive in this > function!\n" ); > >> SetNextClientThink( CLIENT_THINK_ALWAYS ); // Think every > >> frame } > >> > >> Some examples of client-side thinking are: > >> > >> Visual effects / particles > >> VGUI screen interaction > >> Modifying player speed (calculated on the client as well > as server to > >> avoid > >> lag) > >> Striders' legs snapping ropes (disabled by default) > >> > >> SetNextClientThink() > >> > >> Used to re-fire ClientThink(). In addition to normal float > values, it > >> accepts: > >> > >> CLIENT_THINK_ALWAYS > >> Think on the client once every frame. Use with caution! > >> Replaces Simulate(). > >> CLIENT_THINK_NEVER > >> Stop all client-side thinking without killing the entity. > >> > >> ===References:=== > >> 1. > >> > http://developer.valvesoftware.com/w/index.php?title=Generalities_On_ > >> Entities&action=submit#ClientThink.28.29 > >> 2. http://en.wikipedia.org/wiki/Floating_point > >> 3. http://en.wikipedia.org/wiki/Integer_%28computer_science%29 > >> 4. http://en.wikipedia.org/wiki/Pointer_%28computing%29 > >> 5. http://forums.gamedesign.net/viewtopic.php?t=3702 > >> > >> _______________________________________________ > >> To unsubscribe, edit your list preferences, or view the list > >> archives, please visit: > >> http://list.valvesoftware.com/mailman/listinfo/hlcoders > >> > >> > >> > > -- > > > > _______________________________________________ > > To unsubscribe, edit your list preferences, or view the > list archives, please visit: > > http://list.valvesoftware.com/mailman/listinfo/hlcoders > > > > > > > > > _______________________________________________ > To unsubscribe, edit your list preferences, or view the list > archives, please visit: > http://list.valvesoftware.com/mailman/listinfo/hlcoders > > _______________________________________________ To unsubscribe, edit your list preferences, or view the list archives, please visit: http://list.valvesoftware.com/mailman/listinfo/hlcoders

