Introduction
Welcome to the documentation of Octet. This project aims to provide a versatile and feature-rich platform for running a private Yogurting Game Server.
Compatible with Quartet XML Score files while expanding schema’s capabilities
Restores some of the game’s features (E.g. Friends, Calls)
Cross-platform compatibility
Enhanced security
Partial episode support
API interface, mainly for creating accounts
Command Console
Octet is dedicated to those who share a common goal โ revisited a cherished game that was unfortunately discontinued. Whether you’re a passionate game enthusiast yearning for the nostalgia of the past, a server administrator seeking a more capable solution, you’re in a right place.
For the Game’s Enthusiasts, this is an opportunity to reconnect with the world they once loved. Server Administrators can easily migrate from Quartet to Octet, benefitting from its features, and make players love the same, but freshened gameplay ideas.
This documentation serves as a comprehensive guide to help you understand, install, and configure Octet Game Server. Whether you’re a first-time user or an experienced server operator, this documentation will assist you in making the most of Octet.
Since Octet was written in Java, Java 17 Runtime Environment or a higher version is required. The latest version of OpenJDK is recommended. Download OpenJDK here
After downloading, unzip the contents to a folder that suits you, such as C:\Program Files\openjdk
.
To use Java from the command line or terminal, you need to add the Java bin directory to your system’s PATH variable. Here’s how to do it:
Open System Properties: Right-click on “This PC” or “My Computer” and select “Properties”. Then, click on “Advanced system settings” on the left sidebar.
Open Environment Variables: In the System Properties window, click on the “Environment Variables” button.
Edit PATH Variable: In the Environment Variables window, find the “Path” variable in the “System variables” section and select it. Then, click on the “Edit” button.
Add Java Bin Directory: In the Edit Environment Variable window, click on the "New" button and provide path to OpenJDK's bin directory. For version 22.0.1, it will be `C:\Program Files\openjdk\jdk-22.0.1\bin`, but for other versions of OpenJDK, the folder will be named differently. Click “OK” to save the changes.
Add JAVA_HOME Variable: In the Environment Variables window, click on the “New” button in the “System variables” section. Enter JAVA_HOME
as the variable name and enter path to the Java installation directory as the variable value. Click “OK” to save the changes.
Verify Installation: Open a new command prompt or terminal window and type java -version
. If Java is correctly added to the PATH, it should display the Java version information.
Octet utilizes MySQL Database Management System (DBMS) to store players’ data. Its installation and configuration are required for Octet to run. Get MySQL Community Edition from here.
The installer will start by asking you what components you want to install. The server only option is recommended, but you can install components such as Workbench if you want.
After installation, the configuration process begins. It’s worth to set the configuration type to Server Computer. You can also change the port number, but you will have to reflect the change in db-host.
You need to use the Strong Password Encryption method for authentication:
Set a password for the root account.
It’s also worth to create a separate account for Octet. If the MySQL server will be hosted on the same computer as Octet, use the localhost
option in the host field. This will prevent any connection from outside the host machine. However, if the database will be hosted elsewhere, select <All Hosts (%)>
. With the provided password, Octet will log in to the database and write player data there.
Windows service settings are best left as they are. Changing them may cause errors in the next step.
Since Octet was written in Java, Java 17 Runtime Environment or a higher version is required. I recommend using the latest version of OpenJDK 17. Here’s how to install it on Linux based on Debian distribution:
Java installation
1sudo apt update && sudo apt install openjdk-17-jre
Octet utilizes MySQL Database Management System (DBMS) to store players’ data. Its installation and configuration are required for Octet to run. My recommendation for a Debian-based Linux is to use MariaDB:
MariaDB (MySQL) installation
1sudo apt install mariadb-server 2sudo mysql_secure_installation
octet
can connect from localhost
and his password is secret
.โ ๏ธ Notice: Remember to change the login credentials and hostname if the database will run on a different computer than the one Octet will be running on.
After creating a user, you need to grant him permissions. Then, flush privileges to make sure they got saved.
That completes the configuration of a database server for Octet.
MariaDB User creation
1sudo mariadb 2CREATE USER 'octet'@'localhost' IDENTIFIED BY 'secret'; 3GRANT ALL ON *.* TO 'octet'@'localhost'; 4FLUSH PRIVILEGES;
Now, it’s time to download Octet on your machine. Grab a release from here.
Extract the archive to a desired folder and run:
java -jar octet.jar
Run Octet
1java -jar octet.jar
If Octet does not load the configuration file correctly, for instance when the file does not exist, it will generate a new default file and ask the user whether he wants to use the configuration wizard that will guide him through the setup process.
All available settings are described below.
Score is the common name for files that define the content of game locations, called “Fields” using XML files. Octet reuses Quartet’s XML schema to ensure compatibility of existing scripts.
Folders containing score files must be located within the resources folder. Each score file should be placed in a subfolder named after the respective field code. To find the field codes, refer to the Field.txt file located in the resources/db folder.
Here are the cultivatable fields categorized by their prefixes:
For example, to define the Estiva Ground Field, create a folder titled SF001001 in the score directory. You can now place XML files in this folder to define Field’s score. XML files can have any name. It’s a good practice to have a default XML file detailing objects like warpgates, hairdressers, lockers etc and separate XML Files for each NPC intended for this field.
Sample scheme:
1โโโ resources 2 โโโ score 3 โโโ SF001001 4 โโโ default.xml 5 โโโ npc_anna.xml 6 โโโ npc_mocha.xml 7 โโโ npc_suchon.xml 8 โโโ npc_ben.xml 9 โโโ npc_peko.xml 10 โโโ npc_no1.xml 11 โโโ npc_no2.xml
A Score file should adhere to the following structure:
1<?xml version="1.0" encoding="UTF-8"?> 2<field> 3 <!-- Score content here --> 4</field>
Within the field tags, you’ll include the content relevant to your score. The nodes you can use are described below.
Warpgate is an object that allows players to move between Fields.
id int
Identification number. Must be unique.
x int
X Position. Actual coordinates multiplied by 100.
y int
Y Position. Actual coordinates multiplied by 100.
shell int
Appearance.
idCli int
Unknown. It is best to use the one provided in the default XML.
dir int
Direction.
idDestField int
Destination field’s identification number. Refer to Field.txt to obtain field IDs.
xDest int
X coordinates to which the player will be moved.
yDest int
Y coordinates to which the player will be moved.
Warpgate example
<warpgate id="1" x="7590" y="11499" shell="78" idCli="818" dir="0" idDestField="2" xDest="66" yDest="103"/>
Episode Gate is an entry point for players into episodes. They can create an episode waiting rooms and then play episodes within them.
subid int
EpisodeGate ID. Best not to modify.
idCli int
Unknown. It is best to use the one provided in the default XML.
shell int
Appearance.
x int
X Position.
y int
Y Position.
dir int
Direction.
visible boolean
Set visibility.
usable boolean
Set if can be used or not.
Determine episodes available to play in EpisodeGate.
id int
Episode ID. Refer to Episode.txt.
grade int
Grade required to play an episode.
Episode gate example
<episodegate subid="10001" idCli="543" shell="82" x="61" y="98" dir="0" visible="1" usable="1">
<episode id="1" grade="1" name="Wizard of Oz"/>
</episodegate>
Create a capsule machine. Used by players to draw dancing CoItems.
totalAmount int
Number of capsules held.
price int
Price for each item draw.
subid int
Unknown. Best not to modify.
idCli int
Unknown. It is best to use the one provided in the default XML.
shell int
Appearance.
x int
X Position.
y int
Y Position.
dir int
Direction.
visible boolean
Set visibility.
usable boolean
Set if can be used or not.
Identify the products available to draw from the vending machine.
type int
Specify the consumable item type. Refer to CoItemType.txt
amount int
Quantity given to player
secret boolean
Hide the item icon.
Vending machine example
<vmachine totalAmount="100" price="100" subid="101" idCli="142" shell="87" x="28" y="17" dir="0" visible="1" usable="1">
<product type="60001" amount="10" secret="false"/>
<product type="60010" amount="3" secret="false"/>
<product type="60019" amount="2" secret="true"/>
</vmachine>
Players can store items in lockers.
subid int
Unknown. It is best to use the one provided in the default XML.
idCli int
Unknown. It is best to use the one provided in the default XML.
shell int
Appearance.
x int
X Position.
y int
Y Position.
dir int
Direction.
visible boolean
Set visibility.
usable boolean
Set if can be used or not.
Locker example
<locker subid="137" idCli="137" shell="86" x="350" y="18" dir="6" visible="1" usable="1"/>
At the hairdresser, players can change appearance of their character, more specifically the color and their hairstyle.
subid int
Unknown. It is best to use the one provided in the default XML.
idCli int
Unknown. It is best to use the one provided in the default XML.
shell int
Appearance.
x int
X Position.
y int
Y Position.
dir int
Direction.
visible boolean
Set visibility.
usable boolean
Set if can be used or not.
Hairdresser example
<hairdresser subid="356" idCli="356" shell="84" x="118" y="56" dir="4" visible="1" usable="1"/>
NPCs are the main foundation of Score. They control a huge chunk of the gameplay on the server.
1<npc id="365" shell="78" x="72" y="68" dir="6" init="init"> 2<!-- NPC Content here --> 3</npc> 4
id int
ID. Refer to NpcEx.txt to obtain IDs corresponding to specific NPCs.
shell int
NPC Appearance.
x int
X Position.
y int
Y Position.
dir int
Direction.
init string
Default label name. Enter the name of the dialog or script.
Define a conversation dialog.
npcid int
NPC number, Optional. If not set, the NPC ID set in the <npc> node will be used. Useful when you want to display a CutIn image from a different NPCs.
name string
Label name. Has to be unique since it’s used to navigate through dialogs.
cutin int
NPC’s image. 0 by default, but you can provide an incremental number for NPCs that have more CutIns (1, 2, 3, etc.) You can set it as a variable.
timeout int
Time after which the dialog will be closed. Optional.
choiceontimeout int
Selection that will be selected upon timeout. Optional.
closebutton boolean
Controls the state of the dialog close button. true - on, false - off. Optional, close button is enabled by default.
bgframeclick boolean
Determine whether the dialog can be closed when you click on an area outside the dialog box. Optional, default is false.
Text
Dialog text. You can use text such as <br>, <font>, <b> or <i>. You can also use ${variables}. It is recommended to enclose the text in a CDATA section.
selection defines the available options to respond to the NPC. You can add up to 3 selections.
name string
Specify the label name for the next dialog, etc. If omitted, the dialog will end.
text string
Text of the answer. You can use ${variables}.
op string
Specify the process to be executed when selected. Optional. Available values:
set - Set variable’s value.
inc - Increment a variable by 1.
dec - Decrease a variable by -1.
varname string
Variable name used by the op process. Required if op is specified.
value string
Specify a value. ${variables} can be used. Required only if op is specified and set.
NPC Dialog example
1<dialog name="anna_1" cutin="0" closebutton="0"> 2 <text><![CDATA[ 3 Hello! I'm Anna! I'm very happy to meet you! 4 ]]></text> 5 <selection next="anna_2" text="Hello Anna!"/> 6</dialog>
Display the item purchase screen.
name string
Label name.
Define BeItems that will be available to buy.
type string
BeItem ID. Refer to BeItemType.txt
price int
BeItem’s price.
Define CoItems that will be available to buy.
type string
CoItem ID. Refer to CoItemType.txt
price int
CoItem’s price.
Define EnItems that will be available to buy.
type string
EnItem ID. Refer to EnItemType.txt
price int
EnItem’s price.
NPC Buy
1<buy name="no2_buy"> 2 <beitem type="110006" price="100" /> 3 <coitem type="10001" price="50" /> 4 <enitem type="10001" price="500" /> 5</buy>
Display the skill purchase screen.
name string
Label name.
Define skills to be displayed on the skill purchase screen.
type string
Skill ID. Refer to SkillDesc.txt.
price int
Skill’s price.
NPC Skill buy
<buyskill name = "skill_normal">
<skill type = "21001" price = "50"/>
</buyskill>
Play the bus cutscene and move player to specified coordinates.
name string
Bus name.
school int
Specify the cutscene to display. 1 is for Estiva, 2 - Sowol.
idDestField int
Destination Field ID.
xDest int
Destination X coordinates.
yDest int
Destination Y coordinates.
NPC Bus
<bus name ="sowol_bus" school="2" idDestField="90" xDest="127" yDest="166"/>
Walkpath is a completely new feature that allows NPCs to move through the field. Available to every NPC except penguins. NPCs move according to the predefined path.
interval string
The time after which the NPC will move again after a completed route. The time numeral is followed by a character indicating the time unit: s - second, m - minute, h - hour, d - day.
name string
Warp name.
idDestField int
Destination Field ID.
xDest int
Destination X coordinates.
yDest int
Destination Y coordinates.
x int
X coordinates of the point to which the NPC will head.
y int
Y coordinates of the point to which the NPC will head.
speed int
The speed at which the NPC will move to the specified point. The higher it is, the faster the movement will be.
cooldown string
The time after which the NPC will proceed to the next point. The time numeral is followed by a character indicating the time unit: s - second, m - minute, h - hour, d - day.
NPC Walkpath example
1<walkpath interval="18s"> 2 <pathpoint x="87" y="98" speed="20" cooldown="2s"/> 3 <pathpoint x="64" y="95" speed="20" cooldown="10s"/> 4 <pathpoint x="125" y="113" speed="20" cooldown="25s"/> 5 <pathpoint x="94" y="105" speed="20" cooldown="10s"/> 6</walkpath>
Declare scripts using variables and operators. Each script is executed sequentially from the top.
1<script name="mocha_script"> 2<!-- Script content here --> 3</script> 4
name string
Label name.
Thanks to if operators, actions can be performed if certain conditions are met.
Each <if> node can be followed by an <else> node that will be executed if the condition is not met.
ifeq
Checks if given variable is equal to a provided value.
ifne
Checks if given variable is not equal to a provided value.
ifge
Checks if given variable is higher or equal to a provided value.
ifle
Checks if given variable is lower or equal to a provided value.
ifdef
Checks if given variable name is defined. Does not use varname attribute.
ifndef
Checks if given variable name is not defined. Does not use varname attribute.
ifbeitem
Checks if player has a specific BeItem in his inventory. Does not use varname attribute. Use BeItem’s ID in value.
ifcoitem
Checks if player has a specific CoItem in his inventory. Does not use varname attribute. Use CoItem’s ID in value.
ifenitem
Checks if player has a specific EnItem in his inventory. Does not use varname attribute. Use EnItem’s ID in value.
ifepi
Checks if player has cleared a specific episode. Does not use varname attribute. Use Episode’s ID in value.
ifnepi
Checks if player didn’t clear a specific episode yet. Does not use varname attribute. Use Episode’s ID in value.
ifpermgroup
Checks if player is a member of a specific permission group. Does not use varname attribute. Use Permission group name in value.
ifnpermgroup
Checks if player is not a member of a specific permission group. Does not use varname attribute. Use Permission group name in value.
string
string
int
Variable-based IF operator
1<script name="nana_schoolcheck"> 2 <getcharinfo type="school" varname="player.school"/> 3 <ifeq varname="player.school" value="2"> 4 <jump label="nana_sowol"/> 5 </ifeq> 6 <else> 7 <jump label="nana_estiva"/> 8 </else> 9</script>
Episode-based IF operator
1<script name="anna_episodecheck"> 2 <ifepi value="76"> 3 <jump label="anna_deliveryepisode_complete"> 4 </ifepi> 5</script>
It’s possible to add or remove players’ items.
BeItem
Items that players can wear, such as Blades, Spirits, and footwear.
CoItems
Items such as potions that can be used by players. An abbreviated form of Consumable Items.
EnItems
Items used for enchanting, mainly reference books. Abbreviated form of Enchantment Items.
addbeitem
Gives player BeItem(s).
delbeitem
Removes BeItem(s).
addcoitem
Gives player CoItem(s).
delcoitem
Removes CoItem(s).
addenitem
Gives player EnItem(s).
delenitem
Removes EnItem(s).
type int
Be/Co/En Item ID. You can use ${variables}.
amount int
Co/En Item only. Amount of times to obtain or delete. You can use ${variables}.
equip boolean
BeItem only. Makes the player equip obtained BeItem when true. Used only in onmakechar.
Item operations
1<addbeitem type="110001"/> 2<addcoitem type="10005" amount="3"/> 3<delcoitem type="10001" amount="15"/>
set
Set the variable to a value.
add
Add a value to the variable.
sub
Subtract a value from the variable.
mul
Multiply the variable by a value.
div
Divide the variable by a value.
mod
Get the remainder when divided by the value.
inc
Increment a variable by 1.
dec
Reduce the value of the variable by 1.
rnd
Assign a random value to a variable. For example, if 10 is specified as a value, a number from 0 to 9 will be returned.
varname string
Variable name.
value string
The value used for the operation. Integers โโand ${variables} can be specified. Not used in inc and dec.
Variable Operations
1<set varname="visited.arena" value="true"/> 2<inc varname="player.arena.visitcount"/>
Using getcharinfo allows you to assign player’s values to variables.
varname string
Variable name.
type string
Specify the type of information to be acquired. Available types listed below.
name string
Retrieves character name.
grade int
Retrieves character grade.
blood int
Character’s blood type from 1 to 4 where 1 is A and 4 is O.
taff int
Retrieves character’s TAFF amount.
school int
Character’s school. 1 - Estiva, 2 - Sowol.
sex int
Character’s gender. 1 - Male, 2 - Female.
level int
Character Level.
hp int
Character’s current HP.
maxhp int
Character’s maximum HP.
exp int
Character’s current XP.
maxexp int
Character’s maxmimum XP.
lang string
Returns player’s selected language.
permgroup string
Returns player’s permission group.
Getcharinfo example
1<getcharinfo varname="player.hp" type="hp"/> 2<getcharinfo varname="player.maxhp" type="maxhp"/> 3<ifle varname="player.hp" value="${player.maxhp}"> 4 <jump label="inject_heal"/> 5</ifle>
Using setcharinfo allows you to change player’s values to given values.
type string
Character info type.
value string
Value of changed type.
lang string
Set player’s language. Only supported language codes can be used.
grade int
Set character grade from 1 to 6.
taff int
Modify player’s TAFF.
hp int
Set character’s HP.
exp int
Set character’s XP.
permgroup string
Set character’s permission group.
Setcharinfo Example
1<setcharinfo type="taff" value="100"/> 2<setcharinfo type="hp" value="1"/>
Using getsysinfo will retrieve server-based value and assign them to a variable.
varname string
Variable name.
type string
Type of system information to retrieve.
clock int
Get in-game time (0-3, 3 is night)
player int
Get connected players count.
Getsysinfo Example
1<getsysinfo varname="local.clock" type="clock"/> 2<getsysinfo varname="local.player" type="player"/>
getdatetime is used to get the server time.
type string
Specify the type of date and time to retrieve.
varname string
Variable name.
year
Retrieve year.
month
Retrieve month.
day
Retrieve day.
hour
Retrieve hour.
minute
retrieve minute.
second
Retrieve second.
Getdatetime Example
1<getdatetime type="month" varname="time.month"/>
A switch is a control statement that helps make decisions based on different conditions. It evaluates an expression and executes a block of code based on the value of an variable. It’s often used when you have multiple possible outcomes and need to choose one based on a specific condition.
varname string
Variable name.
Specify the values of a switch.
value
The value that will be checked against the specified varname. It’s possible to use ${variables}.
Switch Example
1<switch varname="player.school"> 2 <case value="1"> 3 <jump label="ben_estiva"/> 4 </case> 5 <case value="2"> 6 <jump label="ben_sowol"/> 7 </case> 8</switch>
Executes a specified library function.
name string
Function name. ${variables} can be used. When referring to a function defined in a specific file, you need to include both the filename and the function name separated by a dot at the beginning of the name. For instance, if your function file in the lib folder is named system.xml and the function you want to call is named func, you’d use system.func.
Call Example
<call name="system.func"/>
Jumps to the specified label name.
label string
Label the script will jump to. ${variables} can be used. Available jump destinations are: dialogs, scripts, buy, sell, crystal, attachstone, detachstone, breakstone, buyskill, message, warp and bus.
Jump example
1 <ifeq varname="player.school" value="2"> 2 <jump label="nana_sowol"/> 3 </ifeq> 4 <else> 5 <jump label="nana_estiva"/> 6 </else>
Sends a message displayed in chat to the player.
text string
Message content.
global boolean
If this value is true, sends a message to each player. If false or omitted, only the related player will receive it.
sysmsg example
<sysmsg text="Display all available commands by typing /help in the chat./>
Score scripts can be used to trigger playback of BGM, sound effects and movie cutscenes for one or more players.
bgm
Plays a background music (BGM).
se
Plays a sound effect (SE).
video
Plays a movie cutscene.
value int
BGM/SE/Movie ID. ${variables} can be used.
target string
Optional attribute to affect other players. everyone will play specified media to each player on the server. field will play to every player in the same field as NPC.
playback example
<bgm value="19"/>
<video value="104" target="everyone"/>
Monsters can only be spawned in hunt fields (fields with the HF prefix).
To do this, you need to determine the spawn points and then the type of monsters and how many of them are going to spawn. It needs to be wrapped in a generator tag.
x int
X coordinate of monster spawner.
y int
Y coordinate of monster spawner.
type int
Monster ID. Refer to HuntMon.txt.
count int
The number of monsters that will be spawning across defined spawners.
active boolean
If true, monsters will attack the player as soon as they notice him.
Monster spawner
1 <generator> 2 <point x="34" y="36"/> 3 <point x="43" y="36"/> 4 <point x="38" y="50"/> 5 <point x="36" y="63"/> 6 7 <monster type="1" count="48" active="true"/> 8 <monster type="2" count="68" active="true"/> 9 10 </generator>
Library score defines functions which are a set of script operations.
To create library score files, create an XML file in the resources/score/lib directory. The name of the file can be anything you want.
Sample scheme:
1resources 2โโโ score 3 โโโ lib 4 โโโ system.xml 5 โโโ my-library.xml
A Library file should adhere to the following structure:
1<?xml version="1.0" encoding="UTF-8"?> 2<library> 3<!-- Library content here... --> 4</library>
Add your functions within the library tags:
1<?xml version="1.0" encoding="UTF-8"?> 2<library> 3 <function name="hello"> 4 <getcharinfo type="name" varname="player.name"/> 5 <sysmsg text="Hello ${player.name}!"/> 6 </function> 7</library>
Use the same schema as for NPC scripts except for jump operation to program functions. Functions defined in library score can be called using the <call> tag inside the NPC script.
Mail Order, also called SpecialPhone, is a feature allowing players to call a number for an additional fee to purchase items delivered instantly to their inventory.
File that defines SpecialPhone should be located in resources/score and must be named SpecialPhone.xml
to work properly.
SpecialPhone.xml
should start and end with a
You can add a maximum of 2 NPCs. The NPC first in order will be No. 2, the second one will be No. 27.
Octet has commands unified with chat and CLI. They allow to manage the server conveniently. Some of the commands use a special syntax to make the time specifying possible. Specify the time followed by a character indicating the time unit: s
for seconds, m
for minutes, h
for hours, or d
for days.
There are also commands that can be executed only by the console or only by players. The player executing the command must be a member of the permission group that allows that command to be executed.
In command descriptions, arguments surrounded by <inequality symbols> mean required arguments, and arguments surrounded in [square brackets] are optional.
Commands executed via chat must be entered with a prefix (/), e.g. /speed 3 20
.
๐ป Console only
Manage accounts on the server
create
Create an account on the server. A prompt to enter the password will appear after entering the command.
Usage: account create <Account name>
delete
Delete an account from the server. A prompt to reconfirm deletion will appear after entering the command.
Usage: account delete <Account name>
Permission code: command.account
Disallow a player from sending chat messages.
mute <Player> [Time] [Reason]
<Player>
: The player you want to mute.[Time]
(Optional): The duration for which the player will be muted. Specify the time followed by a character indicating the time unit: s
for seconds, m
for minutes, h
for hours, or d
for days. If not specified, the mute is permanent.[Reason]
(Optional): The reason for muting the player.Usage:
mute loudman53 1h Spamming chat
This command will mute loudman53
for 1 hour for spamming chat.
Permission code: command.mute
Disallow player to access the server.
If a player is banned, a message about a ban will be sent to each player via chat.
ban <Player> [Time] [Reason]
<Player>
: The player you want to mute.[Time]
(Optional): The duration for which the player will be banned. Specify the time followed by a character indicating the time unit: s
for seconds, m
for minutes, h
for hours, or d
for days. If not specified, the ban is permanent.[Reason]
(Optional): The reason for banning the player.Usage:
ban funnyplayer 14d Use of prohibited software
This command will ban funnyplayer
for 14 days for use of prohibited software.
Permission code: command.ban
Manage permission groups and assign them to players.
perm player <Player> set <PermissionGroup>
<Player>
: The player whose permission group you want to change.<PermissionGroup>
: The permission group to set for the player. Refer to permission-groups.yml.perm player tastybacon set GM
This example will set tastybacon
’s permission group to GM
or GameMaster.
Permission code: command.permission
Aliases: perm
Set player’s level.
level [Level] [Player]
[Level]
: Number from 1 to 300 representing the level. If not specified, level will increase by 1.[Player]
: Player who will be affected by the command. If not specified, that player will be the one executing the command. Required when executed by the console.level 42 brightstar987
Permission code: command.level
๐ฌ Chat only
Moves player to his previous location or to a saved location.
back [Memo]
[Memo]
(Optional): Saved location, number from 0-9. For more information, see Memo.Permission code: command.back
๐ฌ Chat only
Saves current position under specified number from 0-9. Use back to move to the saved location.
memo <Index>
<Index>
: Index of stored location from 0 to 9.Permission code: command.memo
๐ฌ Chat only
Changes issuer’s attack/movement speed.
speed [AttackSpeed] [MovementSpeed]
[AttackSpeed]
(Optional): The attack speed number to set.[MovementSpeed]
(Optional): The movement speed number to set.
If both arguments are not provided, default speed will be set.Permission code: command.speed
Gives player a specific CoItem
coitem <CoItem ID> [Amount] [Player]
<CoItem ID>
: The ID of the item to be given.[Amount]
(Optional): Number of items that will be given.[Player]
(Optional): The player to whom the item will be given. Required when executing from the console.Permission code: command.coitem
Gives player a specific EnItem
enitem <EnItem ID> [Amount] [Player]
<EnItem ID>
: The ID of the item to be given.[Amount]
(Optional): Number of items that will be given.[Player]
(Optional): The player to whom the item will be given. Required when executing from the console.Permission code: command.enitem
Announces an message to all players.
announce <Text>
<Text>
: Announcement content. Before sending, the command checks whether a message with this name exists in announce-schedule.yml
file. If it exists, a message from that file will be sent. If not, the typed text will be sent.Permission code: command.announce
Whitelist is a feature that allows you to restrict access to the server only for particular permission groups. The whitelist command is used to manage whitelist status.
whitelist [boolean]
[boolean]
(Optional): Enables whitelist if true, disables the whitelist if false. If not provided, shows current whitelist status.Permission code: command.whitelist
Modify variables within your character
<VarName>
: The name of the variable.<Value>
: The value to set for the variable (only used with set
command).set
Set the value of a variable.
var set <Varname> <Value>
get
Retrieve the value of a variable.
var get <Varname>
del
Delete a variable.
var del
Aliases: variable
Permission code: command.variable
Spawns a monster in the hunt field.
spawn <MonsterID> [FieldID] [X] [Y]
<MonsterID>
: The ID of the monster to spawn.[FieldID]
(Optional): The ID of the field where the monster will spawn. Required when executing from console.[X]
(Optional): The X-coordinate of the spawn location.[Y]
(Optional): The Y-coordinate of the spawn location.If no arguments are provided, the monster will spawn in a random coordinates in the same field of the issuer if the field is hunt field.
Permission code: command.spawn
๐ฌ Chat only
Allow a player to change their character name. The player will see the change only after re-logging.
charname <Player> <NewName>
<Player>
: Targeted player.<NewName>
: The new character name the player wishes to change to.Aliases: name
Permission code: command.charname
๐ป Console only
Manage API keys and API status.
api keys
api status
api start
api stop
api addkey <Name> [Timestamp]
api delkey <Name>
api showkey <Name>
keys
: Show a list of API keys.status
: Check the API status.start
: Start the API.stop
: Stop the API.addkey <Name> [Timestamp]
: Add an API key with an optional expiry timestamp. Timestamp format: yyyy-mm-ddThh:mm:ssdelkey <Name>
: Delete an API key.showkey <Name>
: Show details of a specific API key.Permission code: command.api
Permission groups are a system that determines what commands can be executed by players. Players’ privileges are defined by the permission group they belong to.
GameMaster (GM)
Otherwise known as the server administrator. He can manage items, TAFF, or the server itself.
Communnity Manager (CM)
Community Managers moderate players’ behavior and issue punishments in case of prohibited actions.
Player
Default permission group of each player. Enables basic commands.
When running Octet in developer mode, the GM group is given an attack speed of 3 and a movement speed of 20 when joining the server.
In the permission file you can add new permission groups and change the access to commands that each group has.
The file is located in resources/permission-groups.yml
.
To add a new permission group to your server, follow these steps:
Open the Permission Groups Configuration File: Locate and open the YAML file where the permission groups are defined. The file is located in resources/permission-groups.yml
.
Define the New Permission Group: Inside the file, add a new section for the permission group you want to create. The section should include the following information:
Group Name
: The name of the permission group.Description
: A brief description of the permission group.Default
: Whether the group should be assigned to new players by default.Whitelisted
: Whether the group is whitelisted (only specific players can join).Permissions
: A list of permissions granted to this group. Permissions control what actions members of this group can perform. Refer to commands section to obtain permission codes for each command.Save the Changes: Save the changes you made.
Suppose you want to add a new permission group named “Regular Player” with the following characteristics:
chat.read
: Allow members to read chat messages.chat.send
: Allow members to send chat messages.command.about
: Allow members to view information about the server.game.*
: Allow members to access all game actions.Your entry in the permission-groups.yml
file would look like this:
1RegularPlayer: 2 description: This is a default Regular Player permission group. 3 default: true 4 whitelisted: false 5 permissions: 6 - chat.read 7 - chat.send 8 - command.about 9 - game.*
Announce schedule is a feature that allows you to broadcast messages to every player on the server in multiple languages.
In announce-schedule.yml
located in the resources
folder, you can set custom messages and their broadcast interval.
To add new announcements to your announce schedule, open announce-schedule.yml
and add a new section for the announcement you want to create. The section should include the following information:
Event Name
: A unique identifier for the announcement.Interval
: The time interval between each announcement. Specify the time followed by a character indicating the time unit: s
for seconds, m
for minutes, h
for hours, or d
for days. It is also possible to specify a zero time value, such as 0s
so that it can only be announced with the announce command.Text
: Key for the message content. Each translation is denoted by a language code (`ja` for Japanese, `kr` for Korean, and `en` for English) followed by a colon (:), and then the corresponding message content.Suppose you want to add a new announcement named “New Announcement” with the following characteristics:
Your entry in the configuration file would look like this:
1new-announcement: 2 interval: 1h 3 text: 4 ja: ใใใฏๆฐใใใ็ฅใใใงใใ 5 kr: ์ด๊ฒ์ ์๋ก์ด ๊ณต์ง์ ๋๋ค. 6 en: This is a new announcement.
Octet has an API designed to be integrated with a private game server website to create accounts using a registration form.
The server authenticates API requests using the Authorization Bearer method. When making an API request, the request header should include the following:
Content-Type: This specifies the media type(s) that are sent in the request. It should be set to application/json
.
Authorization: This header field contains the authentication credentials for the request. In the Bearer method, the value should be prefixed with the word "Bearer" followed by a space and then the token. For example: Authorization: Bearer <Token>
. The <Token>
represents the authentication token that is generated using the api command.
The accounts
POST endpoint is used to manage accounts.
The request body should be in JSON format and include the following fields:
Required Fields:
username
: The username of the new account. It should be at least 3 characters long.password
: The password of the new account. It should be at least 5 characters long.lang
: The preferred language of the user.Optional Fields:
email
: The email address of the user. If specified, a verification code will be generated and sent back.verified
: A boolean value indicating whether the new account should be automatically verified if true
.Success Response: If the account is successfully created, a 201 Created response is returned.
Error Response: If there are any validation errors or if the request fails for any reason, an appropriate error response with the corresponding HTTP status code and error message is returned.
curl -i localhost:7000/accounts -H "Content-Type: application/json" -H "Authorization: Bearer <Token>" --data '{"username":"freshfox43","password":"secret", "email":"[email protected]","lang":"en"}'
Example Request
1Content-Type: application/json 2Authorization: Bearer z56YzVNyElIp4aic7czvvyhFpnotn6KL 3{ 4 "username": "freshfox43", 5 "password": "secret", 6 "email": "[email protected]", 7 "lang": "en" 8}
Example Response
1{ 2 "vercode":"y6HUrtrrpQsKRZUzEBalxpIoIKgO2ZJI", 3 "username":"freshfox43" 4}
The accounts/verify
POST endpoint is used to verify accounts.
The request body should be in JSON format and include the following fields:
username
: The username of the account to be verified.vercode
: The verification code generated in /accounts request.curl -i localhost:7000/accounts/verify -H "Content-Type: application/json" -H "Authorization: Bearer <Token>" --data '{"username":"freshfox43","vercode":"<verificationCode>"}'
Example Request
1Content-Type: application/json 2Authorization: Bearer z56YzVNyElIp4aic7czvvyhFpnotn6KL 3{ 4 "username": "freshfox43", 5 "vercode": "y6HUrtrrpQsKRZUzEBalxpIoIKgO2ZJI" 6}
One of Octet’s main goals is to restore as many features as possible from the game suppport period.
The table with the re-implemented functions is shown below.
Feature | Status | Comments |
---|---|---|
Character creation/deletion | โ๏ธ | No tutorial |
Level | โ ๏ธ | Same as Quartet |
Grade | โ๏ธ | |
Titles | โ ๏ธ | Each of them unlocked due to bitwise encoding |
Name Tag | โ๏ธ | Can be set using /tag |
Picket | โ๏ธ | |
Skills | โ ๏ธ | Passive skills not working |
Visible Range | โ๏ธ | Can be changed in octet.cfg |
Weapons | โ๏ธ | |
Clothes | โ๏ธ | |
Materials | โ๏ธ | |
Enchant | โ๏ธ | |
Dance | โ๏ธ | |
Potions | โ๏ธ | |
Boxes | โ | Plan to implement soon |
Star Item | โ | |
TAFF | โ๏ธ | |
Monster fight | โ๏ธ | |
NPCs | โ๏ธ | |
Monsters | โ๏ธ | |
Hairdresser | โ๏ธ | |
Capsule Machine | โ๏ธ | |
Lockers | โ๏ธ | |
Warp-gates | โ๏ธ | |
NPC Buy/Sell | โ๏ธ | |
Special Phone | โ๏ธ | |
Chat | โ๏ธ | |
Club | โ | |
Phone | โ๏ธ | |
Trade | โ๏ธ | |
Auction | โ | |
Episodes | โ ๏ธ | Re-implementation process |