Well, I found that the above change helped with spawning multiple mobs, but the message to those newly spawned mobs wasn't getting through. I thought that I had posted this last night (hope I included everything), but I guess not. Disregard the above change. This is what needs to be done:
changes to zone/embparser.cpp
about line 312, replace:
	Code:
	std::string cmd = "@quest::cmd_queue = (); package " + (std::string)(pkgprefix) + (std::string)(";");
 with:
	Code:
	std::string cmd = "package " + (std::string)(pkgprefix) + (std::string)(";");
 about line 325, replace this block of code
	Code:
	int numcoms = perl->geti("quest::qsize()");
for(int c = 0; c < numcoms; ++c)
{
  char var[1024] = {0};
  sprintf(var,"$quest::cmd_queue[%d]{func}",c);
  std::string cmd = perl->getstr(var);
  sprintf(var,"$quest::cmd_queue[%d]{args}",c);
  std::string args = perl->getstr(var);
  size_t num_args = std::count(args.begin(), args.end(), ',') + 1;
  ExCommands(cmd, args, num_args, npcid, other, mob);
}
 with:
	Code:
	static int c = 0;
while (c < perl->geti("quest::qsize()"))
{
  char var[1024];
  sprintf(var,"$quest::cmd_queue[%d]{func}",c);
  std::string cmd = perl->getstr(var);
  sprintf(var,"$quest::cmd_queue[%d]{args}",c);
  std::string args = perl->getstr(var);
  size_t num_args = 1;
  if (!(!strcmp(cmd.c_str(), "say") ||
        !strcmp(cmd.c_str(), "echo") ))
       for (const char *c = args.c_str(); *c; c++)
         if (*c == ',')
           num_args++;
  c++;
  ExCommands(cmd, args, num_args, npcid, other, mob);
}
if (c)
  perl->eval("@quest::cmd_queue = ();");
c = 0;
 changes to zone/entity.cpp
about line 342, replace (first occurance):
	Code:
	parse->Event(EVENT_SPAWN, npc->GetNPCTypeID(), 0, npc->CastToMob(), 0);
 with:
	Code:
	parse->Event(EVENT_SPAWN, npc->GetNPCTypeID(), 0, npc->CastToMob(), npc);
 As far as the other change goes, the "CastToClient" error was because the of the last arg (0). Having it as-is, with npc should work.