Client
- Surfaces
- Decompressing and Extraction of Client Files
- Interfaces
- Adding New Pets
- Pre-Odyssey Mini-Game
- Monster Health Bars
- Equipment Slots
- Currency Exchange Interface
- Configs
- Elementclient.exe
- Maps
- Data
- path.data
- aipolicy.data
- domain.data
- dyn_tasks.data
- dynamicobjects.data
- elements.data
- gshop.data
- screentasks.data
- task_npc.data
- tasks.data
- Models
- Console Commands
Surfaces
Emotions
Emotions are the chat smileys used in the in-game chat. Each smiley pack is stored as a DDS spritesheet ( emotions.dds, emotions0.dds, emotions1.dds, etc
) paired with a text file ( emotions.txt, emotions0.txt, emotions1.txt, etc
) that helps define where each smiley in the sheet starts and ends alongside their name and other necessary data.
Each sprite should be 40x40 pixels.
Example:
emotions.txt
is utf-16 encoded.
0 3 "01微笑" 15 29 50
3 2 "02大笑" 15 25
5 7 "03调皮" 10 20 30 40 50 60 70
12 2 "04可爱" 20 30
14 3 "05生气" 10 20 30
17 7 "06发怒" 15 25 37 50 60 70 80
24 6 "07抓狂" 10 20 30 40 50 60
30 3 "08害羞" 20 30 40
...
Start Frame | Total Frames | "Name" | Timing for each frame? |
---|---|---|---|
0 | 3 | "01微笑" | 15 29 50 |
3 | 2 | "02大笑" | 15 25 |
5 | 7 | "03调皮" | 10 20 30 40 50 60 70 |
Heaven Repository (HR) Icons
Location: surfaces.pck.files\surfaces\qshop\1
In this location you can find the icons used for gshop files. With a gshop editor this is the file names you want to place with visuals for the items you purchase from HR. (Items will have a copy in this location regardless of if you've added them to item icons in "element\surfaces.pck.files\surfaces\iconset" and set in elements).
Event Summary
The event summary is a menu that was visible in "old eso" (Pre-Odyssey). At some point they decided to remove this feature from the game but not before updating all the icons and UI.
The location of the Event Summary menu button was on the minimap in the upper right corner just below the mail icon.
Adding The UI Button Back
To add the icon back you should edit interfaces\minimap.xml
within interfaces.pck
to include the following button.
You should change the height of the entire minimap node to 185 otherwise the button will only be half clickable.
<STILLIMAGEBUTTON Name="Btn_Daily" x="152" y="162" Width="28" Height="28" Command="List_Activities">
<Hint String="Events" />
<Text FontName="方正细黑一简体" FontSize="12" />
<Resource>
<FrameUpImage FileName="button\radar_daily.tga" />
<FrameDownImage FileName="button\radar_dailydown.tga" />
</Resource>
</STILLIMAGEBUTTON>
Editing The Event Summary
The event summary menu pulls its data from surfaces\ingame\taskdaily.txt
within surfaces.pck
.
The file seems to be space delimited (5), each event on a new line and has the following columns in this order.
Day of Week | Time | Name | Level | Remarks | Line | Task ID | NPCid | Reward Item ID | Description
Example event.
"1,2,3,4,5,6,7" "00:00-24:00" "Test" "1-105" "日常" "6-15线" "4035" "0" "24072,24020,14977,7139" "This is a test event."
Decompressing and Extraction of Client Files
Ether Saga game files are compressed into .pck
archives. To decompress and extract these archives a tool called sPCK is needed.
sPCK usage is quite simple. It takes an argument for the game, whether to extract or compress, and what file to work on.
sPCK.exe -eso -x surfaces.pck
Arguments for each game are as follows:
-
-pw
- Perfect World -
-jd
- Jade Dynasty -
-fw
- Forsaken World -
-eso
- Ether Saga
You use -c
for compress or -x
for extract.
In the above example, we are telling sPCK.exe
that our .pck
file is from -eso
Ether Saga and to -x
extract the files from surfaces.pck
Extracting the files will create a folder called surfaces.pck.files
that contains all the files extracted from surfaces.pck
.
For convenience sake you can create a batch script called unpack.bat
containing the above example and change surfaces.pck
to whichever .pck
you wish to extract.
Recompressing
To recompress the files you can simple switch the -x
to a -c
and pass surfaces.pck.files
instead of surfaces.pck
.
sPCK.exe -eso -c surfaces.pck.files
For convenience sake you can create a batch script called recompress.bat
containing the above example and change surfaces.pck.files
to whichever .pck.files
you wish to recompress.
Interfaces
Adding New Pets
Locations:
Client Side - Found in interfaces.pck, location: element\interfaces.pck.files\interfaces\script
Server Side - Found in /root/kdxy/gamed/config
Pets - Petbedge_interface.lua - This file needs to be edited both client and server (separately as it has specifics exclusive to both server and client side). Clone a pet in Seledit or Rody's Angelica Editor (much easier in this editor, but it's subscription based).
We'll be using Pandapocalypse (Item ID: 34460) as an example for cloning. Basically we're going to copy everything with the ID 34460 for a new ID.
Pet Speech (continue the sequence):
If the last ending number were 2446, add 2447 and so on.
NOTE: ALL OF THE FOLLOWING IS FOR SERVER-SIDE AS THIS AS MORE SETTINGS TO BE CHANGED.
Unconfirmed as to what this edits, but we need to make sure to copy the format of #34460.
This location is the actual pet stats (this option needs to be different for both server and client side).
Server Side (all you need to do is change the number to another item ID):
Client Side (change the item ID, but the name must remain Chinese for this section to work or your game will crash):
Elements (shown in Rody's Angelica Editor):
-Game model is changed in the highlighted area to whatever you want the pet to look like
-Drop path: What the pet will look like if you drop it (default is an egg)
-Icon path (item appearance in inventory)
-File Icon Unidentify: what the pet looks like in inventory without mirror identification (suggested not to change)
-G1 Normal Icon - Usual icon
-G1 Mutated Icon - Usual icon
-File Head Icon - Uses egg icon (suggested not to change)
Example of values:
[34460] = {
{"Мèսɱ",1,3,160000,20,1,512,4,1,1549,2,2,1,51,10,1,1,224,},
{ {144.837,32.6980499999999,6.36405000000001,44.3289000000001,6.36405000000001,0,.21945,.21945,.21945,.21945,.21945,0,.2,1.3,.2,1.3,90,1,}, {10.862775,2.452354,.477304,3.324668,.477304,0,.016459,.016459,.016459,.016459,.016459,0,.015,0,.015,0,6.75,.075,}, {8600,98.09415,19.09215,132.9867,19.09215,0,.72,.72,.693,.693,.756,0,.45,0,.45,0,270,3,}, {39.91064,4.00106666666667,1.00026666666667,4.5012,1.00026666666667,0,.250066666666667,.250066666666667,.250066666666667,.250066666666667,.250066666666667,0,2.27333333333333E-04,0,2.27333333333333E-04,0,0,0,}, {2.993298,.30008,.07502,.33759,.07502,0,.018755,.018755,.018755,.018755,.018755,0,.000017,0,.000017,0,0,0,}, {164,39.2,9.9,44.4,9.9,0,.36179,.36179,.36179,.36179,.396,0,.00066,0,.0006556,0,0,0,},},
{.4,.4,.2,0,},
{0,0,{1,2,3,4,5},{10,11,14,15,16,17,51,52,25,26,29,30,31,32,42,43,},},
},
1549 would be the pet skill it naturally learns
512 would be the pet type (Demonix)
Pre-Odyssey Mini-Game
You can find the file for this in "element\interfaces.pck.files\interfaces" and would need to look for the file "winmain2.xml"
The mini-game was long since removed with the update for Odyssey but all the components are still in-game.
You just need to add a new button for the mini bar (example on the bottom of it pre-added).
Pre-Edited Mini-Game (Feel Free to Use):
<DIALOG Name="Win_Main2" Width="367" Height="48">
<EDIT Name="Img_Back" x="18" y="23" Width="346" Height="25" ReadOnly="true" MaxLen="20">
<Text FontName="方正细黑一简体" FontSize="10" Shadow="255"/>
<Resource>
<FrameImage FileName="frame\sback.tga"/>
</Resource>
</EDIT>
<STILLIMAGEBUTTON Name="Btn_Produce" x="64" Width="36" Height="48" Command="wproduce">
<Hint String="Crafting (^00ff00 O ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\SProduce.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\SProduceDown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Action" x="280" Width="36" Height="48" Command="waction">
<Hint String="Actions (^00ff00 U ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\SAction.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\SActionDown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Friend" x="100" Width="36" Height="48" Command="wsociety">
<Hint String="Friends^ffffff (^00ff00 F ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="button\friend.tga" FrameMode="1"/>
<FrameDownImage FileName="button\frienddown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_change" x="28" Width="36" Height="48" Command="wchange">
<Hint String="Transform (^00ff00 N ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="button\stransform.tga" FrameMode="1"/>
<FrameDownImage FileName="button\stransformdown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Rank" x="208" Width="36" Height="48" Command="wranklist">
<Hint String="Player Rankings (^00ff00 I ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\SRank.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\SRankDown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Achievement" x="244" Width="36" Height="48" Command="wachievement">
<Hint String="Achievements (^00ff00 V ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="button\Achievement.tga" FrameMode="1"/>
<FrameDownImage FileName="button\Achievementdown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Faction" x="172" Width="36" Height="48" Command="wfaction">
<Hint String="Alliance and Clans (^00ff00 G ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\SGuild.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\SGuildDown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_Team" x="136" Width="36" Height="48" Command="wteam">
<Hint String="Party Settings (^00ff00 T ^ffffff)"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\STeam.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\STeamDown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
<STILLIMAGEBUTTON Name="Btn_game" x="319" Width="36" Height="48" Command="wgame">
<Hint String="ESO-MiniGame"/>
<Text FontName="方正细黑一简体" FontSize="12"/>
<Resource>
<FrameUpImage FileName="Button\sgame.tga" FrameMode="1"/>
<FrameDownImage FileName="Button\sgamedown.tga" FrameMode="1"/>
</Resource>
</STILLIMAGEBUTTON>
</DIALOG>
Monster Health Bars
Location: element\interfaces.pck.files\interfaces
Warning: Issue still of not showing percentage still remains with the boss "Red-Horn Ape" and anything you may clone using this specific mob.
Files that need to be edited to add monster percentages:
targetmonster.xml
targetmonster01.xml
targetmonster02.xml
targetmonster03.xml
targetmonster04.xml
Note: Adjust X and Y coordinates as needed to make sure the percentage fits into the bar properly.
Difference (in Example):
<LABEL Name="Txt_Hp" x="90" y="24">
<Text String="100%" FontName="方正细黑一简体" FontSize="8" Shadow="100" Bold="true" OutlineColor="0,0,0,0" TextUpperColor="0,0,0,0" TextLowerColor="0,0,0,0"/>
</LABEL>
Original:
Edited:
Make sure to edit all monster .xml files.
Equipment Slots
Information stored in interfaces.pck/character.htf
Equip_10 "Fashion Headwear"
Equip_11 "Fashion Bodywear"
Equip_12 "Fashion Pants"
Equip_13 "Fashion Footwear"
Equip_14 "Fashion Backwear"
Equip_15 "Wings"
Equip_19 "Smiley"
Equip_00 "Weapon"
Equip_01 "Headwear"
Equip_02 "Bodywear"
Equip_03 "Footwear"
Equip_04 "Necklace"
Equip_05 "Ring 1"
Equip_06 "Ring 2"
Equip_07 "Fashion Eyewear"
Equip_08 "Fashion Nosewear"
Equip_09 "Fashion Beard"
Btn_weapon "Use Spirit points to\\rupgrade weapons."
Currency Exchange Interface
This is for currency exchange interfaces. This is for editing the name of currencies in previews such as the below example for Gems.
You can find this in Interfaces/ingame.stf
This is what the list of values looks like. Editing the "Reputation #" of any of these can make it appear as whatever you'd like. For example,
"6622 "Requisite Honor: %d"" instead of "Requisite Reputaion 22: %d"
This will now show as requiring the currency "Honor" in-game.
There are plenty unused currencies in-game.
Configs
In-game Database
Create and add htm files to a folder of your choosing.
The client originally had pre-made ones for several monsters. You will need to add their locations and monster IDs to the txt file monster_item.txt in configs.pck
In this case, there needs to be a "surfaces" directory in elements folder. These boss htm still exist in surfaces.pck.
If the folder "surfaces" (from the surfaces.pck) is moved to the correct location, the button above should appear next to the boss names that have the appropriate corresponding htm pages made. Above is an example with the dungeon "Crypt of Hunters" and the first boss of that dungeon, "Blackbear Sovereign"
Elementclient.exe
Chat Colors
Chat colors are hardcoded values stored in the game executable as follows:
Chat Name Color
This is stored at 0x003D745E
in elementclient.exe
. It is not hardcoded as a string but as the raw ARGB value, 8ADCFFFF
in little endian. 8ADCFFFF
is the default chat name color, FFFFDC8A
.
Player Usable Chats
int commonChatOffset = 0x0067C4BB; // Common Chat Default Color: ^FFFFFF
int partyChatOffset = 0x0067C4CB; // Party Chat Default Color: ^00FF00
int whisperChatOffset = 0x0067E983; // Whisper Chat Default Color: ^FF7FFF
int allianceChatOffset = 0x0067E993; // Alliance Chat Default Color: ^00FFFF
int clanChatOffset = 0x0067E943; // Clan Chat Default Color: ^14A9FF
int worldChatOffset = 0x0067E9A3; // World Chat Default Color: ^FFFF00
int superChatOffset = 0x0067E933; // Super Chat Default Color: ^A900C7
Non-Player Chats
int broadcastChatOffset = 0x0067C4AB; // Broadcast Chat Default Color: ^FF0000
int otherChatOffset = 0x0067E953; // Other Chat Default Color: ^B680FF
int damageChatOffset = 0x0067E973; // Damage Chat Default Color: ^FFAE00
int systemChatOffset = 0x0067E963; // System Chat Default Color: ^FF7F00
Example C# For Programmatic Editing
using System.Text;
namespace chatColorChanger
{
class Program
{
static void Main(string[] args)
{
using (BinaryWriter writer = new BinaryWriter(File.Open(args[0], FileMode.Open, FileAccess.ReadWrite)))
{
// player usable chats
int commonChatOffset = 0x0067C4BB; // Common Chat Default Color: ^FFFFFF
writer.Seek(commonChatOffset, SeekOrigin.Begin); //move your cursor to the position
writer.Write(Encoding.BigEndianUnicode.GetBytes("^00fcda")); //write new color
}
}
}
}
Launch Arguments
rendersize
ip
console
luadebug
lualog
noverchk
forcelogin
token
area
user
pwd
replay
nochangedir
Example usage
elementclient.exe console:1 user:USERNAME pwd:PASSWORD
rendersize
ip
console
Usage: console:1
Values
-
1
- Enables in-game console.
luadebug
lualog
noverchk
forcelogin
token
area
user
Usage: user:USERNAME
Replace USERNAME
with your accounts username.
pwd
Usage: pwd:PASSWORD
Replace PASSWORD
with your accounts password.
replay
nochangedir
Maps
Precinct.clt
// Element precinct file (client version)
Credit: Rouge Alma
Example #2:
PRECINCT.CLT/SEV Go To Town Configuration (example):
// Element precinct file (client version)
version 6
1136977321
"Den of Rabid Wolves"
10601 5 0 4 1 3 30 1 106 0 = WID-AID / # of co-ord lines / # of other area lines / ambiencestereo / WID TO "RELEASE" or "Town Portal" TO / BGM(music) / LEAVE TIMER / enable disable (0-1) / WID OF CURRENT MAP / Group ID
-1496.193970, 254.130005, 889.504028 = COORDINATES TO "RELEASE" or "Town Portal" TO
-512.000000 332.649017 512.000000 \
512.000000 332.649017 512.000000
512.000000 332.649017 -512.000000 co-ord lines (town limits)
-512.000000 332.649017 -512.000000
-512.000000 332.649017 512.000000 /
"Avalanche Village" -710.494019 231.817001 4244.563965 \
"Snowy Village" -2520.416016 216.925003 4100.319824
"The Forgotten Frostland" -2820.738037 241.505005 4180.767090 Other area lines (added for example only-not part of a06)[if it were it would change the very first line to this: 10601 5 (4) 4 1 3 30 1 106 0 ]
"Harshlands Officer" -2517.510010 216.667999 4109.569824 /
"ambiencestereo\dungeon4.wav"
"Music\common_e1.mp3" \
"Music\dungeon_b1.mp3" BGM(music)[3]
"Music\dungeon_c1.mp3" /
"ambiencestereo\dungeon4.wav"
--===further precinct notes===--
ambiencestereo = 0-none 1,2,3,4
BGM(music) 0-none or the number of lines of music played in sequence
Group ID for world_targets?
enable disable 0=off/disable 1=on/enable
WID = World ID
Credit: Steve Langley
Region.clt
// Element region file (client version)
version 6
1330501267
[region] Area
"长安城安全区" Area Name
1 895 0 5 PK-Zone / Area ID / ? / Number of Points
-377.255249 138.131409 457.909088
-362.873779 78.828430 -221.574158
207.600723 58.555016 -202.462250
270.362122 174.479614 475.261200
-377.240601 138.131958 457.901886
[trans] Portal
1 16 1 World ID To (e.g. Gaap) / World ID From (e.g. Pokari) / Minimum Level
-56.187237, 37.604233, -133.804794 Portal Co-ords From (e.g. Pokari)
2.500000, 25.000000, 2.500000 Portal Range Allowance
463.795013, 245.500000, 439.851013 Portal Co-ords To (e.g Gaap)
Credit: RougeAlma
[region]
"安全区"
1 10
-2530.360596 212.984573 4179.893066
-2479.267334 220.548294 4190.765625
-2437.542236 220.995117 4137.787109
-2469.698486 218.411942 4087.776855
-2505.385742 221.888626 4047.897217
-2520.250244 217.868668 4051.548096
-2579.227051 217.949570 4079.913330
-2578.665527 216.452377 4123.163086
-2546.649414 218.257568 4170.906250
-2530.360596 212.984573 4179.893066
is the safezone section
the:
[trans]
116 1 0
-2392.144043, 260.299011, 4428.956055
10.000000, 5.000000, 5.000000
-175.348999, 256.104004, -437.670990
is the region transport
[trans] = tells it the following is transport info
131 1 60 = WORLD ID TAG TO / WORLD ID TAG FROM / LV REQ (IDK why HH/TT is 1 60; when every other [trans] is 1 0)
-2708.798096, 404.276001, 1185.218994 = this line tells it the cords to teleport from the map (in which this region file is for)
5.000000, 5.000000, 5.000000 = this I am guessing is the range for which the transport area works (how far outside of the above number)
-477.000000, 131.000000, 475.000000 = this line tells it where to take you inside the new location
Credit: 343
Data
path.data
path.data
is fairly simple. It contains a mapping of ID's to asset paths.
The file starts with 4 bytes representing a timestamp
in unix epoch and 4 bytes representing the total number of paths in the file.
Each path consists of a varying number of bytes. The first 4 bytes of a path are the ID, the next 4 bytes are the length of the path in bytes. Reading bytes equivalent to the length will give you a GB2312
encoded string representing the path.
Example snippet of a path.data
export.
1,Models\npcs\怪物\植物系\木怪\木怪.ecm
2,Models\npcs\怪物\飞行系\通用蝙蝠怪\通用蝙蝠怪.ecm
3,Models\npcs\怪物\飞行系\大怪鸟\大怪鸟.ecm
4,Models\npcs\怪物\飞行系\吸血蝙蝠怪\吸血蝙蝠怪.ecm
5,Models\npcs\怪物\飞行系\吸血蝙蝠\吸血蝙蝠.ecm
6,Models\npcs\怪物\金属系\铜钱妖\铜钱妖.ecm
7,Models\npcs\怪物\金属系\怪箱子\怪箱子.ecm
An example C# class representing the data.
public class PathData
{
public Int32 Timestamp { get; set; }
public Int32 TotalPaths { get; set; }
public ESOPath[] ESOPaths { get; set; }
}
public class ESOPath : PathData
{
public Int32 ID { get; set; }
public Int32 PathLength {get; set;}
public String? FilePath { get; set; }
}
aipolicy.data
domain.data
dyn_tasks.data
dynamicobjects.data
elements.data
gshop.data
screentasks.data
task_npc.data
tasks.data
Models
Ski Files
This information is taken from resources for Perfect World. While Perfect World and other Angelica engine games are very similar there may be some differences. This information needs to be confirmed for Ether Saga.
General File Structure
Offset | Name | Data Size | Typ. Values | Meaning | Comments |
---|---|---|---|---|---|
0x0000 | moxbiksa[8] | CHAR | "MOXBIKSA" | file type identifier | Ski BMOX |
0x0008 | ski_type | DWORD | 8 or 9 | Type 9 has bone names listed, type 8 doesn't | |
0x000C | mesh_count[4] | DWORD | 1,0,0,0 or 2,0,0,0 | number of meshes | Defines a vertex_type as well. (index to mesh_count[]); so vertex_type goes (0,1,?,?) |
0x001C | tex_count | DWORD | 1 or 2 | number of textures | |
0x0020 | mat_count | DWORD | 1 or 2 | number of materials | |
0x0024 | num_bips | DWORD | 4 or more | number of “bones” | if ski_type=8, always no bips (but num_bips=4) |
0x0028 | (unknown_2) | DWORD | 0 | only value 0 spotted currently | |
0x002C | (type_mask) | DWORD | 41 or 43 or ... | num.Bones in *.bon | Seems to identify the type of Avatar; Human_Female=41, Demon_Female = 43, Human_Male = 35, ... |
0x0030 | zero_60 | DWORD | 0,0,0,... | just 15 zero DWORDs (or 60 zero BYTEs) |
IF ski_type == 9: {{{
Bone Names
0x006C Repeat [num_bips]: {{{
bone_len DWORD e.g. 12 string len (bone name)
bone_name[len] CHAR “Bip01 L Foot” the bone name string no trailing /0
}}} }}}
Textures
0x006C + (bones) Repeat [tex_count]: {{{
tex_len DWORD e.g. 16 number of bytes, not chinese letters
tex_name[len] CHAR "中式婚礼女鞋.dds” Texture file name (maybe unicode)
}}}
Materials
Repeat [mat_count]: {{{
MatHeader String-z “MATERIAL: “/0 Header for Mat.Block 10 bytes + trail-/0
mat_values[16] FLOAT 1, 1, 1, 1, 1, 1, 1, 1, (unknown) could be a matrix ...
0, 0, 0, 1, 0, 0, 0, 1 (unknown) ... or other float parameters
scale_param FLOAT 9.999 or 19,999 or 10.0 a scaling factor? (a “0” was spotted too)
is_clothing BYTE 0x00 or 0x01 if fashion or not? could be boolean
}}}
Meshes
Repeat [mesh_count]: <<<
obj_len DWORD e.g. 8 string len (mesh_obj)
mesh_obj[len] CHAR "萤火虫_0” name of the model no trailing /0
tex_index LONG_32 0 or 1 or ...? index to texture none if -1
mat_index LONG_32 0 index to materials
IF vertex_type == 1: {{{ vertex_type: (see “mesh_count[]” above)
extra_data[4] BYTE (unknown)
}}}
vertex_count DWORD 1235 number of vertices
faceverts_count DWORD 6084 number of faceverts faceverts_count = 3*face_count, because always triangles
Vertices
Repeat [vertex_count]: {{{
vertex_position[3] FLOAT (0.05, 1.0, -0.234) vertex coordinate -X, -Z, Y
IF vertex_type == 0: {{{
vertex_weight[3] FLOAT (0.7, 0.3, 0.0) bone influence ? seem 2nd value is always between 1st and 3rd
bone_index[4] BYTE (3, 12, 0, 27) list of 4 “bones” the order must be kept; don't sort!
}}}
vertex_normal[3] FLOAT vertex normal vector
vertex_UV_coord[2] FLOAT u/v-coordinate of vertex U, 1-V
}}}
Faces
Repeat [face_count]: {{{ face_count = faceverts_count / 3
vertex_index[3] USHORT_16 (123, 122, 144) 3 indices to vertices
}}}
(End Meshes) >>>
[EOF]
Console Commands
Debug Commands
Disclaimer: Most of these have been proven to work, some have yet to be tested.
System Commands
Changer render of mipmap/pixel. 0-10 high-low quality
d_mipmapbias
Sight of your camera.
d_viewradius
Seems to be useless or not working.
d_playerradius
Change the render of the trees. 0-4
d_treelod
Show/Hide Water 0-2
d_render_water
Show/Hide Grasses
d_render_grass
Show/Hide Trees
d_render_forest
Show/Hide Shadow
d_render_shadow
Show/Hide Outline
d_render_outline
Do not prevent the window from updating when it loses focus.
d_rendernofocus
Changes UI theme 0=old 1=new
d_theme
Change ingame time (client side only). Format: 10,00 (mean 10AM).
d_settimeofday
Same thing as (F9) but without the Screenshot window.
d_cameramode
Move to X, Y cords. Use d_showpos
to help you.
d_goto x, y
Move to the specified game coordinates
d_go x, y
Display all purchased EB?
d_money
Open a url in the browser
d_ie <url>
Changes window title?
d_title
Fly but only works when you have a high movement speed. For flying without speed adjustments use d_c2scmd fly
d_fly
Changes player runspeed values exceeding 5 cause rubberbanding due to server anti-cheat
d_runspeed
Seems to be useless or not working. Perhaps to use a skill?
d_skill
Seems to be useless or not working. Quests are known as Tasks may be related to completing a quest
d_task
Return to character selection screen.
d_relogin
Information
Some wire boxes on in-game objects.
d_boundbox
Show Dynamic NPC's ID in the order they were spawned.
d_npcid
Show/Hide the cords for every NPC, MOB, PLAYER (and you).
d_showpos
Show the distance between your character and the cursor.
d_testdist
Show/Hide item/npc/character's ID instead of their name. You can also get a character's ID by CTRL + Right Click
their name in chat.
d_showid
Show the server date and time.
d_getservertime
Show last login time
d_lastlogintime
Show character creation time
d_createtime
Show Debug info
Shows debug info
d_rtdebug
Show/Hide 3D game information.
d_a3dstat
Show/Hide computer and game resources.
d_gamestat
Display information related to debugging UI
d_uidebug
Show/Hide FPS in the right upper corner of the screen.
d_fps
Shows a gfc from gfc.pck (requires dir location)
d_gfx
Seems to be useless or not working.
d_skipframe
Seems to be useless or not working.
d_modelupdate
Write dump, close the game and show the Report Bug window.
d_minidump
ID Search
Search for a partial name of an item / mob / npc and get its ID in return
d_query
Type an npc id and get back its coordinates (if its already in the autopath database)
d_querynpc
Search for a partial name of an NPC Service and get its ID in return
d_queryservice
Type in a partial model path and it spits out the items that use it
d_querymodel
???
Seems to be useless or not working.
d_turnaround
Seems to be useless or not working.
d_trnlayer
Seems to be useless or not working.
d_trncull
Maybe for make some changes on GS(gamed)? GS controls the servers rates(exp/drop/gold/spirit/etc) and who knows what else.
d_gscmd
Delete command?
d_delcmd
Seems to be useless or not working.
d_namepos
Client to Server Commands
Drop gold on ground
d_c2scmd 20 <amount>
Invite player to party
d_c2scmd 27 <id>
Meditate
d_c2scmd 46
Open Self Shop
d_c2scmd 84
Initiate duel with a player
d_c2scmd 92 <id>
Take your hands? (Embrace)
d_c2scmd 95 <id>
View characters information
d_c2scmd 99 <id>
Change class
d_c2scmd 1102 0 <id>
Gain gold relevant to the equation (level*100)
d_c2scmd 1988
Change pet mood maybe?
d_c2scmd 1989 <id>
Gives exp + spirit(note this is affected by the servers exp rate and can result in receiving negative experience)
d_c2scmd 1999
Add level 1 character
d_c2scmd 2000
Create item with 1 minute timer(no idea how to change timer amount needs to be looked into)
d_c2scmd 2001 <id>
Grants double experience for target player for a duration range of 0 to 14400 seconds.
d_c2scmd 2009 <id>
Gain 100 EB
d_c2scmd 2014
Expand inventory slots by amount
d_c2scmd 2016 <amount>
Makes target player spouse
d_c2scmd 2020 <id or 0 for divorce>
Clears inventory
d_c2scmd 4444
Spawns item by quantity on the ground
d_c2scmd 10800 <id> <quantity>
Gain experience by amount(note this is affected by the servers exp rate and can result in receiving negative experience)
d_c2scmd 10889 <value>
Spawns a mob/npc for the specified duration (NPCs that are spawned are not interactable)
d_c2scmd 10802 <id> <quantity> <spawnduration> 0
Fly but not broken
d_c2scmd 10803 66
GM Commands
gm_kickout_role
gm_kickout_user
gm_list_user
gm_online_num
gm_restart_sev
gm_shutup_role
gm_shutup_user
gm_moveto_player
gm_callin_player
gm_broadcast
gm_showid
gm_forbid_role
gm_trigger_chat
gm_generate