-- [ Picked text/plain from multipart/alternative ] > What code samples?
The ones you have in your post, alternating every second between which messages are going to the console :) On Sat, Feb 23, 2008 at 2:08 PM, Jay Stelly <[EMAIL PROTECTED]> wrote: > 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()<http://developer.valvesoftware.com/wiki/Think%28%29>. > > > 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 > > -- _______________________________________________ To unsubscribe, edit your list preferences, or view the list archives, please visit: http://list.valvesoftware.com/mailman/listinfo/hlcoders

