CustomPets.xml

Adds pets and rideable mounts as helper items (equip slot 8). Pets follow the character and can collect zen; mounts are ridden, with their own animation set and movement speed. Both are injected into the item table at boot and synced to the client automatically.

File Location#

Data/Plugins/Items/CustomPets.xml

Loaded once at GameServer startup and streamed to clients on connect. Models live in Data/CustomPets/ (item and pet models) and Data/CustomSkill/ (ridden mount meshes); the client mirrors both folders.

Schema#

<CustomPets>
    <Pet   Index="..." Name="..." Model="..." .../>
    <Mount Index="..." Name="..." ItemModel="..." MountMesh="..." .../>
</CustomPets>

Every entry occupies a group-13 sub-index. The global item index is 13 * 512 + Index, so Index="150" is item 6806.

Shared Attributes#

AttributeTypeDefaultEffect
Index150-254-Group-13 sub-index. Must be unique
Namestring (up to 31 chars)-Item name. The GameServer aborts on startup if this is longer than 31 characters
Scalefloat1.0Render scale of the model
RequireLevelint0Minimum character level to equip
Durabilityint-Maximum durability

Pet Attributes#

AttributeTypeDefaultEffect
Modelfilename-Pet model in Data/CustomPets/, with its textures beside it
IdleActionint or list0Animation(s) played while standing. A comma-separated list (up to 8) makes the pet cycle: each entry plays for at least 3 seconds and until its loop finishes, then a different one is picked at random
WalkActionint-Animation played while following the owner
ZenPickup0/101 = walks to nearby dropped zen and collects it, 0 = follow only
DamageIncreaseint0Outgoing attack bonus while equipped
Absorptionint0Incoming damage absorbed while equipped
HPDrainPerAttackint0HP subtracted per attack while the damage bonus applies
DurabilityDrainint0Durability lost per damage taken. 0 = never drains

Mount Attributes#

A mount is the same helper item, but the character rides it instead of being followed. The rider sits on the ridden mesh and plays a borrowed ride posture while the mesh plays its own animation pages. Mounts do not grant a castable skill.

AttributeTypeDefaultEffect
ItemModelfilename-Inventory-icon model in Data/CustomPets/
MountMeshfilename-Ridden animated model in Data/CustomSkill/
RiderStyleuniria | darkhorse | fenriruniriaWhich borrowed rider posture the character plays
Speedint0Movement speed while riding. 0 = no boost. For reference, Fenrir is 15-19 and Dark Horse is 17
Flying0/101 = may enter Icarus and Kanturu 3 without wings (Dinorant/Fenrir behavior). 0 = ground mount, wings still required
StuckRateint0Flinch chance while ridden, from reflect and defensive hits. 0 = never flinch
IdleAction WalkAction RunAction CastActionint or list-Mount-mesh animation pages. Each accepts a comma-separated list; out-of-range values are clamped
MountOffset"forward,side,up""0,0,0"Shifts the ridden mesh relative to the rider so the saddle lines up under the ride pose

Animation Speed#

AttributeApplies toDefault
IdleAnimSpeedPet and mount idle0.25 on pets, 0.4 on mounts
WalkAnimSpeedPet and mount walk0.25 on pets, 1.0 on mounts
RunAnimSpeedMount run0.6
CastAnimSpeedMount cast0.4

Values are animation frames per server tick. The pet defaults are deliberately conservative - if a pet looks like it is moving in slow motion, raise them (for example IdleAnimSpeed="0.4" WalkAnimSpeed="0.5").

Transparency: BlendMesh and PageModes#

Models imported from other clients often expect their glow pages to be drawn additively. Loaded as-is, those pages render as opaque black boxes.

AttributeValueEffect
BlendMesh-1None (default)
-2Every page additive
-3Auto: the largest mesh stays solid, every other page additive
NPage N additive
PageModes"0:opaque,2:additive,5:hidden"Per-page override applied on top of BlendMesh, for pages 0-15. Modes: normal/opaque, additive/add, hidden/hide. Unlisted pages inherit BlendMesh

A typical mixed model is BlendMesh="-2" PageModes="0:opaque" - everything glows except the solid body page.

There is also a no-config alternative: name the model's textures with the _R suffix (for example ghost_R.jpg) and the engine tags them at load time.

Both attributes work on <Pet> and <Mount>.

Item Options#

+Luck, +additional option and +excellent are not configured here. They come from ItemOption against the global index range 6806-6910, in the Custom Pets block appended to that file.

Examples#

<Pet Index="150" Name="Baby Bear" Model="babybear.bmd"
     IdleAction="0,1,3" WalkAction="2" Scale="0.85"
     ZenPickup="1" DamageIncrease="0" Absorption="10"
     HPDrainPerAttack="0" DurabilityDrain="0"
     RequireLevel="10" Durability="255"/>

Important Behavior#

  • Name length is fatal. A Name over 31 characters stops the GameServer at startup rather than skipping the entry.
  • Models must exist on both sides. The server only publishes filenames; the client needs the matching model and textures in Data/CustomPets/ (and Data/CustomSkill/ for ridden meshes) or the pet appears invisible.
  • Flying is enforced server-side. A ground mount does not let a wingless character into Icarus or Kanturu 3 no matter what the client shows.
  • The rider pose cannot move. It is baked into the player model, so mount alignment is corrected with MountOffset on the mount, never on the character.

Common Issues#

  • Pet or mount is invisible - model file missing on the client, or the filename in Model/MountMesh does not match the file exactly
  • Black boxes around a model - additive pages rendered opaque; set BlendMesh="-3", or -2 with PageModes="0:opaque"
  • Animation looks like slow motion - raise IdleAnimSpeed/WalkAnimSpeed, which default low for pets
  • Character floats above or sinks into the mount - tune MountOffset (forward,side,up)
  • GameServer will not start after an edit - a Name longer than 31 characters, or a duplicate Index
  • No +luck or +option ever rolls - the global index range is not covered in ItemOption

Last updated August 2, 2026