Compatibility
BetonQuest can hook into other plugins to extend its functionality. Currently there are 22 plugins: BountifulAPI, Citizens, Denizen, EffectLib, Heroes, HolographicDisplays, JobsReborn, LegendQuest, Magic, mcMMO, MythicMobs, PlaceholderAPI, PlayerPoints, ProtocolLib, Quests, RacesAndClasses, Shopkeepers, SkillAPI, Skript, Vault, WorldEdit and WorldGuard.
BountifulAPI
Events
Title: title
BountifulAPI enables you to use title event without spamming the console with /title command output. The syntax is exactly the same as in regular title event described in Events List.
Example
1 | title subtitle 0;0;0 {en} Lobby joined! {pl} Dołączono do lobby!
|
Citizens
If you have this plugin you can use it's NPCs for conversations. I highly recommend you installing it, these NPCs are way more immersive. Having Citizens also allows you to use NPCKill objective.
Notice
When you use Citizens, in main.yml you need to specify the ID of the NPC instead of the name!
Conditions
NPC distance: npcdistance
This condition will return true if the player is closer to the NPC with the given ID than the given distance. The NPCs ID is the first argument, the distance is the second. If the npc is despawned the condition will return false.
Example
1 | npcdistance 16 22
|
NPC location: npclocation
persistent, static
This condition will return true if a npc is close to a location. First argument is the id of the NPC, second the location and third the maximum distance to the location that the npc is allowed to have.
Example
1 | npclocation 16 4.0;14.0;-20.0;world 22
|
NPC region: npcregion
persistent, static
Notice
This condition also requires WorldGuard to work.
This condition will return true if a npc is inside a region. First argument is the id of the npc second is the name of the region.
Example
1 | npcregion 16 spawn`
|
Events
Move NPC: movenpc
This event will make the NPC move to a specified location. It will not return on its own, so you have to set a single path point with /npc path command - it will then return to that point every time. If you make it move too far away, it will teleport or break, so beware. You can change maximum pathfinding range in Citizens configuration files. The first argument in this event is ID of the NPC to move. Second one is a location in a standard format (like in teleport event). You can also specify multiple locations separated by colons to let the npc follow a path of locations. You can also specify additional arguments: block will block the NPC so you won't be able to start a conversation with him while he is moving, wait: is a number of tick the NPC will wait at its destination before firing events, done: is a list of events fired after reaching the destination, fail: is a list of events fired if this event fails. Move event can fail if the NPC is already moving for another player.
Example
1 | movenpc 121 100;200;300;world,105;200;280;world block wait:20 done:msg_were_here,give_reward fail:msg_cant_go,give_reward
|
Objectives
NPC Interact: npcinteract
The player has to right-click on the NPC with specified ID. It can also optionally cancel the action, so the conversation won't start. The first argument is number (ID of the NPC), and the second is optional cancel.
Example
1 | npcinteract 3 cancel conditions:sneak events:steal`
|
NPC Kill: npckill
NPC Kill objective requires the player to kill an NPC with the given ID. You can also define how many times an NPC has to be killed. Right after objective's name there must be na ID of the NPC. You can also add an amount by amount:.
Example
1 | npckill 16 amount:3 events:reward`
|
NPC Range: npcrange
The player has to enter/leave a circle with the given radius around the NPC to complete this objective. First argument is the ID of the NPC, second one is either enter or leave and the third one is the range.
Example
1 | npcrange 3 enter 20 events:master_inRange
|
Denizen
Events
Script: script
With this event you can fire Denizen task scripts. Don't confuse it with skript event, these are different. The first and only argument is the name of the script.
Example
1 | script beton
|
EffectLib
If you install this plugin on your server you will be able to set a particle effect on NPCs with conversations and use particle event.
You can control the behaviour of particles around the NPCs in custom.yml file, in npc_effects section. Each effect is defined as a separate subsection and consists of EffectLib options (described on the EffectLib page) and several BetonQuest settings. npcs is a list of all NPCs on which this effect can be displayed. conditions is a list of conditions the player has to meet in order to see the effect. BetonQuest will find the first effect which can be displayed and show it to the player. interval controls how often the effect is displayed (in ticks). The effect will be fired from the exact location of the NPC, upwards.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | npc_effects: check_interval: 50 disabled: false farmer: class: VortexEffect iterations: 20 particle: crit_magic helixes: 3 circles: 1 grow: 0.1 radius: 0.5 interval: 30 npcs: - 1 conditions: - '!con_tag_started' - '!con_tag_finished' |
Events
Particle: particle
This event will load an effect defined in effects section in
custom.yml file and display it on player's location. The only argument
is the name of the effect. You can optionally add loc: argument
followed by a location written like 100;200;300;world;180;-90 to put
it on that location. If you add private argument the effect will only
be displayed to the player for which you ran the event.
Example
In custom.yml
1 2 3 4 5 6 7 8 9 | effects: beton: class: HelixEffect iterations: 100 particle: smoke helixes: 5 circles: 20 grow: 3 radius: 30 |
In events.yml
1 | particle beton loc:100;200;300;world;180;-90 private`
|
Heroes
When you install Heroes, all kills done via this plugin's skills will be counted in MobKill objectives.
Conditions
Class: heroesclass
This condition checks the classes of the player. The first argument must be primary, secondary or mastered. Second is the name of a class or any. You can optionally specify level: argument followed by the required level of the player.
Example
1 | heroesclass mastered warrior
|
Skill: heroesskill
This condition checks if the player can use specified skill. The first argument is the name of the skill.
Example
1 | heroesskill charge`
|
Events
Experience: heroesexp
This event simply gives the player specified amount of Heroes experience. The first argument is either primary or secondary and it means player's class. Second one is the amount of experience to add.
Example
1 | heroesexp primary 1000
|
HolographicDisplays
Installing this plugin will enable you to create hidden holograms, which will be shown to players only if they meet specified conditions. Note that you need to have ProtocolLib installed in order to hide holograms from certain players.
In order to create a hologram, you have to add holograms section in your custom.yml file. Add a node named as your hologram to this section and define lines, conditions and location subnodes. The fist one should be a list of texts - these will be the lines of a hologram. Color codes are supported. Second is a list of conditions separated by commas. Third is a location in a standard format, like in teleport event. An example of such hologram definition:
1 2 3 4 5 6 7 8 | holograms: beton: lines: - '&bThis is Beton.' - 'item:MAP' - '&eBeton is strong.' location: 100;200;300;world conditions: has_some_quest, !finished_some_quest |
A line can also represent a floating item. To do so enter the line as 'item:MATERIAL'. It will be replaced with the MATERIAL defined. In the above example, a floating map will be seen between two lines of text.
The holograms are updated every 10 seconds. If you want to make it faster, add hologram_update_interval option in config.yml file and set it to a number of ticks you want to pass between updates (one second is 20 ticks). Don't set it to 0 or negative numbers, it will result in an error.
If Citizens is also installed then you can have holograms configured relative to an npc. Add the following to custom.yml.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | npc_holograms: # How often to check conditions check_interval: 100 # Holograms follow npcs when they move (higher cpu when true) follow: false # Disable npc_holograms disabled: false # Hologram Settings default: # Lines in hologram lines: - ! # Vector offset to NPC position to place hologram vector: 0;3;0 # Conditions to display hologram conditions: has_some_quest, !finished_some_quest # NPC's to apply these settings to. If blank, applies by default npcs: - 0 - 22 |
Item lines are also supported here.
JobsReborn
Requires adding the following to config.yml:
1 2 | hook: jobs: 'true' |
Conditions
Can Level up: nujobs_canlevel {jobname}
Returns true if the player can level up
Has Job: nujobs_hasjob {jobname}
Returns true if the player has this job
Example
1 | nujobs_hasjob Woodcutter
|
Job Full: nujobs_jobfull {jobname}
Returns true if the job is at the maximum slots
Job Level: nujobs_joblevel {jobname} {min} {max}
Returns true if the player has this job, and at a level equal to or between the min/max
Example
1 | nujobs_joblevel Woodcutter 5 10
|
Events
Add Experience: nujobs_addexp {jobname} {exp}
Gives the player experience
Increase Level: nujobs_addlevel {jobname} {amount}
Increases the player level by amount.
Decrease Level: nujobs_dellevel {jobname} {amount}
Decreases the players level by amount.
Join Job: nujobs_joinjob {jobname}
Joins the player to job.
Leave Job: nujobs_leavejob {jobname}
Removes the player from job.
Set Level: nujobs_setlevel {jobname} {level}
Set the player to level.
Objectives
Join Job: nujobs_joinjob {jobname}
Triggers when player joins job.
Leave Job: nujobs_leavejob {jobname}
Triggers when player leaves job.
Notice
This is not triggered by '/jobs leaveall'
Job Levelup: nujobs_levelup {jobname}
Triggers when player levels up.
Job Payment: nujobs_payment {amount}
Triggers when player makes {amount} of money from jobs.
LegendQuest
Conditions
Attribute: lqattribute
Checks player's attributes. The first argument is attribute (STR, CON, DEX, INT, WIS, CHR) and the second argument is a number - minimal required level of the attribute.
Example
1 | lqattribute INT 10
|
Class: lqclass
Checks if the player has specified class. It can also check subclass if you add --subclass argument.
Example
1 | lqclass Cleric`
|
Karma: lqkarma
Checks if the player has specified amount of karma. The only argument is a number - minimal amount of karma required.
Example
1 | lqkarma 20
|
Race: lqrace
Checks if the player has specified race.
Example
1 | lqrace Dwarf`
|
Variables
Attribute: lqattribute
Resolves to player's attribute. The first argument is name of the attribute (like in lqattribute condition), second one is either amount or left: followed by a number. First of these will simply display attribute level and second will display the difference between attribute level and the number.
Example
1 | %lqattribute.str.left:13 |
Class: lqclass
Resolves to player's class.
Example
1 | %lqclass% |
Karma: lqkarma
Resolves to player's karma. The only argument here is either amount or left: followed by a number. First of these will simply display karma amount and second will display the difference between karma amount and the number.
Example
1 | %lqkarma.amount% |
Race: lqrace
Resolves to player's race.
Example
1 | %lqrace% |
Magic
Conditions
Wand: wand
This condition can check wands. The first argument is either hand, inventory or lost. If you choose lost, the condition will check if the player has lost a wand. If you choose hand, the condition will check if you're holding a wand in your hand. inventory will check your whole inventory instead of just the hand. In case of hand and inventory arguments you can also add optional name: argument followed by the name of the wand (as defined in wands.yml in Magic plugin) to check if it's the specific type of the wand. In the case of inventory you can specify an amount with amount and this will only return true if a player has that amount. You can also use optional spells: argument, followed by a list of spells separated with a comma. Each spell in this list can have defined minimal level required, after a colon.
Example
1 | wand hand name:master spells:flare,missile:2
|
McMMO
Conditions
Level: mcmmolevel
This conditions checks if the player has high enough level in the specified skill. The first argument is the name of the skill, second one is the minimum level the player needs to have to pass this condition.
Example
1 | mcmmolevel woodcutting 50
|
Events
Experience: mcmmoexp
This event adds experience points in a specified skill. The first argument is the name of the skill, second one is the amount of experience to add.
Example
1 | mcmmoexp swords 1500
|
MythicMobs
Having MythicMobs allows you to use MythicMobs MobKill objective and MythicMobs SpawnMob event.
Objectives
MobKill: mmobkill
To complete this objective you need to kill specified amount of MythicMobs. The first argument must be the mob's internal name (the one defined in MythicMobs' configuration). You can optionally add amount: argument to specify how many of these mobs the player needs to kill. You can also add "notify" keyword if you want to display to players the amount of mobs left to kill.
Example
1 | mmobkill SkeletalKnight amount:2 events:reward
|
SpawnMob: mspawnmob
Spawn specified amount of MythicMobs at given location. The first argument is a location defined like 100;200;300;world. Second is MythicMobs internal name (the one defined in MythicMobs' configuration) followed by a colon and a level. Third one is amount and it's required!
Example
1 | mspawnmob 100;200;300;world SkeletalKnight:1 5
|
PlaceholderAPI
If you have this plugin, BetonQuest will add a betonquest placeholder to it and you will be able to use ph variable in your conversations.
Placeholder: betonquest
In any other plugin which uses PlaceholderAPI you can use BetonQuest variables with %betonquest_package:variable% placeholder. The package: part is the name of a package. If you skip this, the plugin will assume you're using that variable in default package. The variable part is just a BetonQuest variable without percentage characters, like point.beton.amount.
Example
1 | %betonquest_someGreatQuest:objective.killZombies.left% |
Variable: ph
You can also use placeholders from other plugins in BetonQuest. Simply insert a variable starting with ph, the second argument should be the placeholder without percentage characters.
Example
1 | %ph.player_item_in_hand% |
PlayerPoints
Conditions
PlayerPoints: playerpoints
This condition simply checks if the player has specified amount of points in the PlayerPoints plugin. The only argument is a number.
Example
1 | playerpoints 100
|
Events
PlayerPoints: playerpoints
This event simply adds, removes or multiplies points in the PlayerPoints plugin. The only argument is a number, it can be positive, negative or prefixed with an asterisk for multiplication.
Example
1 | playerpoints *2
|
ProtocolLib
Hiding NPC's
Having ProtocolLib installed will let you hide Citizens NPCs if specified conditions are met. You can do that by adding hide_npcs section to custom.yml file in your package. There you can assign conditions to specific NPC IDs:
1 2 3 | hide_npcs: 41: killedAlready,questStarted 127: '!questStarted' |
Conversation IO: menu
A conversation IO that makes use of a chat menu system. A video of it in action can be seen here.
Customize how it looks by adding the following lines to custom.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | menu_conv_io: line_length: 50 refresh_delay: 180 npc_wrap: '&l &r' npc_text: '&l &r&f{npc_text}' npc_text_reset: '&f' option_wrap: '&r&l &l &l &l &r' option_text: '&l &l &l &l &r&8[ &b{option_text}&8 ]' option_text_reset: '&b' option_selected: '&l &r &r&7»&r &8[ &f&n{option_text}&8 ]' option_selected_reset: '&f' option_selected_wrap: '&r&l &l &l &l &r&f&n' control_select: jump,left_click control_cancel: sneak control_move: scroll,move npc_name_type: chat npc_name_align: center npc_name_format: '&e{npc_name}&r' |
Where:
line_length- Maximum size of a line till its wrappedrefresh_delay- Specify how many ticks to auto update display. Default 180npc_wrap- What text to prefix each new line in the NPC text that wrapsnpc_text- How to write the NPC text. Replaces {1} with the npcs textnpc_text_reset- When a color reset is found, what to replace it withoption_wrap- What text to prefix each new line in an option that wrapsoption_text- How to write an option. Replaces {1} with the option textoption_text_reset- When a color reset is found, what to replace it withoption_selected- How to write a selected option. Replaces {1} with the option textoption_selected_reset- When a color reset is found, what to replace it withoption_selected_wrap- What text to prefix each new line in a selected option that wrapscontrol_select- Space separated actions to select. Can be any of 'jump', 'left_click', 'sneak'control_cancel- Space separated actions to select. Can be any of 'jump', 'left_click', 'sneak'control_move- Space separated actions to move selection. Can be any of 'move', 'scroll'npc_name_type- Type of NPC name display. Can be one of: 'none', 'chat'npc_name_align- For npc name type of 'chat', how to align name. One of: 'left', 'right', 'center'npc_name_format- How to format the npc name
Variables:
{npc_text}- The text the NPC says{option_text}- The option text{npc_name}- The name of the NPC
Chat Interceptor: packet
Intercept pretty much anything sent to the player by intercepting packets sent to them. This can be enabled by default by setting the default_interceptor to packet in config.yml or per conversation by setting interceptor to packet in the top level of the conversation.
Quests
Quests is another questing plugin, which offers very simple creation of quests. If you don't want to spend a lot of time to write advanced quests in BetonQuest but you need a specific thing from this plugin you can use Custom Event Reward or Custom Condition Requirement. Alternatively, if you have a lot of quests written in Quests, but want to integrate them with the conversation system, you can use quest event and quest condition.
Condition Requirement (Quests)
When adding requirements to a quest, choose "Custom requirement" and then select "BetonQuest condition". Now specify condition's name and it's package (like package.conditionName). Quests will check BetonQuest condition when starting the quest.
Event Reward (Quests)
When adding rewards to a quest or a stage, choose "Custom reward" and then select "BetonQuest event". Now specify event's name and it's package (like package.eventName). Quests will fire BetonQuest event when this reward will run.
Conditions
Quest condition: quest
This condition is met when the player has completed the specified quest. The first and only argument is the name of the quest. It it contains any spaces replace them with _.
Example
1 | quest stone_miner
|
Events
Quest: quest
This event will start the quest for the player. The first argument must be the name of the quest, as defined in name option in the quest. If the name contains any spaces replace them with _. You can optionally add check-requirements argument if you want the event to respect this quest's requirements (otherwise the quest will be forced to be started).
Example
1 | quest stone_miner check-requirements
|
RacesAndClasses
Another race/class/skill plugin. By installing RacesAndClasses you gain access to these events, conditions and variables:
Conditions
Class: racclass
This conditions checks if the player has specified class. You can use none to check if he does not have any class.
Example
1 | racclass warrior
|
Experience: racexo
This condition is met if the player has experience equal or greater than specified.
Example
1 | racexo 600
|
Level: raclevel
This condition is met if the player has a level equal or greater than specified.
Example
1 | raclevel 5
|
Mana: racmana
This condition is met if the player has mana equal or greater than specified.
Example
1 | racmana 1
|
Race: racrace
This condition checks if the player has specified race. You can use none to check if he does not have any race.
Example
1 | racrace Elv
|
Trait: ractrait
This condition checks if the player has the specified trait.
Example
1 | ractrait SwordDamageIncreaseTrait
|
Events
Class: racclass
This event sets player's class to the specified one.
Example
1 | racclass magician
|
Experience: racexo
This event adds (or removes if negative) experience.
Example
1 | racexo 100
|
Level: raclevel
This event adds (or removes if negative) levels.
Example
1 | raclevel -2
|
Mana: racmana
This event adds (or removes if negative) mana. You can use refill instead of a number to simply set mana to player's maximum.
Example
1 | racmana refill
|
Race: racrace
This event sets player's race to the specified one.
Example
1 | racrace Orc
|
Variables
Class: racclass
This variable resolves to class name.
Example
1 | %racclass% |
Experience: racexo
This variable has 2 possible arguments: amount will resolve to player's experience and left: will display how much experience the player lacks to the specified number.
Example
1 | %racexo:amount% |
Level: raclevel
This variable has 2 possible arguments: amount will resolve to player's level and left: will display how many levels the player lacks to the specified number.
Example
1 | %raclevel.left:5% |
Race: racrace
This variable resolves to race name.
Example
1 | %racrace% |
Shopkeepers
Conditions
Shop amount: shopamount
This condition checks if the player owns specified (or greater) amount of shops. It doesn't matter what type these shops are. The only argument is a number - minimum amount of shops.
Example
1 | shopamount 2
|
Events
Open shop window: shopkeeper
This event opens a trading window of a Villager. The only argument is the uniqueID of the shop. You can find it in Shopkeepers/saves.yml file, under uniqueID option.
Example
1 | shopkeeper b687538e-14ce-4b77-ae9f-e83b12f0b929
|
SkillAPI
Conditions
Class: skillapiclass
This condition checks if the player has specified class or a child class of the specified one. The first argument is simply the name of a class. You can add exact argument if you want to check for that exact class, without checking child classes.
Example
1 | skillapiclass warrior
|
Level: skillapilevel
This condition checks if the player has specified or greater level is the specified class. The first argument is class name, the second one is the required level.
Example
1 | skillapilevel warrior 3
|
Skript
BetonQuest can also hook into Skript. Firstly, to avoid any confusion, I will refere to everything here by name of the plugin (Skript event is something else than BetonQuest event). Having Skript on your server will enable using BetonQuest events and conditions in scripts, and also trigger them by BetonQuest event.
Skript event triggered by BetonQuest skript event
This entry will describe two things: Skript event and BetonQuest event.
- Skript event -
on [betonquest] event "id"- this is the line you use in your scripts to trigger the code.betonquestpart is optional, andidis just some string, which must be equal to the one you specified in BetonQuest event. - BetonQuest event -
skript- this event will trigger the above Skript event in your scripts. The instruction string accepts only one argument, id of the event. It have to be the same as the one defined in Skript event for it to be triggered.
Example
In your script
1 | on betonquest event "concrete": |
In events.yml
1 | fire_concrete_script: skript concrete |
Skript condition
You can check BetonQuest conditions in your scripts by using the syntax player meets [betonquest] condition "id". betonquest is optional, and id is the name of the condition, as defined in conditions.yml.
Example
In your script
1 | player meets condition "has_ore"
|
In conditions.yml
1 | has_ore: item iron_ore:5 |
Skript event
You can also fire BetonQuest events with scripts. The syntax for Skript effect is fire [betonquest] event "id" for player. Everything else works just like in condition above.
Example
In your script
1 | fire event "give_emeralds" for player
|
In events.yml
1 | give_emeralds: give emerald:5 |
Vault
By installing Vault you enable Permission event and Money condition/event.
Conditions
Money: money
Checks if the player has specified amount of money. You can specify only one argument, amount integer. It cannot be negative!
Example
1 | money 500
|
Events
Money: money
Deposits, withdraws or multiplies money on player's account. There is only one argument, amount of money to modify. It can be positive, negative or start with an asterisk for multiplication.
Example
1 | money -100
|
Permission: permission
Adds or removes a permission or a group. First argument is add or remove. It's self-explanatory. Second is perm or group. It also shouldn't be hard to figure out. Next thing is actual string you want to add/remove. At the end you can also specify world in which you want these permissions. If the world name is ommited then permission/group will be global.
Example
1 | permission remove group bandit world_nether
|
Variables
Money: money
There is only one argument in this variable, amount for showing money amount or left: followed by a number for showing the difference between it and amount of money.
Example
1 | %money.left:500% |
WorldEdit
Events
Paste schematic: paste
This event will paste a schematic at the given location. The first argument is a location and the second one is the name of schematic file. The file must be located in WorldEdit/schematics and have a name like some_building.schematic. An optional noair can be added to paste ignoring air blocks.
Example
1 | paste 100;200;300;world some_building noair
|
WorldGuard
Conditions
Inside Region: region
This condition is met when the player is inside the specified region. The only argument is the name of the region.
Example
1 | region beton
|
Objectives
Enter Region: region
To complete this objective you need to enter WorldGuard region with specified name. A required argument is the name of the region and you may also pass an optional entry and/or exit to only trigger when entering or exiting a region instead of anytime inside a region.
Example
1 | region beton events:kill
|