• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver

EMU MQ2DPS

HardOne

Member
Joined
Jan 15, 2006
RedCents
61¢
MQ2Dps.cpp
Rich (BB code):
// MQ2Dps.cpp : Defines the entry point for the DLL application. 

// Author: Shire 
// Version: 0.9.96 alpha 
// Updated 03-10-05 by koad for some changes to compile by Cr4zyB4rd 
// cleaned up some things, removed param handlers, and included MunkyBoy's focus fix 

// Know bug: Sort functions 
// #define MAX_CHARS 50, change 50 to the number of people fighting. 

#include "../MQ2Plugin.h" 
#include "string.h" 
#include "MQ2Dps.h" 

PreSetup("MQ2Dps"); 

///////////////////////////////// 
class MQ2DpsType : public MQ2Type 
{ 
   private: 
      int _id; 
   public: 
      enum DpsMembers 
      { 
         Version=1, 
         Name=2, 
         Dps=3, 
         MyPet=4, 
         Me=5, 
      }; 
      /*CDpsType(int id) 
      { 
         _id = id; 
      }*/ 
      MQ2DpsType() : MQ2Type("dps") 
      { 
         //_id = -1; 
         TypeMember(Version); 
         TypeMember(Name); 
         TypeMember(Dps); 
         TypeMember(MyPet); 
         TypeMember(Me); 
         _id = -1; 
      } 
      ~MQ2DpsType() 
      { 
      } 
      void SetIndex(int id) 
      { 
         _id = id; 
      } 
      bool GetMember(MQ2VARPTR VarPtr, PCHAR Member, PCHAR Index, MQ2TYPEVAR &Dest) 
      { 
         PMQ2TYPEMEMBER pMember=MQ2DpsType::FindMember(Member); 
         if (!pMember) 
            return false; 
         switch((DpsMembers)pMember->ID) 
         { 
         case Version: 
            Dest.Ptr= ver; 
            Dest.Type=pStringType; 
            return true; 
         case Name: 
            //WriteChatColor(Index); 
            if (_id >= 0) 
            { 
               //WriteChatColor("123"); 
               //unsigned long N=atoi(Index); 
               if (strcmp(_name[_id], "\0") != 0) 
               { 
                  char tmp_str[MAX_STRING] = {0}; 
                  strcpy(tmp_str,_name[_id]); 
                  Dest.Ptr= &tmp_str[0]; 
                  Dest.Type=pStringType; 
               } 
               else 
               { 
                  Dest.Ptr = "-"; 
                  Dest.Type=pStringType; 
               } 
               _id = -1; 
               return true; 
            } 
            //WriteChatColor("456"); 
            return false; 
         case Dps: 
            if (_id >= 0) 
            { 
               //unsigned long N=atoi(Index); 
               int dps = 0; 
               if ( (dps = _paramDps(_id)) != -1) 
               { 
                  Dest.Int = dps; 
                  Dest.Type=pIntType; 
               } 
               else 
               { 
                  Dest.Ptr = "-"; 
                  Dest.Type=pStringType; 
               } 
               _id = -1; 
               return true; 
            } 
            return false; 
         case Me:    
            if (_playerid != -1) 
            { 
               int res = _paramDps(_playerid); 
               if (res != -1) 
               { 
                  Dest.Int = res; 
                  Dest.Type=pIntType; 
               } 
               else 
               { 
                  Dest.Ptr = "-"; 
                  Dest.Type=pStringType; 
               } 
            return true; 
            } 
            else 
            { 
               Dest.Ptr = "-"; 
               Dest.Type=pStringType; 
               return true; 
            } 
         case MyPet:    
            if (_petid != -1) 
            { 
               int res = _paramDps(_petid); 
               if (res != -1) 
               { 
                  Dest.Int = res; 
                  Dest.Type=pIntType; 
               } 
               else 
               { 
                  Dest.Ptr = "-"; 
                  Dest.Type=pStringType; 
               } 
            return true; 
            } 
            else 
            { 
               Dest.Ptr = "-"; 
               Dest.Type=pStringType; 
               return true; 
            } 
         } 
         return false; 
      } 
    
      bool ToString(MQ2VARPTR VarPtr, PCHAR Destination) 
      { 
         /*if (BzDone) 
            strcpy(Destination,"TRUE"); 
         else 
            strcpy(Destination,"FALSE");*/ 
         return true; 
      } 
    
      bool FromData(MQ2VARPTR &VarPtr, MQ2TYPEVAR &Source) 
      { 
         return false; 
      }    
      bool FromString(MQ2VARPTR &VarPtr, PCHAR Source) 
      { 
         return false; 
      } 
      /*long dps() 
      { 
         return _paramDps(_id); 
      } 
      long meleedmg() 
      { 
         return _meleedmg[_id]; 
      } 
      long castdmg() 
      { 
         return _castdmg[_id]; 
      }*/ 
}; 

//MQ2DpsType Dps[MAX_CHARS]; 
class MQ2DpsType *pDpsType=0; 
///////////////////////////////// 
class CDpsWnd : public CCustomWnd 
{ 
public: 
   CDpsWnd():CCustomWnd("DpsWindow") 
   { 
      //Add each button here 
      ONButton = (CButtonWnd*)GetChildItem("DPSButtonON");               //ON Button 
      OFFButton = (CButtonWnd*)GetChildItem("DPSButtonOFF");            //OFF Button 
      RESETButton = (CButtonWnd*)GetChildItem("DPSButtonRESET");         //RESET Button 
      CloseButton = (CButtonWnd*)GetChildItem("CloseButton");             //Close Button 
      SetWndNotification(CDpsWnd); 
   } 
    
   ~CDpsWnd() 
   { 
   } 

   int WndNotification(CXWnd *pWnd, unsigned int Message, void *unknown) 
   {    
       //ON Button 
      if (pWnd==(CXWnd*)ONButton) 
      { 
         if (Message==XWM_LCLICK) 
            DoCommand((PSPAWNINFO)pCharSpawn,"/dps on"); 
         else 
            DebugSpew("ONButton message %Xh / %d",Message,Message); 
      } 
      //OFF Button 
      if (pWnd==(CXWnd*)OFFButton) 
      { 
         if (Message==XWM_LCLICK) 
            DoCommand((PSPAWNINFO)pCharSpawn,"/dps off"); 
         else 
            DebugSpew("OFFButton message %Xh / %d",Message,Message); 
      } 
      //RESET Button 
      if (pWnd==(CXWnd*)RESETButton) 
      { 
         if (Message==XWM_LCLICK) 
            DoCommand((PSPAWNINFO)pCharSpawn,"/dps reset"); 
         else 
            DebugSpew("RESETButton message %Xh / %d",Message,Message); 
      } 
      //Close Button 
      if (pWnd==(CXWnd*)CloseButton) 
       { 
         if (Message==XWM_LCLICK) 
            pXWnd()->Show(0,0); 
         else 
            DebugSpew("CloseButton message %Xh / %d",Message,Message); 
      } 
      return 0; 
   }; 
   CButtonWnd *ONButton; 
   CButtonWnd *OFFButton; 
   CButtonWnd *RESETButton; 
   CButtonWnd *CloseButton; 

}; 

CDpsWnd *MyWnd = 0; 


void CreateDpsWindow() 
{ 
   if (MyWnd)  return; 
   if (pSidlMgr->FindScreenPieceTemplate("DpsWindow")) { 
      MyWnd = new CDpsWnd(); 
      ReadWindowINI((PCSIDLWND)MyWnd); 
      WriteWindowINI((PCSIDLWND)MyWnd); 
   } 
} 

void DestroyDpsWindow() 
{ 
   if (MyWnd) 
   { 
      WriteWindowINI((PCSIDLWND)MyWnd); 
      delete MyWnd; 
      MyWnd=0; 
   } 
} 


// Called once, when the plugin is to initialize 
PLUGIN_API VOID InitializePlugin(VOID) 
{ 
   if (debug) DebugSpewAlways("Initializing MQ2Dps"); 
   WriteChatColor("Loading MQ2Dps v0.9.94 ..."); 

   AddXMLFile("MQUI_DpsWnd.xml"); 
   AddMQ2Data("Dps",dataDps); 
   AddCommand("/dps",CmdDps); 
    
   pDpsType = new MQ2DpsType; 

   char val[MAX_STRING] = {0}; 
   GetPrivateProfileString("Window","LogonShow","1",val,MAX_STRING,INIFileName);            _logonshowwindow = atoi(val) == 1 ? 1 : 0;   strcpy(&val[0], "\0"); 
   GetPrivateProfileString("General Options","Sort","0",val,MAX_STRING,INIFileName);         _sort = atoi(val);   strcpy(&val[0], "\0"); 
   GetPrivateProfileString("General Options","PetFollowOwner","1",val,MAX_STRING,INIFileName);   _petowner = atoi(val)  == 1 ? 1 : 0; 
   GetPrivateProfileString("General Options","AbsoluteDps","1",val,MAX_STRING,INIFileName);   _absdps = atoi(val)  == 1 ? 1 : 0; 
   _focusdps = 0; 
} 

// Called once, when the plugin is to shutdown 
PLUGIN_API VOID ShutdownPlugin(VOID) 
{ 
   if (debug) DebugSpewAlways("Shutting down MQ2Dps"); 

   DestroyDpsWindow(); 
   RemoveXMLFile("MQUI_DpsWnd.xml"); 

   RemoveMQ2Data("Dps"); 
   RemoveCommand("/dps"); 

   delete pDpsType; 
} 

PLUGIN_API VOID OnCleanUI(VOID) 
{ 
   DestroyDpsWindow(); 
} 

PLUGIN_API VOID OnReloadUI() 
{ 
   if (_logonshowwindow) 
   { 
      CreateDpsWindow(); 
   } 
} 

// Called once directly after initialization, and then every time the gamestate changes 
PLUGIN_API VOID SetGameState(DWORD GameState) 
{ 
   if (GameState==GAMESTATE_INGAME && !MyWnd) 
   { 
       CreateDpsWindow(); 
   } 
   ResetGV(); 
} 

// This is called every time EQ shows a line of chat with CEverQuest::dsp_chat, 
// but after MQ filters and chat events are taken care of. 
PLUGIN_API DWORD OnIncomingChat(PCHAR Line, DWORD Color) 
{ 
   if (debug) DebugSpewAlways("MQ2Dps::OnIncomingChat(%s)",Line); 

   char strl[MAX_STRING] = {'\0'}; 
   char strd[MAX_STRING] = {'\0'}; 
   sprintf (strl,"%s",Line); 


   if (_ON) 
   { 
      if (strstr(Line,"has taken") && strstr(Line,"damage from your")) 
      { 
         if ( (_focusdps && strstr(strlwr(strl),strlwr(strFocusName))) || !(_focusdps) ) { 
            if (debug) DebugSpewAlways("Call Event_Dot(%s)",Line); 
            Event_Dot(Line); 
         } 
      } 
          
      if (strstr(Line,"for") && strstr(Line,"points of damage")) 
      { 
         if ( (_focusdps && strstr(strlwr(strl),strlwr(strFocusName))) || !(_focusdps) ) { 
            if (debug) DebugSpewAlways("Call Event_Melee(%s)",Line); 
            Event_Melee(Line); 
         } 
      } 
        
      if (strstr(Line,"hit") && strstr(Line,"non-melee") && (strstr(Line,"You") == NULL)) 
      { 
         if ( (_focusdps && strstr(strlwr(strl),strlwr(strFocusName))) || !(_focusdps) ) { 
            if (debug) DebugSpewAlways("Call Event_Cast(%s)",Line); 
            Event_Cast(Line); 
         } 
      } 
    
      if ( (strstr(Line,"dies") || ((strstr(Line,"have") || strstr(Line,"has")) && strstr(Line,"slain")))) 
      { 
         if (_focusdps) { 
            sprintf(strd, "%s has been slain by", strlwr(strFocusName)); 
            if ( strstr(strlwr(strl), strd) || strstr(strlwr(strl), "you have") ) { 
               if (debug) DebugSpewAlways("Call Event_MobDead(%s)",Line); 
               Event_MobDead(Line); 
               _focusdps = 0; 
               memset(strFocusName, '\0', MAX_STRING); 
            } 
         } else { 
            if (debug) DebugSpewAlways("Call Event_MobDead(%s)",Line); 
            Event_MobDead(Line); 
         } 
      } 
      /*if ( strstr(Line,"holy blade cleanses") && strstr(Line,"target") ) 
      { 
         if (debug) DebugSpewAlways("Call Event_OtherMeleeDmg(%s)",Line); 
         Event_OtherMeleeDmg(Line); 
      }*/ 
   } 
   return 0; 
} 

void Event_Dot (char* line) 
{ 
   char str[MAX_STRING] = "\0"; 
   char name[MAX_STRING] = "\0"; 
   int pos = 0; 
   int pos1 = 0; 
   int pos2 = 0; 
   int id = 0; 
   PSPAWNINFO pPet = NULL; 
        
   //fight = 1; 
   if (debug) DebugSpewAlways("Entering Dot"); 
    
   strcpy(name,((PCHARINFO)pCharData)->Name); 
   if (IdInList(name) == -1) AddToList(name); 

   if ((id = IdInList(name)) != -1 ) 
   { 
      pos1 = (int)(strstr(line,"has taken") - line) + 10; 
      pos2 = (int)(strstr(line,"damage") - line) - 1; 
      strncpy(str, &line[pos1], pos2 - pos1); 
      strcpy(&str[pos2-pos1],"\0"); 
      _castdmg[id] += atoi(str); 
      if (_fight[id] == 0 ) 
      { 
         time( &_timeI[id] ); 
         _fight[id] = 1; 
      } 
   } 
   if (debug) DebugSpewAlways("Leaving Dot"); 
} 

void Event_Melee (char* line) 
{ 
   char str[MAX_STRING] = "\0"; 
   char name[MAX_STRING] = "\0"; 
   int pos = 0; 
   int pos1 = 0; 
   int pos2 = 0; 
   int id = 0; 
   char h[14][20] = {"hit","pierce","claws","backstab","punch","kick","crush","slice","bite","bash","slash","maul","sting","frenzy"}; 
           
   fight = 1; 
   if (debug) DebugSpewAlways("Entering Melee"); 
    
   for (int i = 0; i <= 12; i++) 
   { 
      pos = (int)(strstr(line,h) - line + 1); 
      if ( pos >= 0) 
      { 
         strncpy(name,&line[0],pos-2); 
         strcpy(&name[pos-2],"\0"); 
         if (IdInList(name) == -1) AddToList(name); 
      } 
   } 

   if (debug) DebugSpewAlways("Melee point 2"); 
   if ((id = IdInList(name)) != -1 ) 
   { 
      pos1 = (int)(strstr(line,"for") - line) + 4; 
      pos2 = (int)(strstr(line,"point") - line) - 1; 
      strncpy(str, &line[pos1], pos2 - pos1); 
      strcpy(&str[pos2-pos1],"\0"); 
      if (atoi(str) <= 31999) _meleedmg[id] += atoi(str); //_meleedmg[id] += atoi(str); 
      if (_fight[id] == 0 ) 
      { 
         time( &_timeI[id] ); 
         _fight[id] = 1; 
      } 
   } 
   if (debug) DebugSpewAlways("Leaving Melee"); 
} 

void Event_OtherMeleeDmg (char* line) 
{ 
   // Actually Paladin Slay Undead 
   char str[MAX_STRING] = "\0"; 
   char name[MAX_STRING] = "\0"; 
   int pos = 0; 
   int pos1 = 0; 
   int pos2 = 0; 
   int id = 0; 
   char h[1][20] = {"'s"}; 
        
   //fight = 1; 
   if (debug) DebugSpewAlways("Entering OtherMelee"); 
    
   for (int i = 0; i <= 0; i++) 
   { 
      pos = (int)(strstr(line,h) - line + 1); 
      if ( pos >= 0) 
      { 
         strncpy(name,&line[0],pos-2); 
         strcpy(&name[pos-2],"\0"); 
         if (IdInList(name) == -1) AddToList(name); 
      } 
   } 

   if (debug) DebugSpewAlways("Melee point 2"); 
   if ((id = IdInList(name)) != -1 ) 
   { 
      pos1 = (int)(strstr(line,"(") - line) + 1; 
      pos2 = (int)(strstr(line,")") - line) - 1; 
      strncpy(str, &line[pos1], pos2 - pos1); 
      strcpy(&str[pos2-pos1],"\0"); 
      _meleedmg[id] += atoi(str); 
      if (_fight[id] == 0 ) 
      { 
         time( &_timeI[id] ); 
         _fight[id] = 1; 
      } 
   } 
   if (debug) DebugSpewAlways("Leaving OtherMelee"); 
} 

void Event_Cast (char* line) 
{ 
   char str[MAX_STRING] = "\0"; 
   char name[MAX_STRING] = "\0"; 
   int pos = 0; 
   int pos1 = 0; 
   int pos2 = 0; 
   int id = 0; 
   char h[1][20] = {"hit"}; 
        
   //fight = 1; 
   if (debug) DebugSpewAlways("Entering Cast"); 
    
   for (int i = 0; i <= 0; i++) 
   { 
      pos = (int)(strstr(line,h) - line + 1); 
      if ( pos >= 0) 
      { 
         strncpy(name,&line[0],pos-2); 
         strcpy(&name[pos-2],"\0"); 
         if (IdInList(name) == -1) AddToList(name); 
      } 
   } 

   if ((id = IdInList(name)) != -1 ) 
   { 
      pos1 = (int)(strstr(line,"for") - line) + 4; 
      pos2 = (int)(strstr(line,"points") - line) - 1; 
      strncpy(str, &line[pos1], pos2 - pos1); 
      strcpy(&str[pos2-pos1],"\0"); 
      _castdmg[id] += atoi(str); 
      if (_fight[id] == 0 ) 
      { 
         time( &_timeI[id] ); 
         _fight[id] = 1; 
      } 
   } 
   if (debug) DebugSpewAlways("Leaving Cast"); 
} 

void Event_MobDead (char* line) 
{ 
   char str[MAX_STRING] = "\0"; 
   long tmptime = 0; 
   long _totaldmg = 0; 
   PSPAWNINFO pChar = NULL; 
    
   _mobtotaldmg = 0; 
   _mobtotalcast = 0; 

   if (debug) DebugSpewAlways("Entering MobDead"); 

   // Find the minimum value of _timeI[] 
      int minIndex = 0; 
       time_t maxVal = _timeI[minIndex];      
      int nb = IdInList("\0"); 
       for (int i = 0; i < nb; i++) { 
         if (_timeI < _timeI[minIndex]) { 
               minIndex = i; 
         } 
      } 
      // Calculate elapsed time: TimeNow - FirstHitTime 
      tmptime = 0; 
      if (_timeI[minIndex] != 0) 
      { 
         time_t t = 0; 
         time( &t ); 
         tmptime = t - _timeI[minIndex]; 
      } 

   if (_absdps) 
      for (int i = 0; i < IdInList("\0"); i++) { 
         _timeI = _timeI[minIndex]; 
         //sprintf(str,"\ag%d,%d\ax",tmptime,_timeI); 
         //WriteChatColor(str); 
      } 

   if (_sort) Sort(_sort); 

   if (_petowner) 
   { 
      for (int i = 0; i <= IdInList("\0")-1; i++) 
      { 
         DebugSpewAlways("Entering MobDead, loop %d",i); 
    
         pChar = GetCharFromPetName(_name); 
         //WriteChatColor("Before"); 
         //WriteChatColor(_name); 
         if (pChar != NULL) 
         { 
            //WriteChatColor(pChar->Name); 
            if (IdInList(pChar->Name) != -1) 
            { 
               // Don't write pet stats, they will be wrote 
               // when the char stats are written (see WriteStats) 
               //WriteChatColor("non null, is in list"); 
               //WriteChatColor(pChar->Name); 
            } 
            else 
            { 
               // If the owner did not do any dmg he is not in 
               // the list and don't have stats, displaying the name. 
               //sprintf(str,"\ar#\ax %s",pChar->Name); 
               //WriteChatColor(str); 
               //WriteChatColor("non null"); 
               WriteStats(i,1); 
            } 
         } 
         else 
         { 
            // Write player and players's pet stats. 
            //WriteChatColor("null"); 
            WriteStats(i,0); 
         } 
      } 
   } 
   else { 
      for (int i = 0; i <= IdInList("\0")-1; i++) 
      { 
         //WriteChatColor(_name); 
         WriteStats(i,1); 
      } 
   } 
    
   if (_mobtotaldmg != 0) 
   { 
      if (tmptime != 0) 
         sprintf(str,"\ay#\ax Mob total hps: \ar%d\ax (\ag%d\ax) in %d, DPS: \ay%d\ax", _mobtotaldmg, _mobtotalcast,tmptime, _mobtotaldmg / tmptime); 
      else 
         sprintf(str,"\ay#\ax Mob total hps: \ar%d\ax (\ag%d\ax)", _mobtotaldmg, _mobtotalcast); 
      WriteChatColor(str); 
      sprintf(str,"\ag-----------------------------------------------------\ax"); 
      WriteChatColor(str); 
    
   //fight = 0; 
   ResetGV(); 
   } 

   if (debug) DebugSpewAlways("Leaving MobDead"); 
} 

int IdInList (char* name) 
{ 
   DebugSpewAlways("IdInList"); 
    
   if (strcmp(name,"You") == 0) name = ((PCHARINFO)pCharData)->Name; 

   for (int i = 0; i <= MAX_CHARS - 1; i++) 
   { 
      if (strcmp(_name, name) == 0) 
      { 
         if (debug) DebugSpewAlways("Leaving IdInList, found %s", name); 
         return i; 
      } 
   } 
    
   if (debug) DebugSpewAlways("Leaving IdInList, not found"); 
   return -1; 
} 

void AddToList (char* name) 
{ 
   PSPAWNINFO pSpawn = NULL; 
   if (debug) DebugSpewAlways("AddToList(%s)",name); 
    
   int res = 0; 
   char str[MAX_STRING] = "\0"; 

   if (strcmp(name,"You") == 0) name = ((PCHARINFO)pCharData)->Name; 

   res = IdInList("\0"); 
    
   if (debug) DebugSpewAlways("AddToList before sprintf"); 
    
   //sprintf(str,"Added to list %s %d %d",name,res,IsNpc(name)); 
    
   if (debug) DebugSpewAlways("AddToList after sprintf"); 

   if (_playerid == -1) 
      if (strcmp(name,((PCHARINFO)pCharData)->Name) == 0) _playerid = res; 
   if (debug) DebugSpewAlways("AddToList(%s), between if",name); 
   if (_petid == -1) 
      pSpawn = GetPetFromCharName(((PCHARINFO)pCharData)->Name); 
      if (pSpawn != NULL) if (strcmp(name,pSpawn->Name ) == 0) _petid = res; 
   if (debug) DebugSpewAlways("AddToList(%s), after ifs",name); 
    
   strcpy(_name[res],name); 
   _isnpc[res] = IsNpc(name); 
   //WriteChatColor(str); 

   if (debug) DebugSpewAlways("Leaving AddToList(%s)",name); 
} 

void ResetGV (void) 
{ 
   for (int j = 0; j <= MAX_CHARS-1; j++) 
   { 
      strcpy (_name[j],"\0"); 
      _meleedmg[j] = 0; 
      _castdmg[j] = 0; 
      _timeI[j] = 0; 
      _timeF[j] = 0; 
      _fight[j] = 0; 
      _isnpc[j] = 0; 
      _written[j] = 0; 
   } 
   _playerid = -1; 
   _petid = -1; 
} 

void WriteStats(long i, bool pet) 
{ 
   // Count total damages and display char stats, recursive function. 
    
   char str[MAX_STRING] = "\0"; 
   char strout[MAX_STRING] = "\0"; 
   char petname[MAX_STRING] = "\0"; 
   long tmptime = 0; 
   long totaldmg = 0; 
   PSPAWNINFO pPet = NULL; 

   if (_written == 0 && (_meleedmg != 0 || _castdmg != 0) ) 
   { 
      time( &_timeF ); 
      tmptime = _timeF - _timeI; 
    
      totaldmg = _meleedmg + _castdmg; 
    
      if (_isnpc != 1) 
      { 
         _mobtotalcast += _castdmg; 
         _mobtotaldmg += totaldmg; 
      } 
          
      if (debug) DebugSpewAlways("Entering MobDead, loop %d, before IF",i); 
       
      if (pet) strcat(strout, "     "); 
       
      sprintf(str,"\ar#\ax"); 
      strcat(strout,str); 
       
      if (_isnpc != 1) 
         sprintf(str," %s ",_name); 
      else 
         sprintf(str," \ar%s\ax ",_name); 
      strcat(strout,str); 

      sprintf(str,"total dmg: \ar%d\ax (\ag%d\ax)",totaldmg,_castdmg); 
      strcat(strout,str); 
       
      if (tmptime != 0) 
      { 
         sprintf(str," in %d, DPS: \ay%d\ax",tmptime,totaldmg/tmptime); 
         strcat(strout,str); 
      } 
       
      if (debug) DebugSpewAlways("MobDead, loop %d, before IF: %s",i,strout); 
      WriteChatColor(strout); 
      _written = 1; 

      pPet = GetPetFromCharName(_name); 
      if (pPet != NULL) 
      {    
         sprintf(petname, "%s", pPet->Name); 
         CleanupName(petname,FALSE); 
         if (strstr(petname, "#") != NULL) strcpy(petname,&petname[1]); 
         int tmpID = IdInList(petname); 
         if ( tmpID != -1) 
         { 
            WriteStats(tmpID, 1); 
         } 
      } 
   } 
} 

int IntArrayMax(int a[], int size) 
{ 
   //char str[MAX_STRING); 
   if (size == -1) return -1; 
   //assert(size > 0);        // Note 1. 
    int maxVal = a[0];     // Note 2. 
    for (int i=1; i<size; i++) { 
        if (a > maxVal) { 
            maxVal = a; 
        } 
    } 
    return maxVal; 
} 

void Sort (int opt) 
{ 
   if (debug) DebugSpewAlways("Entering Sort"); 

   char str[MAX_STRING] = {0}; 
   int maxid = 0; 
   long max = 0; 
   char max_name[MAX_STRING] = {0}; 
   long max_meleedmg = 0; 
   long max_castdmg = 0; 
   time_t max_timeI = 0; 
   bool max_isnpc = 0; 
   int listsize = IdInList("\0"); 

   //sprintf(str,"OPT: %d",opt); 
   WriteChatColor(str); 

   if (debug) DebugSpewAlways("SORT point 1"); 
   //WriteChatColor("Sorting ..."); 
   //for (int h= 0; h < listsize; h++) 
   //{ 
      //sprintf (str,"%d, value: %d",h,_meleedmg[h]); 
      //WriteChatColor(str); 
   //} 
   for (int i = 0; i < listsize; i++) 
   { 
      maxid = i; 
      for (int j = i; j < listsize; j++) 
      { 
         //sprintf (str,"j = %d",j); 
         //WriteChatColor(str); 
         switch (opt) 
         { 
            case MELEE_DMG: 
               if (_meleedmg[j] > _meleedmg[maxid]) 
               { 
                  //sprintf (str,"%d-%d maxid = %d, anc: %d , %d>%d.",i,j,j,maxid,_meleedmg[j],_meleedmg[maxid]); 
                  //WriteChatColor(str);    
                  maxid = j; 
                  //sprintf (str,"maxid = %d",maxid); 
                  //WriteChatColor(str);    
               } 
               break; 
            case CAST_DMG: 
               if (_castdmg[j] > _castdmg[maxid]) 
                  maxid = j; 
               break; 
            case TOTAL_DMG: 
               if (_meleedmg[j] + _castdmg[j] > _meleedmg[maxid] + _castdmg[maxid]) 
                  maxid = j; 
               break; 
            case DPS: 
               if (_paramDps(j) > _paramDps(maxid)) 
               { 
                  //sprintf (str,"Switching %d with %d(m): %d>%d.",j,maxid,_paramDps(j),_paramDps(maxid)); 
                  //WriteChatColor(str); 
                  maxid = j; 
               } 
               break; 
         } 
      } 
      if (debug) DebugSpewAlways("SORT point 2"); 
       
      //Name 
      strcpy(max_name , _name); 
      strcpy(_name , _name[maxid]); 
      strcpy(_name[maxid] , max_name); 
      //Melee dmg 
      max_meleedmg = _meleedmg; 
      _meleedmg = _meleedmg[maxid]; 
      _meleedmg[maxid] = max_meleedmg; 
      //Cast dmg 
      max_castdmg = _castdmg; 
      _castdmg = _castdmg[maxid]; 
      _castdmg[maxid] = max_castdmg; 
      //TimeI 
      max_timeI = _timeI; 
      _timeI = _timeI[maxid]; 
      _timeI[maxid] = max_timeI; 
      //Isnpc 
      max_isnpc = _isnpc; 
      _isnpc = _isnpc[maxid]; 
      _isnpc[maxid] = max_isnpc; 
   } 
   if (debug) DebugSpewAlways("Leaving Sort"); 
} 
void ReadWindowINI(PCSIDLWND pWindow) 
{ 
   CHAR Buffer[MAX_STRING] = {0}; 
   pWindow->Location.top      = GetPrivateProfileInt("Settings","ChatTop",      357,INIFileName); 
   pWindow->Location.bottom   = GetPrivateProfileInt("Settings","ChatBottom",      620,INIFileName); 
   pWindow->Location.left      = GetPrivateProfileInt("Settings","ChatLeft",      164,INIFileName); 
   pWindow->Location.right    = GetPrivateProfileInt("Settings","ChatRight",      375,INIFileName); 
   pWindow->Locked             = GetPrivateProfileInt("Settings","Locked",         0,INIFileName); 
   pWindow->Fades             = GetPrivateProfileInt("Settings","Fades",         1,INIFileName); 
   pWindow->TimeMouseOver       = GetPrivateProfileInt("Settings","Delay",         2000,INIFileName); 
   pWindow->FadeDuration       = GetPrivateProfileInt("Settings","Duration",      500,INIFileName); 
   pWindow->Alpha            = GetPrivateProfileInt("Settings","Alpha",         255,INIFileName); 
   pWindow->FadeToAlpha      = GetPrivateProfileInt("Settings","FadeToAlpha",   255,INIFileName); 
   pWindow->BGType            = GetPrivateProfileInt("Settings","BGType",         1,INIFileName); 
   pWindow->BGColor.R         = GetPrivateProfileInt("Settings","BGTint.red",      255,INIFileName); 
   pWindow->BGColor.G         = GetPrivateProfileInt("Settings","BGTint.green",   255,INIFileName); 
   pWindow->BGColor.B         = GetPrivateProfileInt("Settings","BGTint.blue",   255,INIFileName); 

   GetPrivateProfileString("Settings","WindowTitle","DPS Window",Buffer,MAX_STRING,INIFileName); 
   SetCXStr(&pWindow->WindowText,Buffer); 
} 

void WriteWindowINI(PCSIDLWND pWindow) 
{ 
   CHAR szTemp[MAX_STRING] = {0}; 
   if (pWindow->Minimized) 
   { 
      WritePrivateProfileString("Settings","ChatTop",      itoa(pWindow->OldLocation.top,      szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatBottom",   itoa(pWindow->OldLocation.bottom,   szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatLeft",   itoa(pWindow->OldLocation.left,      szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatRight",   itoa(pWindow->OldLocation.right,   szTemp,10),INIFileName); 
   } 
   else 
   { 
      WritePrivateProfileString("Settings","ChatTop",      itoa(pWindow->Location.top,         szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatBottom",   itoa(pWindow->Location.bottom,      szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatLeft",   itoa(pWindow->Location.left,      szTemp,10),INIFileName); 
      WritePrivateProfileString("Settings","ChatRight",   itoa(pWindow->Location.right,      szTemp,10),INIFileName); 
   } 
   WritePrivateProfileString("Settings","Locked",      itoa(pWindow->Locked,         szTemp,10),INIFileName); 

   GetCXStr(pWindow->WindowText,szTemp); 
   WritePrivateProfileString("Settings","WindowTitle",                              szTemp,INIFileName); 

   WritePrivateProfileString("Settings","Fades",      itoa(pWindow->Fades,            szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","Delay",      itoa(pWindow->MouseOver,         szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","Duration",   itoa(pWindow->FadeDuration,         szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","Alpha",      itoa(pWindow->Alpha,            szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","FadeToAlpha",   itoa(pWindow->FadeToAlpha,         szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","BGType",      itoa(pWindow->BGType,            szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","BGTint.red",   itoa(pWindow->BGColor.R,         szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","BGTint.green",   itoa(pWindow->BGColor.G,      szTemp,10),INIFileName); 
   WritePrivateProfileString("Settings","BGTint.blue",   itoa(pWindow->BGColor.B,         szTemp,10),INIFileName); 
} 
/* 
int TimeArrayMaxArray(time_t a[], int size) 
{ 
   //char str[MAX_STRING); 
   if (size == -1) return -1; 

   //assert(size > 0);        // Note 1. 
   int minIndex = 0; 
    time_t maxVal = a[minIndex];     // Note 2. 
    for (int i=1; i<size; i++) { 
        if (a < a[minIndex]) { 
            minIndex = i; 
        } 
    } 
    return minIndex; 
} 
*/ 
void CmdDps(PSPAWNINFO pChar, PCHAR szLine) 
{ 
   char Arg1[MAX_STRING] = {0}; 
   char Arg2[MAX_STRING] = {0}; 
   char str[MAX_STRING] = "/0"; 
    
   GetArg(Arg1,szLine,1); 
   GetArg(Arg2,szLine,2); 
   //WriteChatColor(Arg2); 
    
   if (strlen(Arg1) == 0) 
   { 
      Usage(); 
   } 
   else 
   { 
      if (strcmp(Arg1,"on") == 0)   { 
         sprintf (str,"DPS PLUGIN: Dps is now ON"); 
         _ON = 1; 
         WriteChatColor(str,CONCOLOR_YELLOW); 
         //INI 
         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_ON); 
         WritePrivateProfileString("General Options","ON",(LPCSTR)val,INIFileName); 
      } 
      else if (strcmp(Arg1,"off") == 0) { 
         sprintf (str,"DPS PLUGIN: Dps is now OFF"); 
         _ON = 0; 
         WriteChatColor(str,CONCOLOR_YELLOW); 
         //INI 
         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_ON); 
         WritePrivateProfileString("General Options","ON",(LPCSTR)val,INIFileName); 
      } 
      else if (strcmp(Arg1,"reset") == 0) { 
         sprintf (str,"DPS PLUGIN: variables reset"); 
         ResetGV(); 
         WriteChatColor(str,CONCOLOR_YELLOW); 
      } 
      else if (strcmp(Arg1,"showwindow") == 0) { 
         if (MyWnd) 
            { 
               delete MyWnd; 
               MyWnd=0; 
            } 
          
         DebugTry(CScreenPieceTemplate *templ=pSidlMgr->FindScreenPieceTemplate("DpsWindow")); 
         if (templ) 
         MyWnd = new CDpsWnd; 
         ReadWindowINI((PCSIDLWND) MyWnd); 
      } 
      else if (strcmp(Arg1,"logonwindow") == 0) { 
         if (strcmp(Arg2,"true") == 0 || strcmp(Arg2,"TRUE") == 0 || strcmp(Arg2,"") == 0) { 
            _logonshowwindow = 1; 
            sprintf (str,"DPS PLUGIN: Displaying DPS Window at logon."); 
            WriteChatColor(str,CONCOLOR_YELLOW);} 
         else if (strcmp(Arg2,"false") == 0 || strcmp(Arg2,"FALSE") == 0) { 
            _logonshowwindow = 0; 
            sprintf (str,"DPS PLUGIN: No longer displaying DPS Window at logon."); 
            WriteChatColor(str,CONCOLOR_YELLOW);} 
         else { Usage(); } 
         //INI 
         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_logonshowwindow); 
         WritePrivateProfileString("Window","LogonShow",(LPCSTR)val,INIFileName); 
      } 
      else if (strcmp(Arg1,"sort") == 0) { 
         if (strcmp(Arg2,"melee") == 0 || strcmp(Arg2,"MELEE") == 0) { 
            _sort = MELEE_DMG; 
            sprintf (str,"DPS PLUGIN: Sorting by Melee dmg."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
         } 
         else if (strcmp(Arg2,"cast") == 0 || strcmp(Arg2,"CAST") == 0) { 
            _sort = CAST_DMG; 
            sprintf (str,"DPS PLUGIN: Sorting by Cast dmg."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
         } 
         else if (strcmp(Arg2,"total") == 0 || strcmp(Arg2,"TOTAL") == 0) { 
            _sort = TOTAL_DMG; 
            sprintf (str,"DPS PLUGIN: Sorting by Total dmg."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
         } 
         else if (strcmp(Arg2,"dps") == 0 || strcmp(Arg2,"DPS") == 0) { 
            _sort = DPS; 
            sprintf (str,"DPS PLUGIN: Sorting by dps."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
         } 
         else if (strcmp(Arg2,"none") == 0 || strcmp(Arg2,"NONE") == 0) { 
            _sort = NO_SORT; 
            sprintf (str,"DPS PLUGIN: Not sorting."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
         } 
         else { Usage(); } 

         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_sort); 
         WritePrivateProfileString("General Options","Sort",(LPCSTR)val,INIFileName); 
      } 
      else if (strcmp(Arg1,"petfollowowner") == 0) { 
         if (strcmp(Arg2,"true") == 0 || strcmp(Arg2,"TRUE") == 0 || strcmp(Arg2,"") == 0) { 
            _petowner = 1; 
            sprintf (str,"DPS PLUGIN: Pet'stats will follow owner."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         else if (strcmp(Arg2,"false") == 0 || strcmp(Arg2,"FALSE") == 0) { 
            _petowner = 0; 
            sprintf (str,"DPS PLUGIN: Pet'stats will not follow owner."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         else { Usage(); } 

         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_petowner); 
         WritePrivateProfileString("General Options","PetFollowOwner",(LPCSTR)val,INIFileName); 
      } 
      else if (strcmp(Arg1,"absolutedps") == 0) { 
         if (strcmp(Arg2,"true") == 0 || strcmp(Arg2,"TRUE") == 0 || strcmp(Arg2,"") == 0) { 
            _absdps = 1; 
            sprintf (str,"DPS PLUGIN: Absolute dps on."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         else if (strcmp(Arg2,"false") == 0 || strcmp(Arg2,"FALSE") == 0) { 
            _absdps = 0; 
            sprintf (str,"DPS PLUGIN: Absolute dps off."); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         else { Usage(); } 

         char val[MAX_STRING] = {0}; 
         sprintf (val,"%d",_absdps); 
         WritePrivateProfileString("General Options","AbsoluteDps",(LPCSTR)val,INIFileName); 
      } 
      // Focus 
      else if (strcmp(Arg1,"focus") == 0) { 
         if (strcmp(Arg2,"") == 0 || strcmp(Arg2,"MYTARGET") == 0) { 
            PSPAWNINFO psTarget = NULL; 
            if (ppTarget && pTarget) { 
            psTarget = (PSPAWNINFO)pTarget; 
            strcpy(strFocusName,psTarget->DisplayedName); 
            _focusdps = 1; 
            sprintf (str,"DPS PLUGIN: Focus on %s.",strFocusName); 
            } else { 
            sprintf(str, "DPS PLUGIN: Focus requires a name parameter or a current target!"); 
            } 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         else { 
            strcpy(strFocusName,Arg2); 
            _focusdps = 1; 
            sprintf (str,"DPS PLUGIN: Focus on %s.",strFocusName); 
            WriteChatColor(str,CONCOLOR_YELLOW); 
            } 
         //else { Usage(); } 

         //char val[MAX_STRING] = {0}; 
         //sprintf (val,"%d",_absdps); 
         //WritePrivateProfileString("General Options","AbsoluteDps",(LPCSTR)val,INIFileName); 
      } 
      else 
      { 
         Usage(); 
      } 
   } 
} 

void Usage(void) 
{ 
   char str[MAX_STRING] = {0}; 
   //sprintf (str,"Syntax: /dps (on|off|reset| petfollowowner[true,false] | logonwindow[true,false] | showwindow | sort[none,melee,cast,total,dps])"); 
   //WriteChatColor(str,CONCOLOR_RED); 
   WriteChatColor("Syntax: /dps option value, ex: /dps sort dps",USERCOLOR_DEFAULT); 
   WriteChatColor("   on|off|reset , activate dps parsing or not. reset parser",USERCOLOR_DEFAULT); 
   WriteChatColor("   petfollowowner[true,false], Pet's stats are displayed after owner's stats.",USERCOLOR_DEFAULT); 
   WriteChatColor("   logonwindow[true,false], Activate the window wehn u log on.",USERCOLOR_DEFAULT); 
   WriteChatColor("   showwindow[true,false], Make the window appear.",USERCOLOR_DEFAULT); 
   WriteChatColor("   sort[none,melee,cast,total,dps], Sort player's dps.",USERCOLOR_DEFAULT); 
   WriteChatColor("   absolutedps[true,false], Timers used for calculating player's dps is the same.",USERCOLOR_DEFAULT); 
} 

int _paramDps (int id) 
{ 
   if (_fight[id]) 
   { 
      int tmptime = 0; 
      char str[MAX_STRING] = "/0"; 
      strcpy(str, "\0"); 
      time_t t = 0; 

      time( &t ); 
      tmptime = t - _timeI[id]; 
    
      if (tmptime != 0) 
      { 
         return (_meleedmg[id] + _castdmg[id])/tmptime; 
      } 
   } 
   return -1; 
} 

BOOL dataDps(PCHAR szName, MQ2TYPEVAR &Ret) 
{ 
   if (szName != NULL) 
   { 
      int id = atoi(szName); 
      pDpsType->SetIndex (id); 
   } 
   Ret.DWord=1; 
   Ret.Type=pDpsType; 
   return true; 
}



MQ2DPS.h
Rich (BB code):
// MQ2Dps.h part of MQ2Dps plugin for MQ2 
// Author: Shire 

#include "time.h" 

void Event_Dot (char* line); 
void Event_Melee (char* line); 
void Event_OtherMeleeDmg(char* line); 
void Event_Cast (char* line); 
void Event_MobDead (char* line); 
void AddToList (char* name); 
void WriteStats(long i, bool pet); 
int IdInList (char* name); 
void ResetGV (void); 
void Sort (int opt); 
void Usage(void); 

int IntArrayMax(int a[], int size); 
void WriteWindowINI(PCSIDLWND pWindow); 
void ReadWindowINI(PCSIDLWND pWindow); 

// Functions 
char* GetPetNameFromCharName(char* Name); 
PSPAWNINFO GetPetFromCharName(char* Name); 
PSPAWNINFO GetCharFromPetName(char* Name); 
PSPAWNINFO GetMaster(DWORD PLAYERID); 
bool IsNpc(char* Name); 

// Commands 
void CmdDps(PSPAWNINFO pChar, PCHAR szLine); 
// DataType 
int _paramDps (int id); 
BOOL dataDps(PCHAR szName, MQ2TYPEVAR &Ret); 

// Defines 
#define MAX_CHARS 75 // Edit this if there is more than 50 people. 
#define debug 0 
#define ver "v0.9.95" 

#define NO_SORT      0 
#define MELEE_DMG   1 
#define CAST_DMG   2 
#define TOTAL_DMG   3 
#define DPS         4 

// Global variables 
bool fight = 0; 
char _name[MAX_CHARS][MAX_STRING]; 
long _meleedmg[MAX_CHARS]; 
long _castdmg[MAX_CHARS]; 
time_t _timeI[MAX_CHARS]; 
time_t _timeF[MAX_CHARS]; 
bool _fight[MAX_CHARS]; 
bool _isnpc [MAX_CHARS]; 
bool _written[MAX_CHARS]; 

long _mobtotaldmg = 0; 
long _mobtotalcast = 0; 

bool _ON = 1; 
int _playerid = -1; 
int _petid = -1; 
bool _logonshowwindow = 1; 
int _sort; 
bool _petowner; 
bool _absdps; 
bool _focusdps; 
char strFocusName[MAX_CHARS];

PetCharFnc.cpp
Rich (BB code):
// PetCharFnc.cpp 
// Author: Shire 

#include "../MQ2Plugin.h" 
#include "string.h" 

PSPAWNINFO GetMaster(DWORD PLAYERID) 
{ 
    PSPAWNINFO pSpawn = NULL; 
   char str[80] = {0}; 
    
    if (ppSpawnList && pSpawnList) { 
        pSpawn = (PSPAWNINFO)pSpawnList; 
    } 
    while (pSpawn) { 
      if ((pSpawn->SpawnID == PLAYERID) && (pSpawn->Type == SPAWN_PLAYER) && (pSpawn->Type != SPAWN_CORPSE)){ 
         return pSpawn; 
        } 
        pSpawn = pSpawn->pNext; 
    } 
    return NULL; 
} 

PSPAWNINFO GetCharFromPetName(char* Name) 
{ 
    PSPAWNINFO pSpawn = NULL; 
   char str[80] = {0}; 
   char tmp_str[80] = {0}; 
    
    if (ppSpawnList && pSpawnList) { 
        pSpawn = (PSPAWNINFO)pSpawnList; 
    } 
    while (pSpawn) { 
      strcpy(tmp_str,pSpawn->Name); 
      CleanupName(tmp_str,FALSE); 
         //sprintf (str,"%s,%s,%d",tmp_str, Name, strstr(tmp_str, Name) ); 
         //DebugSpewAlways(str); 
         //WriteChatColor(str); 
      if (strstr(tmp_str, "#") != NULL) strcpy(tmp_str,&tmp_str[1]); 
      if ((strcmp(tmp_str, Name) == 0) && (pSpawn->Type != SPAWN_PLAYER) && (pSpawn->Type != SPAWN_CORPSE)){ 
            //sprintf (str,"%s,%s,%d",tmp_str, Name, strstr(tmp_str, Name) ); 
         //DebugSpewAlways(str); 
         //WriteChatColor(str); 
         return GetMaster(pSpawn->MasterID); 
      } 
        pSpawn = pSpawn->pNext; 
    } 
    return NULL; 
} 

PSPAWNINFO GetPetFromCharName(char* Name) 
{ 
    PSPAWNINFO pSpawn = NULL; 

    if (ppSpawnList && pSpawnList) { 
        pSpawn = (PSPAWNINFO)pSpawnList; 
    } 
    while (pSpawn) { 
      if ((strcmp(pSpawn->Name, Name) == 0) && (pSpawn->Type == SPAWN_PLAYER) && (pSpawn->Type != SPAWN_CORPSE)){ 
         return (PSPAWNINFO)GetSpawnByID(pSpawn->pActorInfo->PetID); 
        } 
        pSpawn = pSpawn->pNext; 
    } 
    return NULL; 
} 

char* GetPetNameFromCharName(char* Name) 
{ 
    PSPAWNINFO pSpawn = NULL; 
   PSPAWNINFO pPet = NULL; 

    if (ppSpawnList && pSpawnList) { 
        pSpawn = (PSPAWNINFO)pSpawnList; 
    } 
    while (pSpawn) { 
      if ((strcmp(pSpawn->Name, Name) == 0) && (pSpawn->Type == SPAWN_PLAYER) && (pSpawn->Type != SPAWN_CORPSE)){ 
            pPet = (PSPAWNINFO)GetSpawnByID(pSpawn->pActorInfo->PetID); 
         return pPet->Name; 
        } 
        pSpawn = pSpawn->pNext; 
    } 
    return ""; 
} 

bool IsNpc(char* Name) 
{ 
   PSPAWNINFO pSpawn = NULL; 
   char str[80] = {0}; 
   char tmp_str[80] = {0}; 
   char tmp_Name[80] = {0}; 

    if (ppSpawnList && pSpawnList) { 
        pSpawn = (PSPAWNINFO)pSpawnList; 
    } 
    while (pSpawn) { 
      strcpy(tmp_str,pSpawn->Name); 
      CleanupName(tmp_str,FALSE); 
    
         //sprintf (str,"%s,%s,%d",tmp_str, Name, strstr(tmp_str, Name) ); 
         //DebugSpewAlways(str); 
         //WriteChatColor(str); 
      if (strstr(tmp_str, "#") != NULL) strcpy(tmp_str,&tmp_str[1]); 
      strcpy(tmp_Name,&Name[1]); 
      //sprintf (str,"%s,%s,%d",tmp_str, tmp_Name, strstr(tmp_str, tmp_Name) ); 
      //WriteChatColor(str); 
      if ( (strstr(tmp_str, tmp_Name) > 0) && (GetCharFromPetName(Name) == NULL) && (pSpawn->Type == SPAWN_NPC) && (pSpawn->Type != SPAWN_CORPSE) ){ 
            //sprintf (str,"%s,%s,%d %d",tmp_str, tmp_Name, strstr(tmp_str, tmp_Name),pSpawn->Type == SPAWN_NPC ); 
         //DebugSpewAlways(str); 
         //WriteChatColor(str); 
         return 1; 
      } 
        pSpawn = pSpawn->pNext; 
    } 
    return 0; 
}


MQUI_DpsWnd.xml
Rich (BB code):
<?xml version = "1.0"?> 
<XML ID = "EQInterfaceDefinitionLanguage"> 
   <Schema xmlns = "EverQuestData" xmlns:dt = "EverQuestDataTypes"/> 

   <Button item = "DPS_ON"> 
       <ScreenID>DPSButtonON</ScreenID> 
       <Font>1</Font> 
       <RelativePosition>true</RelativePosition> 
       <Location> 
         <X>10</X> 
         <Y>5</Y> 
       </Location> 
       <Size> 
         <CX>40</CX> 
         <CY>20</CY> 
       </Size> 
       <Style_Transparent>false</Style_Transparent> 
       <!--<TooltipReference/>--> 
       <Style_Checkbox>false</Style_Checkbox> 
       <!--<RadioGroup/>--> 
       <Text>ON</Text> 
       <TextColor> 
         <R>255</R> 
         <G>255</G> 
         <B>255</B> 
       </TextColor> 
      <ButtonDrawTemplate> 
         <Normal>A_BtnNormal</Normal> 
         <Pressed>A_BtnPressed</Pressed> 
         <Flyby>A_BtnFlyby</Flyby> 
         <Disabled>A_BtnDisabled</Disabled> 
         <PressedFlyby>A_BtnPressedFlyby</PressedFlyby> 
      </ButtonDrawTemplate> 
   </Button> 

   <Button item = "DPS_OFF"> 
       <ScreenID>DPSButtonOFF</ScreenID> 
       <Font>1</Font> 
       <RelativePosition>true</RelativePosition> 
       <Location> 
         <X>55</X> 
         <Y>5</Y> 
       </Location> 
       <Size> 
         <CX>40</CX> 
         <CY>20</CY> 
       </Size> 
       <Style_Transparent>false</Style_Transparent> 
       <!--<TooltipReference/>--> 
       <Style_Checkbox>false</Style_Checkbox> 
       <!--<RadioGroup/>--> 
       <Text>OFF</Text> 
       <TextColor> 
         <R>255</R> 
         <G>255</G> 
         <B>255</B> 
       </TextColor> 
      <ButtonDrawTemplate> 
         <Normal>A_BtnNormal</Normal> 
         <Pressed>A_BtnPressed</Pressed> 
         <Flyby>A_BtnFlyby</Flyby> 
         <Disabled>A_BtnDisabled</Disabled> 
         <PressedFlyby>A_BtnPressedFlyby</PressedFlyby> 
      </ButtonDrawTemplate> 
   </Button> 

   <Button item = "DPS_RESET"> 
       <ScreenID>DPSButtonRESET</ScreenID> 
       <Font>1</Font> 
       <RelativePosition>true</RelativePosition> 
       <Location> 
         <X>100</X> 
         <Y>5</Y> 
       </Location> 
       <Size> 
         <CX>55</CX> 
         <CY>20</CY> 
       </Size> 
       <Style_Transparent>false</Style_Transparent> 
       <!--<TooltipReference/>--> 
       <Style_Checkbox>false</Style_Checkbox> 
       <!--<RadioGroup/>--> 
       <Text>Reset</Text> 
       <TextColor> 
         <R>255</R> 
         <G>255</G> 
         <B>255</B> 
       </TextColor> 
      <ButtonDrawTemplate> 
         <Normal>A_BtnNormal</Normal> 
         <Pressed>A_BtnPressed</Pressed> 
         <Flyby>A_BtnFlyby</Flyby> 
         <Disabled>A_BtnDisabled</Disabled> 
         <PressedFlyby>A_BtnPressedFlyby</PressedFlyby> 
      </ButtonDrawTemplate> 
   </Button> 

   <Button item = "DPS_CloseButton"> 
      <ScreenID>CloseButton</ScreenID> 
      <!--<Font>3</Font>--> 
      <RelativePosition>true</RelativePosition> 
      <AutoStretch>false</AutoStretch> 
          <Location> 
            <X>160</X> 
            <Y>5</Y> 
          </Location> 
          <Size> 
            <CX>50</CX> 
            <CY>20</CY> 
          </Size> 
      <!--<ToolDPSReference/>--> 
      <Style_Checkbox>false</Style_Checkbox> 
      <Text>Close</Text> 
      <TextColor> 
            <R>255</R> 
            <G>255</G> 
            <B>255</B> 
      </TextColor> 
      <ButtonDrawTemplate> 
         <Normal>A_BtnNormal</Normal> 
         <Pressed>A_BtnPressed</Pressed> 
         <Flyby>A_BtnFlyby</Flyby> 
         <Disabled>A_BtnDisabled</Disabled> 
         <PressedFlyby>A_BtnPressedFlyby</PressedFlyby> 
      </ButtonDrawTemplate> 
   </Button> 

   <!-- Label Version --> 
   <Label item="DPS_CHA"> 
     <ScreenID>CHALabel</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps.Version}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>215</X> 
     <Y>5</Y> 
    </Location> 
    <Size> 
     <CX>100</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label Player dps --> 
   <Label item="DPS_PLAYERDPSLabel"> 
     <ScreenID>DPS_DPSPlayerLabel</ScreenID> 
     <!-- <Font>3</Font> --> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>255</X> 
     <Y>20</Y> 
    </Location> 
    <Size> 
     <CX>100</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>Char</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
    
   <!-- Label Player dps --> 
   <Label item="DPS_PLAYERDPS"> 
     <ScreenID>DPS_DPSPlayer</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps.Me}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>255</X> 
     <Y>34</Y> 
    </Location> 
    <Size> 
     <CX>100</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label Pet dps --> 
   <Label item="DPS_PETDPSLabel"> 
     <ScreenID>DPS_DPSPetLabel</ScreenID> 
     <!-- <Font>3</Font> --> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>255</X> 
     <Y>55</Y> 
    </Location> 
    <Size> 
     <CX>100</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>Pet</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
    
   <!-- Label Pet dps --> 
   <Label item="DPS_PETDPS"> 
     <ScreenID>DPS_DPSPet</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps.MyPet}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>255</X> 
     <Y>69</Y> 
    </Location> 
    <Size> 
     <CX>100</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 1, name --> 
   <Label item="DPSLabelDPS1"> 
     <ScreenID>LabelDPSDPS1</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[0].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>10</X> 
     <Y>30</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 1, dps--> 
   <Label item="DPSLabelNAME1"> 
     <ScreenID>LabelDPSDPS1</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps.Dps[0]}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>100</X> 
     <Y>30</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 2, name --> 
   <Label item="DPSLabelDPS2"> 
     <ScreenID>LabelDPSDPS2</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[1].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>10</X> 
     <Y>44</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 2, dps--> 
   <Label item="DPSLabelNAME2"> 
     <ScreenID>LabelDPSDPS2</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[1].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>100</X> 
     <Y>44</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 3, name --> 
   <Label item="DPSLabelDPS3"> 
     <ScreenID>LabelDPSDPS3</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[2].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>10</X> 
     <Y>58</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 3, dps--> 
   <Label item="DPSLabelNAME3"> 
     <ScreenID>LabelDPSDPS3</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[2].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>100</X> 
     <Y>58</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 4, name --> 
   <Label item="DPSLabelDPS4"> 
     <ScreenID>LabelDPSDPS4</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[3].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>10</X> 
     <Y>72</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 4, dps--> 
   <Label item="DPSLabelNAME4"> 
     <ScreenID>LabelDPSDPS4</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[3].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>100</X> 
     <Y>72</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 5, name --> 
   <Label item="DPSLabelDPS5"> 
     <ScreenID>LabelDPSDPS5</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[4].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>130</X> 
     <Y>30</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 5, dps--> 
   <Label item="DPSLabelNAME5"> 
     <ScreenID>LabelDPSDPS5</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[4].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>220</X> 
     <Y>30</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 6, name --> 
   <Label item="DPSLabelDPS6"> 
     <ScreenID>LabelDPSDPS6</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[5].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>130</X> 
     <Y>44</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 6, dps--> 
   <Label item="DPSLabelNAME6"> 
     <ScreenID>LabelDPSDPS6</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[5].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>220</X> 
     <Y>44</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 7, name --> 
   <Label item="DPSLabelDPS7"> 
     <ScreenID>LabelDPSDPS7</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[6].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>130</X> 
     <Y>58</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 7, dps--> 
   <Label item="DPSLabelNAME7"> 
     <ScreenID>LabelDPSDPS7</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[6].Dps}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>220</X> 
     <Y>58</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <!-- Label 8, name --> 
   <Label item="DPSLabelDPS8"> 
     <ScreenID>LabelDPSDPS8</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[7].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>130</X> 
     <Y>72</Y> 
    </Location> 
    <Size> 
     <CX>85</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 
   <!-- Label 8, dps--> 
   <Label item="DPSLabelNAME8"> 
     <ScreenID>LabelDPSDPS8</ScreenID> 
     <!-- <Font>3</Font> --> 
     <EQType>9999</EQType> 
           <TooltipReference>${Dps[7].Name}</TooltipReference> 
     <RelativePosition>true</RelativePosition> 
    <Location> 
     <X>220</X> 
     <Y>72</Y> 
    </Location> 
    <Size> 
     <CX>150</CX> 
     <CY>14</CY> 
    </Size> 
     <Text>100</Text> 
    <TextColor> 
     <R>255</R> 
     <G>255</G> 
     <B>255</B> 
    </TextColor> 
     <NoWrap>true</NoWrap> 
     <AlignCenter>false</AlignCenter> 
     <AlignRight>false</AlignRight> 
   </Label> 

   <Screen item = "DpsWindow"> 
      <!--<ScreenID/>--> 
      <RelativePosition>false</RelativePosition> 
      <Location> 
         <X>280</X> 
         <Y>0</Y> 
      </Location> 
      <Size> 
         <CX>280</CX> 
         <CY>130</CY> 
      </Size> 
      <Text>DPS Window</Text> 
      <Style_VScroll>false</Style_VScroll> 
      <Style_HScroll>false</Style_HScroll> 
      <Style_Transparent>false</Style_Transparent> 
      <!--<ToolDPSReference/>--> 
      <DrawTemplate>WDT_Def</DrawTemplate> 
      <Style_Titlebar>true</Style_Titlebar> 
      <Style_Closebox>true</Style_Closebox> 
      <Style_Minimizebox>true</Style_Minimizebox> 
      <Style_Border>true</Style_Border> 
      <Style_Sizable>true</Style_Sizable> 
      <Pieces>DPS_CloseButton</Pieces> 
      <Pieces>DPS_ON</Pieces> 
      <Pieces>DPS_OFF</Pieces> 
      <Pieces>DPS_RESET</Pieces> 
      <Pieces>DPS_CHA</Pieces> 
      <Pieces>DPS_PLAYERDPS</Pieces> 
      <Pieces>DPS_PLAYERDPSLabel</Pieces> 
      <Pieces>DPS_PETDPS</Pieces> 
      <Pieces>DPS_PETDPSLabel</Pieces> 
      <Pieces>DPSLabelDPS1</Pieces> 
      <Pieces>DPSLabelNAME1</Pieces> 
      <Pieces>DPSLabelDPS2</Pieces> 
      <Pieces>DPSLabelNAME2</Pieces> 
      <Pieces>DPSLabelDPS3</Pieces> 
      <Pieces>DPSLabelNAME3</Pieces> 
      <Pieces>DPSLabelDPS4</Pieces> 
      <Pieces>DPSLabelNAME4</Pieces> 
      <Pieces>DPSLabelDPS5</Pieces> 
      <Pieces>DPSLabelNAME5</Pieces> 
      <Pieces>DPSLabelDPS6</Pieces> 
      <Pieces>DPSLabelNAME6</Pieces> 
      <Pieces>DPSLabelDPS7</Pieces> 
      <Pieces>DPSLabelNAME7</Pieces> 
      <Pieces>DPSLabelDPS8</Pieces> 
      <Pieces>DPSLabelNAME8</Pieces> 
   </Screen> 

</XML>
 
EMU MQ2DPS

Users who are viewing this thread

Back
Top
Cart