MQ2ClickMaint v1.20

thez

Rhymes well with Pez
Joined
Oct 25, 2006
Messages
966
Reaction score
0
Points
0
Location
Santa Cruz
I just want to start this off with a huge "Thank You" to Sadge, Hawthorne, Jobey, and most especially Nightmare327 for helping with the testing of this plugin. Without their help, this would never have gotten done.

***Information***

MQ2ClickMaint is a plugin intended to replace the casting part of maintaining clickies. By tracking the wear-off messages paired with the item to recast a buff, it stores which of your items need to be recast. To monitor this, the ${CMaint} TLO is a boolean that returns true if you have buffs needing to be done, and false if not. I repeat, this plugin does *NOT* automatically maintain buffs. In my opinion, coding that into a plugin to cover every situation would be impossible. As such, the intent is that you can use a macro and the ${CMaint} TLO to activate the command when you want to, or activate it on your own to take the place of a "myclicks.mac" type macro that just refreshes your buffs.

***Specific Usage***

--To use MQ2CM, you must set up an INI as specified below. If you need help with this, either I or someone else can surely do so...hopefully some of the testers will be willing to post their own INI files as examples.

-/doclicks
-"/doclicks" - immediately cast every item waiting to be cast. Will not work if you are invis.
-"/doclicks rez" - if you have been rezzed and want an instant-clicky to be in your first slot, this is the command for you. Enter it right after you have been rezzed to cast every item but myItem0. Once the RezEffect slot is gone, simply "/doclicks" to cast the remaining buff and have it land in your first slot!
-"/doclicks all" - Cast all items, regardless of which items need to be done. This is also useful for casting items that have no wear-off message. The most effective use is to put a shrink rod in the INI with no wear-off message, then add it to your personal list twice. This will cause the wand never to cast itself except when you do /doclicks all.

-/citem
-On entering this command to start adding an item:
-Now entering 'add' sequence. The next 10 lines of chat will be saved and echoed back to you as they come.
-Once you see the line that is the wear off msg for your item, /citem #, where # is the line number next to it.

-Once you have done this, the plugin will echo the next 10 lines of chat that it sees, with numbers in front of them. To pick the one that corresponds with the correct wear-off msg for your item, first place the item you wish to cast for that buff on your cursor, then:
-"/citem #", where # is replaced with the correct number from the list.

-If the correct message is not found (adding an item in PoK might be difficult, for example), then:
-"/citem no", which will start the plugin over on reading the next 10 messages.

-/cmaint:
/cmaint -> displays this list
/cmaint help -> Displays this list, and explains how to use the commands.
/cmaint list -> Lists all items defined in INI
/cmaint me -> Lists all of the items plugin is tracking for your character.
/cmaint add #|FileItem# -> Add Item<#> from INI to your character's list. Ex: 'add FileItem5' or 'add 5'
/cmaint remove #-> Remove Item<#> from your character's list. Ex: 'remove myItem0'
/cmaint reload -> Reload items in the INI without having to reload the plugin.

***Summary***
-Plugin does *not* automatically click your buffs.
-TLO ${CMaint} -- Returns TRUE if you have buffs waiting to be done
-"/doclicks" will do all of the buffs you have waiting to be done.
-"/doclicks rez" will do all of your buffs but myItem0, in order to allow you to have an instant click to be set in your first slot after a rez.
-"/doclicks all" will refresh all of your buffs
-"/cmaint" allows users to tweak settings with the plugin, and adjust which items from the INI are included in their list to maintain.
-"/cmaint help" for a list of commands for /cmaint and explanations.
-"/citem" allows users to add items to the INI from ingame. Once the message has been saved, put the item you want to click on your cursor, then "/citem #" to specify which msg you want. If the msg did not show up, "/citem no" to the msg-searching over.

***INI setup***

The INI (MQ2ClickMaint.ini) must be structured as follows:
Code:
             [INI Info]
             TotalItems=
             [Server_PlayerName]
             NumItems=
             myItem0=FileItem0
             myItem1=FileItem5
             myItem2=FileItem22
             ...
             [FileItem0]
             ItemName=
             BuffOffMsg=
             [FileItem1]
             ...

-The [INI Info] section's "Total Items" entry must always be up to date. You can have a MAXIMUM of 50 items stored in the INI. Remember, your total number of items is NOT the highest FileItem# that you have...it is that number +1, since the counting starts at 0.
-You can have information for as many players as you want in the INI.
-Make sure the the NumItems entry is always accurate. Remember, your total number of items is NOT the highest myItem# that you have...it is that number +1, since the counting starts at 0.
 
Last edited:
Code:
/**********************************************
@thez
--Thanks for this plugin go to Nightmare357, Sadge, Hawthorne, and Jobey from MMOBugs for testing.
--This plugin is intended for use only by MMOBugs premium subscribers. I trust the members here to keep it here.

***Summary***
-Plugin does *not* automatically click your buffs.
-TLO ${CMaint} -- Returns TRUE if you have buffs waiting to be done
-"/doclicks" will do all of the buffs you have waiting to be done.
-"/doclicks rez" will do all of your buffs but myItem0, in order to allow you to have an instant click to be set in your first slot after a rez.
-"/doclicks all" will refresh all of your buffs
-"/cmaint" allows users to tweak settings with the plugin, and adjust which items from the INI are included in their list to maintain.
-"/cmaint help" for a list of commands for /cmaint and explanations.
-"/citem" allows users to add items to the INI from ingame. Once the message has been saved, put the item you want to click on your cursor, then "/citem #" to specify which msg you want. If the msg did not show up, "/citem no" to the msg-searching over.


The INI (MQ2ClickMaint.ini) must be structured as follows:
             [INI Info]
             TotalItems=
             [Server_PlayerName]
             NumItems=
             myItem0=FileItem0
             myItem1=FileItem5
             myItem2=FileItem22
             ...
             [FileItem0]
             ItemName=
             BuffOffMsg=
             [FileItem1]
             ...

To add an item to be usable, you must create an entry. Each item must follow the others...ie, don't have an item9 come after item3. Every time you add a new item, update the total number of items in the INI at the top of the file. To facilitate doing stuff ingame, you need only add item entries in the INI -- the plugin itself can reload the INI when needed with the "reload" option for /cmaint, as well as "add" or "remove" items for your character, as well as "list"-ing all of the items in the INI that are available to watch.


MQ2ClickMaint is intended to be a plugin answer to the problem of maintaining clickies via macro.
It does *not* automatically click your buffs. Instead, it tells you via TLO when you have buffs waiting,
then allows you to enter the command. This is because to code a plugin that would work in all situations
would be damned near impossible. This is the compromise.

**********************************************/
#include "../MQ2Plugin.h"
#define CMVERSION 1.20

PreSetup("MQ2ClickMaint");
PLUGIN_VERSION(CMVERSION);

bool DEBUG = 1;
const int MAX_ITEMS = 50;

typedef struct {
    char iNom[MAX_STRING];
    char spMsg[MAX_STRING];
} cmItem;

//Prototypes
void DoClicks(PSPAWNINFO pCHAR, PCHAR zLine);
void getINI();
//End prototypes

int itor = 0;
int lastitor = 0;
int NumItems = 0;
int sLcount = 0;
int TotalItems = 0;
int delay = 0;
bool initialINI = false;
bool haveClicks = false;
bool doClicks = false;
bool DoThese[MAX_ITEMS];
bool confirmLine = false;
bool watchLine = false;
cmItem Data[MAX_ITEMS];
char charPath[MAX_STRING];
char szCommand[MAX_STRING];
char savedLines[10][MAX_STRING];


void getINI() {
      sprintf(INIFileName,"%s\\MQ2ClickMaint.ini",gszINIPath);
      sprintf(charPath,"%s_%s",EQADDR_SERVERNAME,GetCharInfo()->Name);
      NumItems = GetPrivateProfileInt(charPath,"NumItems",0,INIFileName);
      TotalItems = GetPrivateProfileInt("INI Info","TotalItems" ,0,INIFileName);
      if(DEBUG) {
        DebugSpewAlways("Entering getINI itorLoop");
        WriteChatf("Loop is %d items long",NumItems);
      }
      for(itor = 0; itor < NumItems; ++itor) {
        char tmp[MAX_STRING];
        char itemNum[MAX_STRING];

        sprintf(itemNum,"myItem%d",itor);
        if(DEBUG) WriteChatf("%s",itemNum);
        GetPrivateProfileString(charPath,itemNum,"",tmp,MAX_STRING,INIFileName);
        if(DEBUG) WriteChatf("tmp: %s",tmp);
        GetPrivateProfileString(tmp,"ItemName","",Data[itor].iNom,MAX_STRING,INIFileName);
        if(DEBUG) WriteChatf("Name of (%d): %s",itor,Data[itor].iNom);
        GetPrivateProfileString(tmp,"BuffOffMsg","",Data[itor].spMsg,MAX_STRING,INIFileName);
        if(DEBUG) WriteChatf("<MQ2ClickMaint>:: Item number %d iNom (%s) and spMsg(%s) set!\n",itor,Data[itor].iNom,Data[itor].spMsg);
      }
}

void DoClicks(PSPAWNINFO pCHAR, PCHAR zLine) {
    char Parm1[MAX_STRING];
    GetArg(Parm1,zLine,1);
    if(!stricmp("all",Parm1)){
        for(itor = 0; itor < NumItems && itor < MAX_ITEMS; ++itor) DoThese[itor] = true;
        lastitor = 0;
    }
    if(!stricmp("rez",Parm1)){
        for(itor = 1; itor < NumItems && itor < MAX_ITEMS; ++itor) DoThese[itor] = true;
        lastitor = 1;
    }
    doClicks = true;
    delay = 50;
}

void CMaintCmd(PSPAWNINFO pCHAR, PCHAR zLine) {
  bool ShowInfo=false;
  bool NeedHelp=false;
  char Parm1[MAX_STRING];
  char Parm2[MAX_STRING];
  char tmp[MAX_STRING];
  char tmp2[MAX_STRING];
  sprintf(charPath,"%s_%s",EQADDR_SERVERNAME,GetCharInfo()->Name);
  GetArg(Parm1,zLine,1);
  GetArg(Parm2,zLine,2);

  if(!stricmp("help",Parm1) || !stricmp("",Parm1)) {
     WriteChatColor("Usage:");
     WriteChatColor("/cmaint -> displays this list");
     WriteChatColor("/cmaint help -> Displays this list, and explains how to use the commands.");
     WriteChatColor("/cmaint list -> Lists all items defined in INI");
     WriteChatColor("/cmaint me -> Lists all of the items plugin is tracking for your character.");
     WriteChatColor("/cmaint add #|FileItem# -> Add Item<#> from INI to your character's list. Ex: 'add FileItem5' or 'add 5'");
     WriteChatColor("/cmaint remove #-> Remove Item<#> from your character's list. Ex: 'remove myItem0'");
     WriteChatColor("/cmaint reload -> Reload items in the INI without having to reload the plugin.");

  }
  if(!stricmp("help",Parm1)) {
     WriteChatColor("Items MUST be in the INI already for you to add them with this command.");
     WriteChatColor("Once an item has been added to the INI, it can be added to your personal list.");
     WriteChatColor("This can be done by creating a new entry in the INI itself, or by using the 'add' option.");
     WriteChatColor("Items can also be removed from your character's list by using the 'remove' option.");
     WriteChatColor("When manually adding items, the 'TotalItems' entry in the [INI Info] section MUST be kept up to date");
     WriteChatColor("Please be careful to add in the correct number of spaces everywhere -- not too many, and not too few.");
  }
  else if(!stricmp("list",Parm1)) {// ALL items in ini
     if(DEBUG) WriteChatf("Total items = %d",TotalItems);
     for(itor = 0; itor < TotalItems; ++itor) {
        sprintf(tmp,"FileItem%d",itor);
        GetPrivateProfileString(tmp,"ItemName","",tmp2,MAX_STRING,INIFileName);
        WriteChatf("FileItem%d: %s\n",itor,tmp2);
     }
  } else if(!stricmp("me",Parm1)) {
     WriteChatColor("Your current items:");
     for(itor = 0; itor < NumItems; ++itor) WriteChatf("%s\n",Data[itor].iNom);
  } else if(!stricmp("add",Parm1)) {
     sprintf(tmp,"myItem%d",NumItems);
     if(IsNumber(Parm2))sprintf(tmp2,"FileItem%d",atoi(Parm2));
     else strcpy(tmp2,Parm2);
     char NIUp[32];
     ++NumItems;
     wsprintf(NIUp,"%d",NumItems);
     WritePrivateProfileString(charPath,tmp,tmp2,INIFileName);
     WritePrivateProfileString(charPath,"NumItems",NIUp,INIFileName);
     getINI();
  } else if(!stricmp("remove",Parm1)) {
     if(NumItems <= 0) {
        WriteChatf("You have no more items left in your INI list!\n");
        return;
     }
     int finder = atoi(Parm2);
     char NIUp[32];
     char curr[MAX_STRING];
     char next[MAX_STRING];
     char temp[MAX_STRING];
     sprintf(curr,"myItem%d",finder);
     sprintf(tmp,"myItem%d",NumItems-1);    //added this to remember the last item in the ini file from the beginning
     if(DEBUG) WriteChatf("Starting at %s",curr);
     while(finder < NumItems-1) {
        finder++;
        sprintf(next,"myItem%d",finder);
        GetPrivateProfileString(charPath,next,"",temp,MAX_STRING,INIFileName);
        WritePrivateProfileString(charPath,curr,temp,INIFileName);
        if(DEBUG) WriteChatf("Shifting %s (%s) to %s",next,temp,curr);
        sprintf(curr,"myItem%d",finder);
     }
     --NumItems;
     sprintf(temp,"myItem%d",NumItems);
     sprintf(NIUp,"%d",NumItems);
     WritePrivateProfileString(charPath,tmp,NULL,INIFileName);  //Removing the very last item from the list
     WritePrivateProfileString(charPath,"NumItems",NIUp,INIFileName);
     getINI();
  } else if(!stricmp("reload",Parm1)) getINI();
}


BOOL CMaint(PCHAR szIndex, MQ2TYPEVAR &Ret){
   Ret.DWord=haveClicks;
   Ret.Type=pBoolType;
   return true;
}

void CAddItem(PSPAWNINFO pCHAR, PCHAR zLine) {
  char Parm1[MAX_STRING];
  char FileItemNum[MAX_STRING];
  char FileItemNumNext[MAX_STRING];
  GetArg(Parm1,zLine,1);
  sprintf(charPath,"%s_%s",EQADDR_SERVERNAME,GetCharInfo()->Name);
  //int TotalItems = GetPrivateProfileInt("INI Info","TotalItems" ,0,INIFileName);

  if(confirmLine) {
    if(!strcmp(Parm1,"no")) sLcount = 0;
    if(IsNumber(Parm1)) {
        if(atoi(Parm1) > 9) {
            WriteChatf("Invalid choice: %d",atoi(Parm1));
            return;
        }
        if(DEBUG){
            WriteChatf("GetCharInfo2()->Cursor is %s",GetCharInfo2()->Cursor->Item->Name);
            WriteChatf("Creating new item: %s with msg: %s",GetCharInfo2()->Cursor->Item->Name,savedLines[atoi(Parm1)]);
        }
        sprintf(FileItemNum,"FileItem%d",TotalItems);
        sprintf(FileItemNumNext,"%d",TotalItems+1);
        WritePrivateProfileString(FileItemNum,"ItemName",GetCharInfo2()->Cursor->Item->Name,INIFileName);
        WritePrivateProfileString(FileItemNum,"BuffOffMsg",savedLines[atoi(Parm1)],INIFileName);
        WritePrivateProfileString("INI Info","TotalItems",FileItemNumNext,INIFileName);
        confirmLine = false;
        sLcount = 0;
        watchLine = false;
        getINI();
    }
    return;
  } else {
    WriteChatf("Now entering 'add' sequence. The next 10 lines of chat will be saved and echoed back to you as they come.");
    WriteChatf("Once you see the line that is the wear off msg for your item, /citem #, where # is the line number next to it.");
    watchLine = true;
  }
}

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
    DebugSpewAlways("Initializing MQ2ClickMaint");
    WriteChatf("MQ2ClickMaint, written by \agthez\ax for MMOBugs!");
    AddCommand("/cmaint",CMaintCmd);
    AddCommand("/doclicks",DoClicks);
    AddCommand("/citem",CAddItem);
    AddMQ2Data("CMaint",CMaint);
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
    DebugSpewAlways("Shutting down MQ2ClickMaint");
    RemoveCommand("/cmaint");
    RemoveCommand("/doclicks");
    RemoveCommand("/citem");
    RemoveMQ2Data("CMaint");
}

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

// This is called every time MQ pulses
PLUGIN_API VOID OnPulse(VOID){
    if(doClicks && delay >= 50 && !(pCastingWnd && (PCSIDLWND)pCastingWnd->Show)){
        for(itor = lastitor; itor < NumItems && itor < MAX_ITEMS; ++itor) {
            if(GetCharInfo()->pSpawn->CastingSpellID != -1)break;
            if(DoThese[itor] && itor < NumItems) {
                sprintf(szCommand,"/casting \"%s|item\" -invis -maxtries|2",Data[itor].iNom);
                if(DEBUG) WriteChatf("Executing command: %s\n",szCommand);
                DoCommand(GetCharInfo()->pSpawn,szCommand);
                DoThese[itor] = false;
                lastitor = ++itor;
                delay = 0;
                break;
            } else if(itor>=NumItems) DoThese[itor] = false;
        }
        if(itor>=NumItems) {
            lastitor = 0;
            doClicks = false;
            haveClicks = false;
        }
    } else if(doClicks && delay <= 50 && !(pCastingWnd && (PCSIDLWND)pCastingWnd->Show)) delay++;
}

PLUGIN_API DWORD OnIncomingChat(PCHAR Line, DWORD Color){
    //DebugSpewAlways("MQ2ClickMaint::OnIncomingChat(%s)",Line);
    if(watchLine && sLcount < 10) {
        sprintf(savedLines[sLcount],Line);
        WriteChatf("(\ag%d\ax): %s",sLcount,savedLines[sLcount]);
        if(!confirmLine) confirmLine = true;
        sLcount++;
    }
    for(itor = 0; itor < NumItems; ++itor) {
        if(strstr(Line,Data[itor].spMsg) && abs(strcmp(Data[itor].spMsg,""))) {
            haveClicks = true;
            DoThese[itor] = true;
            if(DEBUG) WriteChatf("Noticed that %s wore off. ",Data[itor].iNom);
        }
    }
    return 0;
}
 
Last edited:
Kind of sucks there's a patch tomorrow so no one will get to play with it for very long, but with your permission thez, here's a compiled copy of your code:
 

Attachments

  • MQ2ClickMaint.dll
    117 KB · Views: 29
Oh, yeah...definitely, please do post DLLs. I'm not compiling it on my own, heh.
 
This looks like an awesome plugin. I have a bunch of clickies that only last for about 30-45 mins, and it's a pita to have to remember to refresh them all the time. I'm definitely going to play around with this after things get settled down from the patch.

Thanks for the awesome plugin Thez and everybody else who put in their time and effort into making this plugin avilable to us.
 
Heres a couple of macros and a sample ini file I have come up with, just as a kinda starter for people, once the compile comes back up.

MQ2Clickmaint.ini
Code:
[INI Info]
TotalItems=22
[FileItem0]
ItemName = Fabled Shrunken Goblin Skull Earring
BuffOffMsg = The rage subsides.
[FileItem1]
ItemName = Fabled Pegasus Feather Cloak
BuffOffMsg = You can no longer levitate.
[FileItem2]
ItemName = Ring of the Beast
BuffOffMsg = Your endurance fades.
[FileItem3]
ItemName = Dark Void Shoulders
BuffOffMsg = Your protection fades.
[FileItem4]
ItemName = Shawl of Eternal Forces
BuffOffMsg = Your thoughts become less methodical.
[FileItem5]
ItemName = Celestial Cloak
BuffOffMsg = The heightened focus ends.
[FileItem6]
ItemName = Prismatic Ring of Resistance
BuffOffMsg = Your ward fades.
[FileItem7]
ItemName = Spiked Bracelet of the Betrayer
BuffOffMsg = Your endurance fades.
[FileItem8]
ItemName = Ornate Mask of Fallen Dreams
BuffOffMsg = The illusionary spikes fade away.
[FileItem9]
ItemName = Ring of Resistance
BuffOffMsg = Your soul energy fades.
[FileItem10]
ItemName = Silver Hoop of Speed
BuffOffMsg = Your primal guard fades.
[FileItem11]
ItemName = Serrated Dart of Energy
BuffOffMsg = The savage spirits depart.
[FileItem12]
ItemName = Earring of Pain Deliverance
BuffOffMsg =
[FileItem13]
ItemName = Skull of Vishimtar
BuffOffMsg =
[FileItem14]
ItemName = Jaundiced Bone Breastplate
BuffOffMsg =
[FileItem15]
ItemName = Crimson Ring of Judgment
BuffOffMsg =
[FileItem16]
ItemName = Crystallized Serpent Eye
BuffOffMsg = The brambles fall away.
[FileItem17]
ItemName = Silver Skin Gauntlets
BuffOffMsg = The silvery hue fades.
[FileItem18]
ItemName = Fractured Werewolf Jawbone
BuffOffMsg = The red runes drift away.
[FileItem19]
ItemName = Wand of Imperceptibility
BuffOffMsg = 
[FileItem20]
ItemName = Chaos-Imbued Leather Leggings
BuffOffMsg = The heightened focus ends.
[sn_ch1]
NumItems=5
myItem0=FileItem0
myItem1=FileItem1
myItem2=FileItem2
myItem3=FileItem3
myItem4=FileItem4
[sn_ch2]
NumItems=4
myItem0=FileItem5
myItem1=FileItem6
myItem2=FileItem7
myItem3=FileItem8
[sn_ch3]
NumItems=5
myItem0=FileItem6
myItem1=FileItem8
myItem2=FileItem9
myItem3=FileItem10
myItem4=FileItem11
[server_character]
NumItems=3
myItem0=FileItem2
myItem1=FileItem0
myItem2=FileItem6
[server_character]
myItem0=FileItem0
NumItems=3
myItem1=FileItem19
myItem2=FileItem20
myItem3=FileItem20
myItem4=FileItem7
[server_char]
NumItems=3
myItem0=FileItem0
myItem1=FileItem3
myItem2=FileItem20


rezclickies.mac
Code:
|
|	rezclickies.mac 	to cast clickies on yourself after A rez
|						This depends on MQ2ClickMaint being loaded and properly set up
|						with An insta-clicky set up as the first Item you have in your
|						Ini file setup
|
|	Author:				Nightmare327
|
|


Sub main
	/delay 4m (!${Spawn[${Me}'s corpse].ID})
	/doclicks rez
	:main_loop
	
	/if (${CMaint}) {
		/doclicks
		/delay 1s
		/delay 10s !${Me.Casting}
		| you can place any command you normally do in here 
		| for automatic execution
		/memspellset cur1
		
		/endmacro
	}
	/delay 2s
	/goto :main_loop
/return

ClickMaint.mac - warning untested code here, I just wrote this one, so it will have errors, since its more psuedocode for later development
Code:
sub main
	:loop
	/if (${CMaint}) /call DoClicks
	/delay 1s
	/goto :loop
/return

Sub DoClicks
	|Put all of the checks Right here to Return without doing the clickies
	/if (${Me.Invis}) 			/return
	/if (${Me.Moving}) 			/return
	/if (${Me.FeignDeath}) 		/return
	/if (${Me.Casting}) 		/return
	
	|OK, all of the criteria passed, lets do the clickies
	/doclicks
/return
 
You actually don't need any of those checks except for the movement one. The command that I specified for MQ2Cast already has the -invis check on it, MQ2Cast won't try to cast if you're feigned, and the source won't try to cast while the cast window is active, so even if you were to activate the /doclicks command while casting, the plugin knows to wait until you're done before starting on the loop.
 
Sounds good. If MQ2Cast wont cast while your feigned, will it retain the cast command for later so it knows to do it once you get up ? If not, I think the FD check would be good to keep, so then you can still refresh your clickies once your finished FD'ing. Like I said, that was off the top of my head as I assumed that MQ2 was down with the servers, just saw the postponement on the patch though, hehe, so hopefully I will have a chance to test later on.
 
True. I suppose we could always build in a State!=Stand check to the plugin, that would allow it to skip commands and keep them for later if not standing.
 
One thing I just noticed is the plugin is displaying the list of personal items every time I zone. I hadn't really noticed that before.
 
Already fixed. I'm going to look into a StandState check for the plugin's casting stuff, once I figure that out I'll post both.
 
Posting the text-spam fix now as v1.20, too busy to figure out the other stuff just now.
 
Jobey -- if your INI were incorrectly set up, that would do it. If you post it, I can take a look!

Also, are you getting the "debug" spam when it a) loads items, and b) sees that items are wearing off?
 
Awesome plugin guys great work! Figured most of it out from the detailed instructions above. (Another thanks for that). Doesn't seem to swap the shrink wand into a usable slot in order to cast it with other clickies. Im probably missing a command or ini statement. Any tips or suggestions to get this to works like the rest of the clickies to just do it?

**EDIT** NM was my on my end as I assumed. Had to make sure that items were in proper bag sizes to allow switching of them..
 
Glad to hear that you like it! If you do find any bugs, or have any suggestions / requests, don't hesitate to ask.
 
Jobey -- if your INI were incorrectly set up, that would do it. If you post it, I can take a look!

Also, are you getting the "debug" spam when it a) loads items, and b) sees that items are wearing off?

Yeah i get all the noticed messages. i have the correct #items in the ini. But since after 1.17 I think it would always return FALSE.

Jobey
 
Well, there might be something in the INI that I might spot, even if you don't. If you post it, I'll either know that it's an INI thing, or it's a coding error that needs to be looked at.
 
Anyone got this compiled for the last patch? Or able to put it with the compiles.

Thanks.