Party System

Post your Custom Scripts or Packages.

Moderator: POL Developer

User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Party System

Post by tekproxy »

Code: Select all

[ - What is this? -]
A package to handle party system packets. It can handle all client-based party commands and status window updates (mana, stamina). However, extended functionality such as karma/fame sharing, party corpse looting criminality, faction stuff and area effect spells not damaging party members is not easily packaged so it's up to you if you even want your shard to have this functionality and to code it.


[ - Changes - ]
1.3:
  Fixed careless bugs I missed after moving around a bunch in an effort to optimize.
  Fixed issues with parties >2 people. I was all alone while testing this and didn't want to run 3 or 4 clients.
  Note: I know of a few people (including Repsak) who use this with 096 and it works OK, so I'm changing core required to 096.
        Let me know if you have issues.
  Also note: I make mention of this in the source as well. No packet guide even documents the invite packet that I use so no guide
             has any mention of a decline invite, which I think is what I need. If someone invites you and it times out, and you type
             /accept, the client still thinks it's being invited but the script makes an additional check. If I knew a way to timeout
             the invite or decline the invite I wouldn't need to check anymore as it would be handled by the client.
  Thanks to Repsak for testing, reporting and suggesting fixes for this version.
        
1.2:
  UO.com says to use "/t#" for private messaging which is handled client-side so "/#" support was removed (stratics lied to me)
  Fixed a bug with private messages to someone in party position 10
  Changed spacing and variable names to make it more like the distro

1.1:
  Added support for /# private messanging
    # is position in the party of the player you want to message, ex: "/1 hello" will send "hello" to the party leader
  Added support for the /add client command
  Removed SendStatus hook, it is not really necessary, requires the attributes package and conflicts with another package in the 096 distro
  Fixed a recursion bug (the one Pierce mentions)
  Fixed lots of little small bugs
  Removed the dependency on the new attributes package
  Party messages now use specific party packets (instead of SendSysMessageUC())
  Tried to improve some of the comments...
  Removed my buggy and incomplete onCorpseRemove, since the 096 distro will handle this somewhere else

1.0:
  Crappy initial release :)
  

[ - Installation - ]
Copy the files over to your packages directory and compile.

On OSI, parties share fame and karma, can loot mobs together, may be able to loot each other's corpses, cannot compose of rival factions, and area effect spells do not damage other party members. I'll add this functionality if Austin says it's OK, but it would make the distro more dependant on the party package and would make it more specific to OSI. You can read more about it here:
http://guide.uo.com/combat_2.html

If you have corpse looting criminality checks then you can add code to check if the owner of the corpse has PARTY_LOOT_PROP set to true and the person looting is in the party. For refrence, on OSI, you can loot a corpse if it is:
 - your own corpse
 - your agressor's corpse (someone who attacks you and you kill them)
 - a criminal/murderer's
 - fellow/rival guild member

By default this package uses the party message packets (subsub commands 3 and 4) to send messages to other party members. If they have PartyMessageColor=0 in uo.cfg then they will not be able to read the messages. You can fix this by telling all of your players to set it to PartyMessageColor=368 or you can open config.inc in the include directory and change USE_PACKETED_MESSAGES to 0. This will substitute the packets for SendSysMessageUC(<message>, 3, 368).


[ - Considerations - ]
Thanks to Max Sherr for his initial help getting this moving, to Kinetix who posted some code on Folko's old forums, to Aeros, grak, Pierce and Repsak who posted on the forums when they found something wrong and a massive thanks to all of the POL devs, especially Austin for answering all of my questions.


[ - TODO - ]
Get a packet log of someone playing on OSI using the party system to double check everything.


[ - Note - ]
While coding this I came accross two undocumented subsub commands for the party system: 5 and 7. From what I can tell, 5 works exactly like 4, which is send party message. Subsub command 7 is an "invite" command, that I might not be using correctly. If anyone could tell me the precise messages OSI sends and when it sends them for the party system, or perhaps a UOLOG (my wildest dream) of a party session, I would be very greatful and could make this package more OSI-like. The below information is my best guess, but it may be wrong.

Command 0xBF, subcommand 6:
	Subsubcommand 5: Tell full party a message? (Variable # of bytes) 
	· BYTE[4] id (of source) 
	· BYTE[n][2] Null terminated Unicode message. 
	Note: Server Message
	
	Subsubcommand 7: Send party invitation (4 bytes)
	· BYTE[4] id (of source) 
	Note: Server Message


[ - Contact - ]
Please send me any comments, questions or bugs.
E-mail: tekproxy@gmail.com
AIM: tekproxy
Last edited by tekproxy on Thu Aug 24, 2006 1:20 pm, edited 13 times in total.
Aeros
Journeyman Poster
Posts: 69
Joined: Mon Apr 24, 2006 10:56 am

Post by Aeros »

Hi tekproxy,

Awesome script package, works fine, except:

Code: Select all

[04/26 13:44:55] Script pkg/systems/partySystem/doPlayerStatus.ecl exceeded maximum call depth
Return path PCs: 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 
Client#28: Switching to queued data mode (1, 9 bytes)
Client#28: Leaving queued mode (792 bytes xmitted)
Gets spammed in the console until it crashes. Any idea why? I'm trying to isolate the problem, but no luck this side.
[/code]
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

What core is that? I never got that message. Also, try turning debugging on (in config.inc) so you'll know what function is being called that spams that message. I don't like function handleStatUpdate() where it loops through the player's party. I'm going to change a few lines here and there and upload it in a minute.
Aeros
Journeyman Poster
Posts: 69
Joined: Mon Apr 24, 2006 10:56 am

Post by Aeros »

Hey tekproxy,

It's on core POL096-2006-03-17. Haven't done the debugging stuff yet, but let me know when you've uploaded the new file :) Will give that a shot with debugging info on, and see what I get then.
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

Ok I uploaded the new version. I changed a number of things here and there that I didn't like. I just partially tested it and everything worked Ok, and I don't think I made any changes big enough to break the whole thing. Mostly I chanaged comments and spacing. I use TypeOf() to determine if the object property from the character is an array when looping through the party members to send a modified status update packet so that -might- make some difference as arrays can sometimes be tricky. Try turning debugging on and recompiling, that way I'd know for sure what function is doing that.
Aeros
Journeyman Poster
Posts: 69
Joined: Mon Apr 24, 2006 10:56 am

Post by Aeros »

Will do - by the way:

In your party chat, I had to force-convert the unicode chat to strings, as the unicode refused to show up in the clients. Is it doing that on your side as well?
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

No, my clients handle the unicode correctly. What client are you using? I used AoS and SE and they both worked.
Aeros
Journeyman Poster
Posts: 69
Joined: Mon Apr 24, 2006 10:56 am

Post by Aeros »

Hm, strange. I tested on the latest SE clients. This is what I had to do in order for it to work:

Code: Select all

var themsg := "[Party] " + who.name + ": ";
			
var amsg := array;
amsg := CChrZ(msg);
themsg := themsg + amsg;
			
SendSysMessage( char, themsg, 3,90 );
Aeros
Journeyman Poster
Posts: 69
Joined: Mon Apr 24, 2006 10:56 am

Post by Aeros »

Refer to above post. The following code did NOT work on the latest SE clients:

Code: Select all

var cmsg := CAscZ( "[Party] " + who.name + ": " );
    
cmsg := cmsg + msg;

SendSysMessageUC( char, cmsg, "ENU" );
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

I deleted all .ecl files, recompiled and restarted the server before testing just to be sure.

I just now re-tested chat and messaging with two 5.0.1j UO:SE clients both ways multiple times and I could not simulate your problem.

What encryption are you using?
What language?
Have you tried printing cmsg out right before SendSysMessageUC() ?
Have you tried printing CChrZ(cmsg) right before SendSysMessageUC() ?
Pierce
Forum Regular
Posts: 420
Joined: Thu Feb 02, 2006 8:33 am

Post by Pierce »

@Aeros:
I think you are using the "old" attributes.inc. Right?
If you change the doPlayerStatus.src with the following code, you should get rid of these exceeded maximum call depth errors.

Code: Select all

use uo;

include "config";
include "packetInfo";

const OFFSET_UPDATE_STAT_PLAYERID := 1;

const OFFSET_SEND_STATUS_LENGTH := 1;
const OFFSET_SEND_STATUS_PLAYERID := 3;
const OFFSET_SEND_STATUS_CURRENT_HEALTH := 37;
const OFFSET_SEND_STATUS_MAX_HEALTH := 39;
const OFFSET_SEND_STATUS_NAME_CHANGE := 41;
const OFFSET_SEND_STATUS_VALID := 42;
const OFFSET_SEND_STATUS_SEX := 43;
const OFFSET_SEND_STATUS_STR := 44;
const OFFSET_SEND_STATUS_DEX := 46;
const OFFSET_SEND_STATUS_INT := 48;
const OFFSET_SEND_STATUS_CURRENT_STAMINA := 50;
const OFFSET_SEND_STATUS_MAX_STAMINA := 52;
const OFFSET_SEND_STATUS_CURRENT_MANA := 54;
const OFFSET_SEND_STATUS_MAX_MANA := 56;
const OFFSET_SEND_STATUS_GOLD := 58;
const OFFSET_SEND_STATUS_ARMOR := 62;
const OFFSET_SEND_STATUS_WEIGHT := 64;

program doPlayerStatus()
  print( "Hooking Party Status Update..." );
  return 1;
endprogram

exported function handleUpdateStat( character, byref packet )
  var id := packet.GetInt32( OFFSET_UPDATE_STAT_PLAYERID );
  var party := GetObjProperty( character, PARTY_PROP ); 
  var char;

  if ( party[1] )
    foreach member in party
      if ( member != id )
        char := SystemFindObjectBySerial( member );
        if ( char && (CoordinateDistance(char.x,char.y,character.x,character.y) <= PARTY_STATUS_UPDATE_DISTANCE))
          packet.SendPacket(char);
        endif
      endif
    endforeach
  endif
  
  return 0;
endfunction

exported function handleSendStatus( character, byref packet )
  var party := GetObjProperty( character, PARTY_PROP );

  if ( party[1] )
    var id := packet.GetInt32( OFFSET_SEND_STATUS_PLAYERID );
    if ((id in party) && (character.serial != id))
      var char := SystemFindObjectBySerial( id );
      if ( char )
        packet.SetInt16( OFFSET_SEND_STATUS_LENGTH, 66 );
        packet.SetInt16( OFFSET_SEND_STATUS_CURRENT_HEALTH, Cint(GetVital(char, "life")/ 100) );
        packet.SetInt16( OFFSET_SEND_STATUS_MAX_HEALTH, Cint(GetVitalMaximumValue(char, "life")/ 100) );
        packet.SetInt8( OFFSET_SEND_STATUS_NAME_CHANGE, 0 );
        packet.SetInt8( OFFSET_SEND_STATUS_VALID, 1 );
        packet.SetInt8( OFFSET_SEND_STATUS_SEX, char.gender );
        packet.SetInt16( OFFSET_SEND_STATUS_STR, GetAttribute(char, "strength"));
        packet.SetInt16( OFFSET_SEND_STATUS_DEX, GetAttribute(char, "dexterity"));
        packet.SetInt16( OFFSET_SEND_STATUS_INT, GetAttribute(char, "intelligence"));
        packet.SetInt16( OFFSET_SEND_STATUS_CURRENT_STAMINA, Cint(GetVital(char, "stamina")/100));
        packet.SetInt16( OFFSET_SEND_STATUS_MAX_STAMINA, Cint(GetVitalMaximumValue(char, "stamina")/100));
        packet.SetInt16( OFFSET_SEND_STATUS_CURRENT_MANA, CInt(GetVital(char, "mana")/100));
        packet.SetInt16( OFFSET_SEND_STATUS_MAX_MANA, Cint(GetVitalMaximumValue(char, "mana")/100));
        packet.SetInt32( OFFSET_SEND_STATUS_GOLD, 0 );
        packet.SetInt16( OFFSET_SEND_STATUS_ARMOR, 0 );
        packet.SetInt16( OFFSET_SEND_STATUS_WEIGHT, 0 );
      endif
    endif
  endif
  
  return 0;
endfunction
Pierce
Forum Regular
Posts: 420
Joined: Thu Feb 02, 2006 8:33 am

Post by Pierce »

Damn, i hate if i am wrong :lol:
Even with the above script you get a
pkg/systems/partySystem/doPlayerStatus.ecl exceeded maximum call depth
Return path PCs: xxx
So if your standard in pol.cfg is: MaxCallDepth=100
You will get this error spawning your pol.log.
The code caused extremly lag to players who use it.
I changed it to the above using CoordinateDistance.
Don't know if that helps. We will see tomorrow :)
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

It sounds like the party prop is not being cleared off of players or something strange is happening to make that loop happen more than 100 times, which should never happen. Normally I put sleepms(2); in my loops but that loop should never iterate more than 10 times... If you find out more about that problem, let me know. I plan to go through all of this code and make the messages more OSI-like and implement a few new things I've learned but I'm kind of busy with a lot of other things.

Thanks for your post. I'm glad someone is making use of it.
qrak
Grandmaster Poster
Posts: 198
Joined: Sun Feb 05, 2006 4:35 pm
Location: Poland

Post by qrak »

this party system should be in new distro96. Autsin you should appreciate tekproxy work and include that system. I'm using that system on live shard. Tekproxy you made good work, take care.
User avatar
Austin
Former Developer
Posts: 621
Joined: Wed Jan 25, 2006 2:30 am

Post by Austin »

Ill look into it very soon. Im not showing favoritism... Unreal's stuff got used first because I was working on something related to it and someone already did what I had to do... but yeah, after the Trogdor AI is done, ill look into it. Gotta do something funny ever so often to prevent burnout :-P
Pierce
Forum Regular
Posts: 420
Joined: Thu Feb 02, 2006 8:33 am

Post by Pierce »

It sounds like the party prop is not being cleared off of players or something strange is happening to make that loop happen more than 100 times, which should never happen. Normally I put sleepms(2); in my loops but that loop should never iterate more than 10 times... If you find out more about that problem, let me know. I plan to go through all of this code and make the messages more OSI-like and implement a few new things I've learned but I'm kind of busy with a lot of other things.

Thanks for your post. I'm glad someone is making use of it.
First of all, great job Tekproxy. The system works. I tried to make some improvements, but they fail. I get the spam on pol.log again even if i use the improved script. I don't think the party prop is the problem. The packets are sent too often even if it is only a 2 member party. Perhaps the devs can do that as core commands. Don't know if that helps. If i have more time i will take a deeper look, perhaps someone else finds a solution meanwhile.
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

Thanks. :) I found the problem and a bunch of other bugs and I'm uploading the new version now.
Harley
Forum Regular
Posts: 360
Joined: Sat Mar 18, 2006 1:41 am
Location: Germany

Post by Harley »

Hm, I have compiled thoose scripts, and when I started server, he tell me some error. Look please:

Code: Select all

INSTALLING: Party Status Update PH...
INSTALLING: Party System PH...
Error reading configuration file pkg/opt/packetHooks/PartySystem//uopacket.cfg:
	Parent packet 0xbf does not define SubCommandOffset!
	Element: SubPacket 0xBF, found on line 13
Server Shutdown: loading packet hooks
Execution aborted due to: Configuration file error
Tell me please, how fix this gluk? :)
qrak
Grandmaster Poster
Posts: 198
Joined: Sun Feb 05, 2006 4:35 pm
Location: Poland

Post by qrak »

by thinking ;)
Harley
Forum Regular
Posts: 360
Joined: Sat Mar 18, 2006 1:41 am
Location: Germany

Post by Harley »

qrak wrote:by thinking ;)
It already so answer problems? Thanks... :\ :?
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

In the distro, packet 0xBF is already defined properly, and 0xBF is a fairly common packet to hook, so I didn't bother defining it in this package. I'lll fix the readme when I'm not lagging so much.

From your error, it seems you already have 0xBF defined but it is missing the SubCommandOffset. Search your uopacket.cfg files and find the one that defines 0xBF and make sure it looks something like this:

Code: Select all

Packet 0xBF
{
  Length variable
  SubCommandOffset 4
  SubCommandLength 1
}
If you don't have 0xBF already defined, add that code to uopacket.cfg in the PartySystem package.
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

Uploaded a new version.
Repsak
Master Poster
Posts: 91
Joined: Sun Feb 05, 2006 2:00 am
Location: Denmark

Post by Repsak »

I just downloaded you party system, and I noticed that every time a client declined an invitation (eigher by /decline or the 10 seconds automatic decline) the invited client would freeze.
I tracked down the problem to this code:

Code: Select all

	var packet := CreatePacket(MSGTYPE_PARTY, 11);
	packet.SetInt16(OFFSET_PARTY_SUBCMD, SUBCMD_PARTY); // Set subcmd to Party
	packet.SetInt8(OFFSET_PARTY_SUBSUBCMD, 2); // Set subsubcmd to Remove
	packet.SetInt8(OFFSET_PARTY_REMOVE_NEWSIZE, 0); // Set 0 party size
	packet.SetInt32(OFFSET_PARTY_REMOVE_PLAYERID, invitee.serial); // Set removed player's serial
	packet.Set16(OFFSET_PARTY_MSGLEN, packet.GetSize()); // Set packet length
	packet.SendPacket(invitee);
After some testing I found that if I replaced the code, with

Code: Select all

	     // Send remove packet
	     SendRemovePacket(invitee, invitee.serial);
The problem would be fixed.
I did ofcourse move the SendRemovePacket function to a shared .inc before I could compile handlePartyDecline.

Im running pol96.1 using latest clients.

Bug?

PS. I noticed that the 'CoreRequired' was set to 97 in the original pkg.cfg, and I of course had to change it to 96. Not sure if it has anything do with this.
Repsak
Master Poster
Posts: 91
Joined: Sun Feb 05, 2006 2:00 am
Location: Denmark

Post by Repsak »

Another problem seem to be when a client send a party message.
Insted of [Repsak:] Hello buddy
it send:
[Repsak:] [123, 23, 45, 45, 35, 67 etc] (This is just an ex)

To fix this, I removed:

Code: Select all

	if ( Lower(TypeOf(targ)) == "array" )
		message := CAscZ(message);
	endif
in function SendPartymessage()
User avatar
tekproxy
Forum Regular
Posts: 352
Joined: Thu Apr 06, 2006 5:11 pm
Location: Nederland, Texas

Post by tekproxy »

Thank you kindly for reporting these bugs. I moved a lot of code around and tried to optimize it as much as possible so there would be as little duplicated code as possible and to make it more friendly for others to read and understand. I think with the /decline thing I tested it and it worked but I didn't notice that a few seconds later the client would crash and I just closed it and then I only tested private messages and not normal chat! By the way your fixes were correct.

Oh it should work with 096. I was just a little paranoid since I'm so used to 097 and I think for a time it did require 097 for some small things but it doesn't anymore. I'm not sure. I changed the core required to 096 (which I'm fairly sure it does require at least 096). If it works ok for you let me know. :)
Post Reply