Full Version : XMLSpawner Change Log.
xmlspawner >>XMLSpawner - Releases & Updates >>XMLSpawner Change Log.


<< Prev | Next >>

godfood- 08-21-2006
CHANGELOG:
New to version 3.24
updated 2/11/08

Bug Fixes
- fixed a problem with xmldialogs no longer responding to keywords that was introduced in v3.23. (thanks to spookyroberts for pointing that out).

- fixed an exploit with playermade quests that allowed players to add to stackable rewards such as gold, and then use the quests as bags of sending. Players can no longer add to stackable rewards. (thanks to syznow for pointing this out)

Modified Features
- modified the #WAYPOINT keyword to use the z coord as well as the x,y coord of waypoint runes when trying to place spawns. Previously, only the x and y coord of the rune were used. (thanks to noonehome for the suggestion)

New Features
- added the new 'BSOUND,soundid' keyword that will broadcast a sound to all players. This is essentially BCAST for sounds. This is a standalone keyword. (thanks to BaronVallyr for the idea).

New to version 3.23
updated 2/2/08
If you are using SVN 241 or higher you will need to update to this version.

Bug Fixes
- fixed a problem with the GETONNEARBY keyword when used in condition tests with XmlDialogs. It was not using the location of the object that the XmlDialog was attached to as the reference location for the nearby search (thanks to Xerocrates for pointing this out).

- blocked the ability to use questholder rewards (by double clicking them while viewing them) before the quest is completed. (thanks to ABTOP for pointing this out).

- fixed a bug in which an attachment with a custom OnUse or OnUser function that deletes the item it is attached could cause the default Use function to crash with a null item error. (thanks to CEO for pointing this out).

- fixed a problem with orphaned attachments that try to remove items that they might be holding when they get cleaned up. This could generate warnings during world saves regarding attempts to delete items by attachments. (thanks to Vladimir for pointing this out)

Modified Features
- optimized the #WAYPOINT keyword for speed. Rather than searching all world items for named waypoints, it now uses a local hashtable lookup. This can significantly improve spawning performance when this keyword is used, particularly for servers with large item counts. The table will be reconstructed on server restarts or when spawners are manually reset. Note that if you use the #WAYPOINT keyword and add new waypoint runes, make sure that you reset the spawner so that they are recognized. (thanks to Xavier_WER for the suggestion).

- newly duped spawners are now automatically shut off before being placed in a pack. (thanks to Haazen for the suggestion).

- added support for accesslevel restrictions on constructable objects that was added in SVN 241. To enable this feature uncomment this line at the beginning of xmlspawner2.cs

//#define RESTRICTCONSTRUCTABLE

and then you can restrict spawning of objects that have an accesslevel restriction in their Constructable attribute by adjusting the value of this variable around line 92 of xmlspawner2.cs

public static AccessLevel ConstructableAccessLevel = AccessLevel.GameMaster; // only allow spawning of objects that have Constructable access restrictions at this level or lower. Must define RESTRICTCONSTRUCTABLE to enable this.

If you dont enable this feature, then things will work just as they have in the past, with no restrictions on spawning of objects that are marked Constructable.

- added the MaxTargetRange property to XmlUse attachments that allows you to specify the max allowed distance between the player and the target when using the targeting ability of XmlUse attachments. Default is 30 tiles.(thanks to Steelcap for the suggestion).

- added the ResetRange property to XmlDialogs that allows dialogs to automatically reset whenever the triggering player moves out of range. This means that when you have multiple players waiting to activate a dialog, they wont have to wait until the ResetTime for the dialog expires to trigger it again. This should improve the apparent responsiveness of dialogs.

New Features

New to version 3.22
updated 8/31/07
Bug Fixes
- fixed a crash bug involving invalid XmlDialog reset times (thanks to Xavier_WER for pointing this out).

- fixed a bug in the SOUND keyword that wasnt allowing it to work properly in XmlDialog Actions. (thanks to PrinceArda for pointing this out)

Modified Features
- added some memory optimizations that should reduce save times a bit.

- added a new 'equippedonly' argument to the GETONCARRIED keyword. This allows you to restrict the target carried object to equipped items only. This upgrades the GETONCARRIED args to match those available to SETONCARRIED. The new syntax is
GETONCARRIED,itemname[,itemtype][,equippedonly],property

For example,

GETONCARRIED,*,baseweapon,true,name

would return the name of any equipped weapon on the triggering player.

- added additional journal logging options with the new 'NotifyAddJournalEntry' and 'EchoAddJournalEntry' properties on questholders (thanks to Syznow for the suggestion). These work in the same way as the recently added 'AddJournalEntry' property, but will also notify the holder of the quest when the entry is added (or modified) if the 'NotifyAddJournalEntry' property is set instead of the 'AddJournalEntry', and will both notify and echo the entry text if the 'EchoAddJournalEntry' property is used.
For example, the following spawn entry that would add a journal entry to the carried quest and also notify the questholder and echo the text to them

SETONCARRIED,Too many orcs,questholder/echoaddjournalentry/A simple request:You met a young woman named Tess outside of the Sweet Dreams inn. She asked if you could help with a small problem she was having with the growing orc population outside of her house near Britain.

would echo to the player

Journal entry 'A simple request' has been added to quest 'Too many orcs'.
You met a young woman named Tess outside of the Sweet Dreams inn. She asked if you could help with a small problem she was having with the growing orc population outside of her house near Britain.

The color of the notification and echoed text can also be configured by adding the following entries to the [XmlSpawner] section of Data/XmlSpawner.cfg .

JournalNotifyColor=0
JournalEchoColor=6


The numbers are the color values used to display the text.

New Features
- added a new targeting option to the XmlUse attachment that allows you to create custom use functions that bring up a targeting cursor on double click.
To enable this feature set the 'TargetingEnabled' property on the attachment to true.
Once this is done, then three additional properties that control targeting behavior become available.
The existing 'SuccessAction' will be performed once the object with the XmlUse attachment is successfully doubleclicked and the target is successfully selected.
When constructing an action, note that GETONTHIS and SETONTHIS will refer to the targeted object. So for example, a SuccessAction like

SETONTHIS/hue/500

would set the hue of the targeted object to 500.

Properties:
TargetingAction
Assign this string to specify custom actions that will be taken when the target cursor is brought up. The action string can be any spawnable entry string and supports multiple actions separated by semicolons.

TargetCondition
A test string that is the same as any xmlspawner condition test. It will be tested after an object is selected with the targeting cursor. If it returns true, then the object can be targeted and 'SuccessAction' will be performed. If it is false, then the 'TargetFailureAction' will be performed.

TargetFailureAction
This action will be executed when the target selection test in 'TargetCondition' is NOT satisfied.

- added the new 'ITEM,serial' keyword that you can use anywhere that you would normally be able to use loot keywords like TAKEN, or ARMOR to refer to arbitrary items by their serial number. (thanks to SteelCap for the suggestion)

So, for example, to take an existing item from a nearby container and drop it into a players bankbox you could do something like

SETONCARRIED,,bankbox,equippedonly/ADD/ITEM,{GETONNEARBY,1,,gold,true,serial}

- added the TakeArms.xml example to xmlextras.zip that demonstrates the use of the new ITEM keyword as well as the new 'equippedonly' argument to GETONCARRIED. To test it out, just '[xmlloadhere takearms.xml' and then walk past the spawner while you have a weapon equipped to trigger it.
The spawner will automatically take your equipped weapon and place it in a nearby container.

- added the 'BlockCommand' and 'ChangeCommand' configuration options to Data/XmlSpawner.cfg that allow commands to be blocked, renamed, or be given different accesslevels. This allows you to control command access without modifying any scripts. These will work on any commands, not just those added by the xmlspawner system. These should be added to the [XmlSpawner] section of Data/xmlspawner.cfg
The syntax for the BlockCommand option is

BlockCommand=commandname, commandname, etc.

The syntax for the ChangeCommand option is

ChangeCommand=oldname:newname[:accesslevel], oldname:newname[:accesslevel], etc.

If the newname argument is omitted, then the oldname will not be changed. If the accesslevel argument is omitted, then the accesslevel will not be changed.
Here is an example entry in xmlspawner.cfg

BlockCommand=freeze, freezemap, freezeworld, unfreeze, unfreezemap, unfreezeworld
ChangeCommand=add:a, xmlfind:xf:Administrator, xmlsave::Owner


This will completely block the freezing and unfreezing commands, rename the 'add' command to 'a', change the 'xmlfind' command to 'xmf' with the accesslevel of Administrator, and will change the accesslevel of the 'xmlsave' command to Owner.

New to version 3.21
updated 3/15/07
Bug Fixes
- fixed an issue involving rewards being used directly out of questholders. Now, any rewards attached to a questholder such as gold, reagents, charged items, etc. are protected from being accessed by processes that perform recursive searches through a players pack for items (such as spellcasting, and vendors). For example, this means that gold rewards still attached to a questholder will be viewable, but will not appear in the total gold available to the player, and cannot be used for purchases.

Modified Features
- added a property test option to the SETONNEARBY keyword that allows you to restrict the objects selected (thanks to Steelcap for the suggestion). The new syntax is

SETONNEARBY,range,name[,type][,searchcontainers][,proptest]/prop/value/prop/value...

So, for example, to set the hue of all nearby creatures with hitpoints of less than 100 to blue you could use something like

SETONNEARBY,10,*,basecreature,false,hits<100/hue/500

New Features
- added a Journal feature to questholders that allows a text log to be built that can be accessed from the new 'Journal' tab in the questholder gump. Information can be added to the journal by setting the AddJournalEntry property on the questholder to the desired text. That text will be appended to the running journal log. The text must be of the form, "EntryID: text", where the EntryID is a unique string label that will be used to identify the journal entry. Setting the text for a journal entry with the same ID will replace the text for that entry. To remove a journal entry, just specify an empty text field.
For example, you could add a journal entry to a carried questholder like this

SETONCARRIED,Too many orcs,questholder/addjournalentry/A simple request:You met a young woman named Tess outside of the Sweet Dreams inn. She asked if you could help with a small problem she was having with the growing orc population outside of her house near Britain.

or create a quest with initial journal entries like

questholder/name/Too many orcs/objective1/KILLNAMED,Brakk,orc/addjournalentry/A simple request:You met a young woman named Tess outside of the Sweet Dreams inn. She asked if you could help with a small problem she was having with the growing orc population outside of her house near Britain.

user posted image

Entries can also be added and/or modified at any time by using the "Add" button in the gump.

New to version 3.20
updated 3/06/07
Bug Fixes
- fixed a deserialization problem in the XmlUse attachment that was introduced in v3.19.

Modified Features
- disabled spawn entries (lock icon next to entry in spawner gump) are now ignored when determining availability of a subgroup for spawning.

- added support for console reporting of unrecognized settings during xmlspawner.cfg loading. The AssignSettings method must now return a bool instead of void. A true value means successful setting, false means an unsuccessful or unrecognized setting.
CODE

public static bool AssignSettings(string argname, string value)


New Features
- added the "BlockKeyword=keyword[,keyword]..." configuration option to the XmlSpawner section of xmlspawner.cfg to allow selected xmlspawner keywords to be blocked. This will disable their use in any context, including spawners, xmldialogs, etc.
For example, to block the use of the BROWSER and SETACCOUNTTAG keywords, add this entry to the [XmlSpawner] section of xmlspawner.cfg

BlockKeyword=BROWSER,SETACCOUNTTAG

- added the new "BROWSER/url" standalone keyword that will open a web browser to the specified url. This can be used in a spawner entry on a triggered spawner to open a browser to the triggering player. It can also be used as an Action in an XmlDialog or an XmlUse attachment.

- added the browser.xml example to xmlextras.zip demonstrating the use of the BROWSER keyword in an XmlUse attachment. The example creates two signs that will open browsers to the RunUO and XmlSpawnerFan forums when double clicked. To test this out, just do an "[xmlloadhere browser.xml".

New to version 3.19
updated 2/27/07
Bug Fixes

Modified Features
- Name tests have been modified to support a special wildcard "*" that will match any name. (thanks to Kaon for the suggestion)
There are three types of name argument that can be used in tests and keywords

1) standard non-empty name argument (match specific named objects)
2) empty name argument (match only unnamed objects)
3) special * name argument (match objects with any name)

This should work anywhere that a name argument is normally required.
So, for example using a TriggerOnCarried string of

*,heavycrossbow

would allow triggering when the player was carrying a heavy crossbow regardless of the name.

- added the AllowCarried flag to the XmlUse attachment that toggles the ability to use an item when carried by the player using it. (true by default).

New Features
- added support for a new xmlspawner.cfg file in the Data folder of the main RunUO installation. This configuration file can be used to specify certain default values without having to modify the settings in xmlspawner scripts themselves. This can simplify upgrading to new revisions since custom settings can now be specified outside of upgraded scripts and so will be maintained when those scripts are replaced.
If you do not wish to use this configuration feature, you do not have to add an xmlspawner.cfg file. In that case, the standard system defaults will be used just as they have in the past. This new feature is completely optional.

Below is an example of a configuration file illustrating the current support for some of the common xmlspawner and xmldialog settings.

Data/xmlspawner.cfg
QUOTE

# This is a sample xmlspawner configuration file
# comments can be added anywhere in the file using the # at the beginning of the line
# sections are specified with [section]
# individual setting assignments have the form 'name=value'. Spaces can be placed around the '='
# empty lines are ignored and can be placed anywhere

[XmlSpawner]

XmlSpawnDir=Spawns
DiskAccessLevel=Administrator
SmartSpawnAccessLevel=Administrator
defMinDelay=5
defMaxDelay=10
defHomeRange=5
defSpawnRange=5
defRelativeHome=true

[XmlDialog]

XmlQuestNPCDir=XmlQuestNPC
defProximityRange=3
defResetTime=60
defSpeechPace=10



Other systems can also make use of the configuration file by simply specifying their configuration settings in a custom named section. These custom sections will have no effect on any other settings in other sections.

For other systems to make use of the configuration file, the following call would be added to their Initialization method which would load in the settings from the named section during initialization. Individual settings would be processed using the specified custom method.

CODE

XmlSpawner.LoadSettings(new XmlSpawner.AssignSettingsHandler(AssignSettings), "XmlDialog");


where "XmlDialog" would be replaced with a string identifying the section name in the configuration file used to hold the settings for the system.
"AssignSettings" is a custom public static method that would be scripted to process each setting. An example is shown below from the XmlDialog system.
CODE

 public static void AssignSettings(string argname, string value)
 {
  switch (argname)
  {
   case "XmlQuestNPCDir":
    DefsDir = value;
    break;
   case "defResetTime":
    defResetTime = TimeSpan.FromSeconds(XmlSpawner.ConvertToInt(value));
    break;
   case "defProximityRange":
    defProximityRange = XmlSpawner.ConvertToInt(value);
    break;
   case "defSpeechPace":
    defSpeechPace = XmlSpawner.ConvertToInt(value);
    break;
  }
 }


- added the new MEFFECT keyword that allows moving effects to be specified. The syntax is

MEFFECT,itemid[,speed][,x,y,z][,x2,y2,z2]

When x,y,z is specified the moving effect will start at the location and move toward the target object. This syntax must be used as a modifier of a spawned object. If x,y,z is omitted, then the starting location will be the location of the spawner.

For example, to have an fireball move from the spawner location to a triggering player,

SETONTRIGMOB/MEFFECT,14036,3

To have it move from a specified location such as (1500,1100,10) to the triggering player

SETONTRIGMOB/MEFFECT,14036,3,1500,1100,10

Note that the z coordinate should be above ground level to avoid the appearance of ground clipping.

When x2,y2,z2 is also specified the moving effect will start at x,y,z and end at x2,y2,z2 allowing the effect to move between two arbirary locations in the world. This syntax can be used as a standalone keyword. For example the following entry would create a fireball travelling between the two locations.

MEFFECT,14036,3,1500,1100,10,1520,1120,10

New to version 3.18
updated 1/13/07
Bug Fixes
- fixed a possible exploit with the TAKE keyword in which players could hold an item on the cursor and prevent the item from being taken (thanks to DazedAndConfused for pointing this out).

- fixed a possible crash when using the SET keyword with no args in an XmlDialog Action field (thanks to morganm for pointing this out).

- fixed a display bug with the 'search for type' button in the spawner gump (little arrow to the right of the spawn entry) not listing all type categories. (thanks to Irian for the fix).

Modified Features
- added a new installation step (STEP #13) to the "installation 2.0.txt" file that includes a small mod to lootpack.cs that is required for the LOOTPACK keyword to function under RunUO 2.0 (thanks to snicker7 for pointing this out).

- modified the XmlDeathAction attachment to support multiple actions in a single Action specification. Just separate the multiple actions with semicolons.

New Features
- added the 'GETONNEARBY,range,name[,type][,searchcontainers],property' keyword that can be used to get or test properties on nearby items or mobiles. This can be used in property assignments or property tests. If more than one of the specified object is found, it will only return the value from one.

For example, to test to see if someone has placed the longsword named "Grizzleblag" on the ground near the spawner you could use a condition test like

GETONNEARBY,1,Grizzleblag,longsword,visible=true

Or you could get the size of a pile of gold in a nearby container with

SENDMSG/{GETONNEARBY,1,,gold,true,amount} gold pieces are in the container

- added the new standalone keyword 'SETONPETS,range' that allows you to set properties on nearby pets belonging to the triggering mob where the range is the distance from the triggering mob. You would use it like

SETONPETS,range/prop/value/prop/value...

- added the new 'GETACCOUNTTAG,tagname' keyword that allows access to account tags on the triggering player (thanks to CEO for the suggestion). This can be used in value assignments or property tests. For example, if you wanted to test for an account tag before handing out a quest, you could use a Condition test like

GETACCOUNTTAG,quest1="done"

where 'quest1' would be the account tag name, and "done" would be the value of the tag, or

SENDMSG/I see that you already have {GETACCOUNTTAG,numRewardsChosen} veteran rewards.

where 'numRewardsChosen' is the account tag used to keep track of vet rewards.

- added the new 'SETACCOUNTTAG,tagname/value' keyword that allows you to create or change the value of account tags on the triggering player. For example, to create an account tag named 'quest1' with the value 'done' use a spawn entry like

SETACCOUNTTAG,quest1/done

New to version 3.17
updated 11/29/06
Bug Fixes
- fixed a bug in which assigning an extremely large expiration time to questholders could cause a crash (thanks to koluch for pointing this out). Expiration times are now capped at 100 years. This is a particular issue for playermade quests, since it is possible for players to enter such extreme expiration times.

Modified Features
- modified smartspawning so that mobs that are below maximum hits, stamina, or mana will not be despawned (thanks to Kamuflaro for the suggestion). The previous test only looked at hits.

- the LOOT,methodname keyword will now work with Loot methods that have multiple overloads of the sort added in RunUO 2.0. It will still refer to the zero-arg method in those cases. (thanks to Cheetah2003 for the suggestion).

- extended existing support for accessing Array type properties to all other IList types, including Arrays, ArrayLists, and Lists. For example, to get the name of the first attacker on a mobiles aggressors list you could use

[xmlget aggressors[0].attacker.name

where aggressors is a List type property on mobiles, and attacker.name is a property on one of the elements in the list.
The same syntax can be used to refer to such properties in spawner entries and property tests.

- the XmlLifeDrain attachment now gives a message and adds effects just like the default succubus life drain attack.

New Features
- enabled attachment support for "using" objects that allows you to add custom double-click functionality to any object, even statics and mobiles.
If you dont want to use this feature you can disable it by going into PacketHandlerOverrides.cs and commenting out the line in red as shown below

QUOTE

            // this replaces the default packet handler for Use requests.  Items and Mobiles will still
            // behave exactly the same way, it simply adds a hook in to call the OnUse method for attachments
            // they might have.
            //Timer.DelayCall( TimeSpan.Zero, new TimerCallback( UseReqOverride ) );


With this feature enabled the following overridable methods are available to all attachments
CODE

 public virtual void OnUse(Mobile from)
 {
 }

which will be called whenever the object that the attachment is attached to is used (e.g. double clicked). The 'from' argument is the person doing the using.
CODE

 public virtual void OnUser(object target)
 {
 }

When you add an attachment to a player, this method will be called whenever the player "uses" things. The 'target' argument is the thing being used.

Note that the attachment system OnUse and OnUser methods dont replace the default RunUO OnUse method, they are called in addition to any OnUse support that a target object might have, so if an object has support for OnUse in its script, it will still be called.
If you want attachments to ignore the default RunUO OnUse call, you can override the following method in your attachments and have it return true:
CODE

       public virtual bool BlockDefaultOnUse(Mobile from, object target)
       {
           return false;
       }


- added the new XmlUse attachment that allows you to control the use of any object. By adding this attachment to any object you can specify the conditions required to use the object as well as add new use functions to the object that will be executed on double clicks.

Properties:
Condition
A test string that is the same as any xmlspawner condition test. It will be tested whenever the object with the attachment is used (double clicked). If it returns true, then the object can be used. This can be used to control the built-in use functions of an object or the custom use functions that you add on the fly.

MaxUses
An integer value that restricts the maximum number of uses allowed. (default = unlimited)

Refractory
An integer that restricts the minimum time in seconds between uses. (default = 0)

MaxRange
An integer that restricts the maximum distance in tiles allowed from the target object (default = 3)

RequireLOS
A bool that determines whether line-of-sight between the user and the object is required (default = false)

SuccessAction
Assign this string to specify custom actions (in addition to the default OnUse functionality) that will be taken when the conditions for use of the object are met. The action string can be any spawnable entry string and supports multiple actions separated by semicolons.

FailureAction
This action will be executed when the conditions for use of the object are NOT met.

MaxUsesAction
This action will be executed when someone tries to use the object after the max uses has been exceeded.

RefractoryAction
This action will be executed when someone tries to use the object before the refractory period is over.

BlockDefaultUse
Setting this property to true will allow you to completely disable the default scripted RunUO method called when the object is used. This can be used to replace existing default use functions with your custom use actions.

Constructors:

public XmlUse()

public XmlUse(int maxuses)

public XmlUse(int maxuses, double refractory)

Examples:

For example, to make any object usable only once, just issue this command and target the object

[addatt xmluse 1

Note that you can always just remove the attachment and the object will go back to its default behavior. The attachment makes no changes to the object.

To spawn a metal box that can only be opened 3 times with a minimum delay of 10 seconds between openings and delivers a message if someone tries to use it more than the maximum number of times use a spawn entry like

metalbox/ATTACH/<xmluse,3,10/maxusesaction/@SENDMSG/Max uses exceeded.>

To spawn a stone static that pops open a gump when double clicked

static,3796/ATTACH/<xmluse/successaction/@GUMP,Wicked woods,0/Enter here and despair!>

you could also add this manually to any existing static by simply adding the attachment with

[addatt xmluse

and then opening up the props on the attachment with

[getatt

and assigning the SuccessAction property the value of "GUMP,Wicked woods,0/Enter here and despair!"

To spawn a door that can only be opened by players named "Bob"

metaldoor,1/ATTACH/<xmluse/condition/@GETONTRIGMOB,name="Bob">

or by players that havent yet completed an objective of a quest

metaldoor,1/ATTACH/<xmluse/condition/@GETONCARRIED,Bunglers quest,questholder,completed1=false>

To prevent a player from using any metal doors for 2 minutes, create a triggered spawner that will add an xmluse attachment to the player lasting 2 minutes with the following entry

SETONTRIGMOB/ATTACH/<xmluse/expiration/00:02/condition/@GETONTHIS,TYPE!#MetalDoor>

Note that GETONTRIGMOB will always refer to the player doing the using, and GETONTHIS will always refer to the object being used.

- added examples of the new XmlUse attachment in customuse.xml to xmlextras. Just do an "[xmlloadhere customuse.xml" and respawn it.
Examples:
1. Creates a metalbox that can only be opened by someone with positive karma, and after opening it sends a message, opens a gump, and changes the players karma to evil. If someone with negative karma tries to open it, they are refused and a gump pops up.

2. Creates a door that can only be opened by someone with enough strength (>70). If a player is too weak, they will be blocked and a gump will be displayed.

3. Spawns a horse that can only be mounted by someone with high enough chivalry (>90). If a player lacking the skill attempts to use it, they will be blocked and a message will be displayed.

4. Creates a brazier that will spawn a daemon when double clicked if the player has enough fame (>1000).

5. Spawns a stone that will deliver a bag of regs when double-clicked with a waiting time between uses of 10 seconds.

6. Creates a magic portal that teleports the user to a site in Ilshenar when double clicked.

Note that examples 4,5, and 6 are done using simple statics that have no default use scripted.
New to version 3.16
Bug Fixes
- disabled the SpawnIdleTime feature that wasnt working properly under RunUO 2.0 (thanks to Allmight for pointing this out). This feature was designed to reposition spawns that had been around for more than the SpawnIdleTime (72 hours by default) under the assumption that they might not be accessible for players to kill. Under RunUO 2.0, after the SpawnIdleTime elapsed, spawns were being repositioned on every spawner tick due to changes in the Mobile class CreationTime property.

- fixed the XmlDeathAction attachment so that Action strings that spawn mobiles with property settings will apply those settings to the mobile and not the corpse that spawned it. So adding an attachment like
"[addatt xmldeathaction "daemon/name/bozo/hue/500" will correctly spawn a blue daemon named bozo when the creature with the attachment is killed.

- fixed [xmlfind so that searches on partial string matches of spawner entries works again.

Modified Features
- modified the new BCAST keyword options to allow a unicode font to be specified with a font type of -1. So to specify colored unicode broadcast messages, use
BCAST,33,-1/System is going down now
The default font was also changed from ascii back to the unicode style, so
BCAST/Blorgmeister has been killed
would broadcast in default white unicode.

- default spawn placement will now automatically take into consideration the CanSwim and CantWalk mobile properties when calculating valid spawn locations. This will allow water creatures to automatically be allowed to spawn on water without having to explictly inform the spawner with '*' or #WET, and will prevent creatures that cant walk from being spawned on land.

- slight change to the DAMAGE keyword to allow a range value of 0. Previously range had to be greater than zero.

- added keyring keys to the list of valid internal map items that are excluded in [xmlfind when the 'Hide valid internal' box is checked (thanks to Kamuflaro for pointing this out).

New Features
- added the ability to adjust the spawner timer priority for individual spawners so that you can have things like sequentialspawn-controlled animation running at up to the maximum timer priority.
One limitation of the current sequential spawning is that the minimum spawner clock tick is 1 second, even if you set min/maxdelay to zero. That is because the spawner timer priority is fixed at 1 second. To change this priority for individual spawners, set the BasePriority property on the spawner to one of these values (or their int equivalents)

public enum TimerPriority
{
EveryTick,
TenMS,
TwentyFiveMS,
FiftyMS,
TwoFiftyMS,
OneSecond,
FiveSeconds,
OneMinute
}

That will define the spawner timer interval when min/maxdelay is set to zero.

To prevent accidentally leaving spawners with modified timer priorities, the BasePriority is reset back to the default of one second on server restarts.

- included an example of the use of modified timer priority in boulder.xml which creates an animated boulder moving across the screen triggered by nearby players, and if it detects a collision with the triggering player then it kills them (thanks to Xerrox for the idea).
You can play around with changing the basepriority setting in the spawner entry to see how it changes the animation speed.

New to version 3.15
Bug Fixes
- modified the [WriteMulti command to support staff names that have spaces in them when accessing files (thanks to Xavier_WER for the suggestion).

- fixed a problem that was introduced in v3.14 with the addition of ISpawner support in which [xmlhome would not be able to find the home spawner of a creature after a restart. I had incorrectly assumed that the Spawner information on items/mobiles was being serialized and it isnt. Now initialization code has been added to restore Spawner information after restarts.

Modified Features
- modified XmlSpawnerGumps.cs to accomodate changes to Gump handling introduced in SVN rev 78 of the RunUO server. This should allow you to compile with the latest version of the server and should also work with pre-78 servers.

- custom regions that get registered after initialization will now be detected and can be used by region spawners.

- added support for assigning a mobile used to allow spawners to issue commands using the "COMMAND/commandstring" keyword by assigning the name of the mobile in the static CommandMobileName variable at line 341 in basexmlspawner.cs.
Commands in RunUO are required to have a mobile associated with their execution to allow accesslevel verification. This mobile will be used to issue all commands executed with the COMMAND keyword. The accesslevel of the mobile will determine the commands that can be issued.

This mobile can be a dummy character/creature that was created just for this purpose, or an existing character.
The commandstring is any string that you would normally type on the command line (without the command prefix).

CODE

       private static string CommandMobileName = null;


If the value is left null, then the COMMAND keyword will only work with triggered spawners when the triggering player has sufficient accesslevel to issue the command.

- modified random subgroup spawning. Subgroups that cannot be completely spawned will not be selected for random spawning. All spawn entries in the subgroup have to be below their individual maxcount, and fully spawning the subgroup cannot exceed the overall spawner maxcount. Previously those subgroups would simply spawn the entries of the subgroup that could be spawned.
This will apply to both random and sequential spawning but note that forced subgroup spawning, as part of a conditional statement, for example, will still allow partial spawning of the target subgroup.


New Features
- added the new #NOTILES,startid[,endid] spawn control keyword. This is similar to the #TILES keyword, but it allows you to specify the land/static tiles that the spawns for an entry will NOT be placed on. Only passable tiles that are not on the #NOTILES list will be used for spawn placement.

The example below has 2 spawn entries.
The first entry uses the #NOTILES keyword to specify that the orcs should NOT be spawned on grass tiles with ids of 3. Note that the lava tiles are not passable and so the orcs are placed on dirt, which is the only passable, non-grass tile around.
The second entry uses the #TILES keyword to place the lavalizards on the lava tiles.
user posted image

- added an optional 'equippedonly' argument to the existing SETONCARRIED keyword that would allows access things like a players bankbox. The new syntax is
SETONCARRIED,itemname[,itemtype][,equippedonly]/prop/value/prop2/value...
where specifying 'true' or 'equippedonly' for the equipped only arg will only look at items that are directly equipped on the mobile, and that would include bankboxes.
So to add something to a players bankbox you would do
SETONCARRIED,,bankbox,equippedonly/ADD/gold,500

- added the new KILL keyword that can be used to kill mobiles. For example, the spawn entry
SETONTRIGMOB/KILL
would kill the triggering mob, or
SETONNEARBY,5,,rat/KILL
would kill all of the rats within 5 tiles

- added optional args for specifying hue and font in the BCAST keyword (thanks to Xavier_WER for the suggestion). The new syntax is
BCAST[,hue][,font]/message
Note that this uses the same hues and fonts as the SENDASCIIMSG and ASCIIMSG keywords,
SENDASCIIMSG[,probability][,hue][,font]/message text
ASCIIMSG[,probability][,hue][,font]/text
so you can use them to test out various text/color combinations without having to actually broadcast to see what it looks like.

New to version 3.14
updated 8/13/06

Bug Fixes
- modified the spawner Reset function to properly reset the refractory period for triggered spawners if that was set (thanks to Vladimir for pointing that out).

- fixed a possible crash bug with the playermade questholder editing gump (thanks to Auriel for pointing it out).

- fixed a problem with MinD, MaxD, or Rng values for individual spawn entries being inappropriately cleared when editing an entry string with the text entry book.

- modified the ASCIIMSG keyword to deal with text sometimes not being visible to all nearby players (thanks to aph for pointing this out).

- modified the way xmlspawners keep themselves from being included in container item counts to fix an issue with negative counts under RunUO 2.0 (thanks to haazen for pointing this out).

- fixed a crash bug with xmlfind when using an invalid region (thanks to seirge for pointing this out).

- fixed a possible crash bug with improperly formatted TriggerOnCarried strings (thanks to XavierWER for pointing this out).

- fixed a problem with the Repeatable flag on quests not being restored across restarts when set to false (thanks to Vladimir for pointing this out). This led to people sometimes being able to repeat non-repeatable quests.

Modified Features
- made the SENDMSG and SENDASCIIMSG keywords usable as value type keywords and not just standalone keywords. so you can do things like

SETONNEARBY,5,,playermobile/SENDMSG/Greetings friends

to send messages to all nearby players (thanks to snicker7 for the suggestion).

The syntax for these keywords is

SENDMSG[,probability][,hue]/message text
SENDASCIIMSG[,probability][,hue][,font]/message text

- modified questholders to prevent snooping by other players, but allow staff to open the questholder status gump from questholders being carried by players (thanks to snicker7 for the suggestion).

- modified the way that the DAMAGE and POISON keywords work when used as value keywords.
Now, if they are used to modify a spawn object, then their effects will be applied to the spawn object, and if a range argument is used, then things within that range from the spawn object will be affected. (thanks to aph for the suggestion)
For example this spawn entry would apply damage to all players within 5 tiles of the mob named "Blather"

SETONMOB,Blather/DAMAGE,50,20,20,20,20,20,5,playeronly

Their behavior when used as standalone keywords was not changed.

- added protection against creating infinitely looping sequential spawn definitions. Spawn entries can now only be executed once per spawner tick.

New Features
-added the new standalone keyword "SPAWN[,spawnername],subgroup" which can be used to force spawning of a particular subgroup on a particular spawner. If the spawnername arg is omitted, then the current spawner will be used.

- added a TYPE property keyword that returns the object class type. For example "GETONTRIGMOB,TYPE" would return the type of the triggering mob.

- added support for the core ISpawner interface. This now means that all items/mobiles keep track of the xmlspawner that created them through their Spawner property.
Deleted/killed spawns are now immediately removed from the spawned list instead of having to wait until the next spawner tick. When monitoring kills, this means that the spawner killcount will be updated as soon as the kills occur.

- added the new #WET and #TILES,startid[,endid] spawn control keywords. These allow you to restrict the land/static tiles that the spawns for an entry will be placed on. This works for both normal and regional spawning. Only tiles that have been frozen into the map will be checked. It will not check for static items or multis that have simply been placed in the world.
Use of either of these keywords will automatically ignore surface restrictions during spawn placement (like using * in front of the entry).
You can determine the id of a tile by simply doing a [props on it and looking at the TileID for land targets, and ItemID for static targets. You to specify a single tile or a range of tiles to be included.
The example below has 5 spawn entries.
The first uses the #WET keyword to specify that the waterelemental spawns should only be placed on tiles that have the Wet tiledata flag set (water tiles).
The second entry uses the #TILES keyword to specify that the orcs should only be spawned on dirt tiles with ids between 113-120.
The third entry has trolls that are only spawned on a variety of grass tiles.
The dolphins spawn only on water tiles with an id of 6044.
The fifth entry spawns eagles on tree tiles with id 3296.

user posted image


New to version 3.13
updated 7/6/06

- added support for the new WalkingRange property when importing/exporting RunUO 2.0 distro spawners.

- I forgot to add the updated XmlSpawnerGumps.cs script into the last update that fixed problems with the main gump not being refreshed when using the text entry book or the add item/mobiles gump. Now it is included.

- added in a conditional compilation flag to suppport people using the original RunUO 2.0 RC1 release instead of the latest SVN. If you are using RC1 uncomment the following line at the beginning of XmlSpawner2.cs. If you are using the most recent SVN then just leave this line commented out at the beginning of XmlSpawner2.cs

//#define RUNUO2RC1

- added the option to make addons created with the MULTIADDON keyword partially visible with the new PartialVisibility property (thanks to Lara for the idea). By setting this property to a percentage between 1-100, it will make that fraction of the addon components visible. An example of this is given in becomevisible.xml.

- added the '[WhatIsIt' command that will report the type and name of the target. This can be used by players or staff to provide information needed to set up quest objectives or any other situation where knowing the type and name of an object is needed. (thanks to Lara for the suggestion).

- fixed a possible crash bug when using '[xmlsave'

- fixed a problem with skill triggering not recognizing min/max skill value limits when combined with the '+' or '-' arguments for skill use success/failure (thanks to Lara for pointing this out).

- fixed a problem with old spawner names not being restored after restarts.

- fixed a bug with COLLECTNAMED objectives not being displayed properly in the quest status gump. (thanks to Discord for pointing that out).

- fixed a problem with the [xmladd gump not refreshing properly after adding a spawner or adding a spawn entry from item/mobile selection gump. For example, it would reset the AutoNumbering checkbox after placing a spawner.

- changed the default smartspawning activation level from Administrator to Owner and added a test to allow any unhidden staff, regardless of accesslevel to activate smartspawned spawners. This means that by default, all players and staff will activate smartspawned spawners. If you change the default level to Player by changing the setting of the SmartSpawnAccessLevel variable at line 100 of in xmlspawner2.cs to something like

CODE

 // specifies the level at which smartspawning will be triggered.  Players with AccessLevel above this will not trigger smartspawning unless unhidden.
 public static AccessLevel SmartSpawnAccessLevel = AccessLevel.Player;


then only players and unhidden staff will activate them, but hidden staff will not (thanks to Erica for the suggestion).

New to version 3.12
updated 6/19/06

- installation instructions for RunUO 2.0 have been added to xmlspawner2-20-v312-1of3.zip.

- fixed a problem with the main gump not refreshing after editing textentrybooks or when seleting spawns from the addcategorizedobject gump.

- added support for Nerun's new .map format in [xmlimportmap. The [xmlimportmap command will automatically detect new and old formats and import accordingly. You can even import old and new formats at the same time.

- fixed a problem with the TAKE and TAKEBYTYPE keywords not taking the correct amount from stacked items due to the change in the way RunUO 2.0 handles duping.

- changed an argument to the OnArmorHit method used by some attachments for RunUO 2.0 compatibility. This will affect some addons like the CustomAttacks/Defenses system which will be updated with this change as well.

New to version 3.11
updated 6/14/06

- added support for proximity triggering by non-player npcs. Setting the new AllowNPCTrig property on the spawner to true will allow it to be triggered by both players and non-player npcs.
NPC proximity triggering is configured the same as regular player proximity triggering by setting the ProximityRange and the other optional triggering controls such as SpawnOnTrigger or even things like SpeechTrigger (when used with xmlquestnpcs that can generate actual speech), or the PlayerTrigProp property to test for properties on the triggering npc just as it used to for players.

- a small change to the XmlDialog attachment that allows it to be reset by setting the DoReset property via an Action field in XmlDialog entries (thanks to Vladimir for the idea). This allows the use of an action such as

SETONTHIS/doreset/true

to allow the xmldialog to become immediately available for reactivation without having to wait for it to timeout from the last player.

- added a new IgnoreCarried flag to xmldialog entries that will allow them to ignore the Trigger/NoTriggerOnCarried settings that normally control their activation (thanks to Vladimir for the idea). Previously, if the Trigger/NoTriggerOnCarried fields were set then all speech-dependent entries required that condition to be satisfied before they could be activated. In the [xmledit gump, the flag can be toggled by checking the new IgnoreCar box.

This will allow you to set up entries that you want to keep separate from the main triggering conditions.


- added a check to xmldialogs to prevent assigning invalid speechhue values (greater than 37852) that could cause client crashes.

- added the new spawn position control keywords #DXY,dx,dy[,dz] and #XY,x,y[,z].

#DXY will place the spawn at the specified delta xy coordinates relative to the spawner location.
#XY will place the spawn at the specified absolute xy coordinates.

For example, the spawn entries

#DXY,2,3 ; orc
#XY,5441,1700 ; troll

would spawn an orc at a location relative to the spawner and a troll at an absolute location.

- fixed a problem in referring to mobile or item type properties when assigning other mobile or item type properties. Mobile or Item type properties that return the name as well as the serial numbers of the target were not being properly parsed that caused examples like masterhelper.xml not to work. So spawn entries like

SETONSPAWN,1/combatant/GETONSPAWN,2,combatant

will now work properly.

- added the ability for [xmlfind to search spawners based on the type of objects being spawned and not just the spawner entry string itself. By specifying the search type as either 'xmlspawner' or 'spawner' and checking the new 'type' checkbox next to the 'entry' field, the entry string will be treated as the type of the spawn entry to be found instead of just a string to be matched against the spawn entry.
With both the entry and type boxes checked, the search will find all spawners that contain entries that are of the the specified type. So to find all spawners with vendors on them, specify an entry field of 'basevendor'.
This will work for both xmlspawners and regular distro spawners.

finding all spawners with baseweapon type spawn entries
user posted image

- fixed a possible [xmlfind search results gump display synchronization problem. This may have produced garbled text or lost client connections when displaying search results under certain conditions. (thanks to LowCastle and CEO for pointing this out).

- added a new attachment called XmlDeathAction. This attachment, when applied to a creature allows any spawnable action to be performed on the creatures death. (thanks to Syntria for the idea). This could include sending the killer a gump or a message, adding items to the corpse, spawning another creature, etc. (the killer is considered to be the trigger mob in these actions).
An example of these applications is included in deathaction.xml in xmlextras.zip. Just "[xmlloadhere deathaction.xml" and start killing the creatures to see what happens.
For example, with this spawn entry

harpy/ATTACH/<xmldeathaction/action/@GUMP,Harpy be gone,0/Congratulations! You killed a harpy.

killing the harpy gives you this
user posted image

You must perform xmlspawner installation step #2 for this attachment to work.

- added the XmlAddTithing attachment which is just like the XmlAddFame, or XmlAddKarma attachments but for tithing points.

- fixed a problem with TalkingBaseEscortable destinations that were not being properly restored after server restarts (thanks to EtraDor for pointing this out).

- added the 'stafflevel' property of the staffcloak (or any other item) to the protected property list that blocks any attempt to set it via xmlspawner to prevent possible exploits (thanks to snicker7 for pointing that out).

- spawn entry strings displayed in the properties list on mouseover of the spawner crystal are now truncated at 20 chars. This improves the appearance and avoids any problems the client might have trying to display extremely long spawn entries.

New to version 3.10
updated 5/18/06

- added the "#RELXY,xinc,yinc[,zinc]" spawn positioning control keyword.
This will position the spawn relative to the previously placed spawn by the amount xinc,yinc.

- added the ability to specify multiple spawn control keywords in a single entry by separating them with semicolons. This also adds the requirement that all # spawn control keywords be separated from the main spawn entry with a semicolon and not just white space.

- added FastestPlayerSpeed and MovingPlayerCount properties that can be tested for on the spawner that will report the maximum movement speed and number of nearby moving players. Proximity detection must be enabled on the spawner by setting ProximityRange in order to make use of these properties.

- added the "#CONDITION,proptest" spawn control keyword that allows individual entries to be made conditional on the specified property test.
When combined with the new FastestPlayerSpeed and MovingPlayerCount properties, you can make spawn entries that will depend on the speed and number of nearby players with entries like

#CONDITION,movingplayercount<2 ; orc

which would only spawn the orc if fewer than 2 players were moving nearby.

#CONDITION,fastestplayerspeed>5 ; #PLAYER,3 ; orc

Which would only spawn the orcs if some player was moving faster than 5 tiles per second and would additionally have the orcs placed within 3 tiles of the triggering player when they are spawned.

You can use the same kind of condition tests that can be used anywhere else, such as compound tests or tests for properties on carried items, or triggering players, etc. For example,

#CONDITION,GETONTRIGMOB,skills.magery.value>100 ; lichlord

would only spawn the lichlord if the triggering player had magery greater than 100.

- added an example of this in SpeedKills.xml to xmlextras.zip. Just do an "[xmlloadhere speedkills.xml". If a player creeps slowly past the spawner, they can avoid triggering any spawns. If they walk past the spawner, it will trigger 3 orcs around them. If the player runs past at medium speed, they will spawn 2 trolls. If they run at maximum speed, they will spawn a titan. (thanks to Sunshine for the idea).

- allow the use of empty attachment names when referring to attachment properties using the GET series of keywords with "[ATTACHMENT,type,name,property]", This will ignore the attachment name when finding the attachment as in "GETONTRIGMOB,[ATTACHMENT,xmlquestpoints,,points]"

- enable the use of the EQUIP and ADD keywords with mobs that do not have packs by default. If these keywords are used on mobs that dont have backpacks to begin with, then they will automatically be given a pack.

- added the ability to access container contents in the SETONNEARBY keyword with the new 'searchcontainers' argument. The new syntax is

SETONNEARBY,range,name[,type][,searchcontainers]/prop/value/prop/value...

where searchcontainers is a flag set to true or false (default is false). This will only access containers that are placed in the world, not containers carried by mobiles. If searchcontainers is set, then only items in containers will be included.

So, to delete all ginseng found in containers within 5 tiles of the spawner but not on the ground, you could use the spawn entry

SETONNEARBY,5,,ginseng,true/DELETE

Without the searchcontainers argument, or setting it to false it would delete all ginseng on the ground within 5 tiles of the spawner but not in containers.

An example of the use of this for filling and deleting contents of nearby boxes can be found in the nearbyboxes.xml example in xmlextras.zip (thanks to snicker7 for the idea).

New to version 3.09a
updated 5/8/06

- added two new spawn position control keywords, #PLAYER, and #WAYPOINT.

#PLAYER[,range] - plac