Server Help

Bot Questions - Complex command help.

Pests - Tue Dec 09, 2003 9:58 pm
Post subject: Complex command help.
I need a way to do this, I can do what I want to do, but not one part....

I want to make the bot so one player can give points to another, but it has to confirm with both players first. So one player will !give User 999 and it needs to first ask that user if thats really what they want to do, they will respond with a command (something like !yes or !no). If, yes, it needs to ask the same question to User, and again they need to respond in the same way the first person did. If this goes all good, then it will transfew the points. I need it so it will support 2 people asking one person, ect.

The only problem I have is storing who asked who, and when the second user responds with !y or !n, who the first user was.

I do have experence with the merv core, I just don't know how to do the above. Any ideas would help icon_smile.gif
Cyan~Fire - Tue Dec 09, 2003 10:33 pm
Post subject:
I'd say probably player pointers. Make a Nx2 array of player pointers, each entry having a pair (giver and receiver). That's the best thing I can come up with.
Mine GO BOOM - Wed Dec 10, 2003 1:07 am
Post subject:
Learn what LinkedLists are, and how they work. Will do exactly what you need without problems.

Simple description of how to use it: Created the linked list, but without any data in it. As you add !give'd players, you create new links in the chain, and tack it onto the end of the list. The new link will contain the giver's name, the receiver's name, and how many points. Then, as someone accepts (or rejects) an offer, you go through the list to find the offer, and then remove it from the list. Maybe add a timer value also, so after 5 mins, the offer becomes invalid. Then you can have a function that is ran every minute or so, and cleans up the list.
Anonymous - Wed Dec 10, 2003 8:32 am
Post subject:
Use the built-in player tags from mervbot.

Code: Show/Hide

spawn.h

enum ptags{
has_confirmed,
asker_ident,
prize_amount
};

spawn.cpp

int strcasecmp (const char *a, const char *b)
{
   // compare strings not case sensitive
   register int n;

   while (*a == *b || (n = tolower (*a) - tolower (*b)) == 0)
     {
       if (*a == '\0')
         return 0;
       a++, b++;
     }
   return n;
}

Player* botInfo::GetPilot(char *name)
{
    _listnode <Player> *parse = playerlist->head;

     while (parse)
     {
   Player *p = parse->item;

   if (strcasecmp(p->name,name)==0)
             return p;

   parse = parse->next;
      }
   return 0;
}

Player* botInfo::GetPilot(int id)
{
    _listnode <Player> *parse = playerlist->head;

     while (parse)
     {
   Player *p = parse->item;

   if (p->ident == id)
             return p;

   parse = parse->next;
      }
   return 0;
}


command.cpp

if (c->check("give"))
{
   // !give <name>,<amount>
   String str = c->final;

   int check = strstr(s,",")-s;
   String name = s.split(',");
   int amount = getInteger(s,10);

   Player t = GetPilot(name);

   if (t)
   {
      set_tag(p,asker_ident,t->ident);
      set_tag(p,has_confirmed,0);

      set_tag(t,has_verified,0);

      set_tag(t,prize_amount,amount);
     
     sendPrivate(p,"Verify sending '" + (String) t->name + "' " + (String) amount + " points by replaying !confirm");
   }
}

if (c->check("confirm"))
{
   if (get_tag(p,has_confirmed)==0)
   {
     set_tag(p,has_confirmed,1);

     Player t = GetPilot(get_tag(p,asker_ident));

     if (t)
     {
        sendPrivate(t,"'" + (String) p->name + "' wants to give you " + (String) amount + " points, grant by replying !yes");
      }
   }
}

if (c->check("yes"))
{
   int amount = get_tag(p,amount);

   if (amount > 0)
   {
      sendPrivate(p,"*points " + (String) amount);

      set_tag(p,prize_amount,0);
   }
   
}

That's the general idea, might be missing some code, only spent 5 mins on it.
Pests - Wed Dec 10, 2003 10:53 am
Post subject:
That seems to be what im looking for, cept a few errors. Also might need to check if the first user confirmed before the second can type !yes, but that wouldnt be hard. Thanks.
Cyan~Fire - Wed Dec 10, 2003 4:42 pm
Post subject:
Player tags wouldn't be a good solution for this problem because you'd have to search them all the time.
The reason I suggested an array instead of a linkedlist is because it could be 2 dimensions.
Mine GO BOOM - Wed Dec 10, 2003 10:10 pm
Post subject:
Cyan~Fire wrote:
The reason I suggested an array instead of a linkedlist is because it could be 2 dimensions.


The reason I suggested a linked list is so you wouldn't be eating massive amounts of memory for very low usage. Its better to learn a more advanced way every so often, even if for only a trival project, so you can use it in the future.
Dr Brain - Wed Dec 10, 2003 11:01 pm
Post subject:
Learn the correct algorthm for the job. Linked lists are second to none for inserts and deletes. They are slower on reads than arrays, but for this job, they are the storage method of choice.

Arrays are great for reading/updating, but majorly suck for inserts and deletes (read: nearly impossible).

Vectors are like arrays, but allow you to grow the contents.

Linked lists can also be used for a million different things, like trees, circular lists, queues, stacks, maps and some other things that I have forgotten about.

Oh, and BTW, linked lists can be two dementional too tongue.gif.
All times are -5 GMT
View topic
Powered by phpBB 2.0 .0.11 © 2001 phpBB Group