--
[ 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&amp;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

Reply via email to