# World effects

Each marker in game can have its own FX world effects for example such as smoke/any other effect/your custom coded one

You can add another world effect list in directory: `xdiskjockey/worldeffects/config/*.lua`

Each file in the directory mentioned above represent the DJ mixer and its own custom effects

The basic code to make a new one would look like this:

```lua
-- The key must be same like in Config.MixerList otherwise it wont show in mixer
Config.WorldEffects["Galaxy club"] = {
	effects = {
		-- first effect
		{
			-- effect enum name (Will be described below)
			name = Effects.COMET,

			-- What kind of button type it is (Will be described below)
			ButtonType = ButtonType.TOGGLE,

			-- position list where all the effect will happen
			position = {
				-- first position
				{
					-- the mixer position
					mixerPosition = vector3(-1595, -3012, -79),
					particlesPosition = {
						-- pos = position where the effect will happened
						-- rot = rotation of the effect
						-- the last argument for rotation is unusually the scale of the effect.
						{ pos = vector3(-1596.2, -3008.02, -80.8), rot = vector4(-90.0, 0, 0, 1.5) },
						{ pos = vector3(-1598.43, -3015.68, -80.8), rot = vector4(-90.0, 0, 0, 1.5) },
					}
				},
				-- another one
				{
					--......
				},
			},
		},
		-- second effect
		{
			--....  
		},
	},
}
```

So what is the: `Effects`?

Effects is enum of existing and ready to use in-game effects, can be used for EVERY mixer in game ( beside player spawned one )

You can find all existing effects in `xdiskjockey/const.lua`

```lua
-- do not change anything from here
Effects = {
	------------------------------------
	--- FX Effects
	------------------------------------
	SMOKE_FLOOR = "smoke_floor",
	SPARKLERS = "sparklers",
	YELLOW_BAR = "yellow_bar",
	RED_BAR = "red_bar",
	COMET = "comet",
	RGB = "rgb",

	FIREWORK_ONE = "FIREWORK_ONE",
	FIREWORK_TWO = "FIREWORK_TWO",
	FIREWORK_THREE = "FIREWORK_THREE",
	FIREWORK_STREAM = "FIREWORK_STREAM",

	------------------------------------
	--- objects list
	------------------------------------
	PANEL_OBJECTS = "PANEL_OBJECTS",

	REMOVE_PANEL = "REMOVE_PANEL",
	PANEL_PURPLE = "PANEL_PURPLE",
	PANEL_GREEN = "PANEL_GREEN",
	PANEL_PINK = "PANEL_PINK",

	--

	NEON_OBJECTS = "NEON_OBJECTS",

	REMOVE_NEON = "REMOVE_NEON",
	NEON_OBJECT_YELLOW = "NEON_OBJECT_YELLOW",
	NEON_OBJECT_WHITE = "NEON_OBJECT_WHITE",
	NEON_OBJECT_PURPLE = "NEON_OBJECT_PURPLE",
	NEON_OBJECT_CYAN = "NEON_OBJECT_CYAN",

	--

	LIGHT_OBJECTS = "LIGHT_OBJECTS",

	REMOVE_LIGHT = "REMOVE_LIGHT",
	LIGHT_OBJECT_YELLOW = "LIGHT_OBJECT_YELLOW",
	LIGHT_OBJECT_GREEN = "LIGHT_OBJECT_GREEN",
	LIGHT_OBJECT_WHITE = "LIGHT_OBJECT_WHITE",
	LIGHT_OBJECT_PURPLE = "LIGHT_OBJECT_PURPLE",

	--

	BANDS_OBJECTS = "BANDS_OBJECTS",

	REMOVE_BANDS = "REMOVE_BANDS",
	BANDS_OBJECT_YELLOW = "BANDS_OBJECT_YELLOW",
	BANDS_OBJECT_GREEN = "BANDS_OBJECT_GREEN",
	BANDS_OBJECT_WHITE = "BANDS_OBJECT_WHITE",
	BANDS_OBJECT_CYAN = "BANDS_OBJECT_CYAN",
}
```

So what is the: ButtonType?

ButtonType are all kind of buttons type lets see which one are which

* Button: simple UI button (for one time use)
* Toggle: it is switch button (this is used for effects you want to turn off in for example 5/10/20 minutes or never thats up to you)
* list: list of the FX effects that are possible to use

You can find all existing button types in `xdiskjockey/const.lua`

```lua
ButtonType = {
	BUTTON = "button",
	TOGGLE = "toggle",
	LIST = "list",
}
```

Let's see some example for some button types

ButtonType.BUTTON example

```lua
-- The key must be same like in Config.MixerList otherwise it wont show in mixer
Config.WorldEffects["Vinewood Bowl"] = {
	effects = {
		{
			name = Effects.SPARKLERS,

			ButtonType = ButtonType.BUTTON,

			-- this variable will work only with Button type effects
			RemoveAfterTime = 10000,

			-- this is working for both vanilla unicorn + gabz map aswell
			position = {
				{
					-- This is a center position / mixer position where the effects will be rendered
					mixerPosition = vector3(684.02, 571.54, 130.46),
					particlesPosition = {
						{ pos = vector3(687.64, 567.76, 129.46), rot = vector4(0, 0, 0, 0.6) },
						{ pos = vector3(679.02, 571.07, 129.46), rot = vector4(0, 0, 0, 0.6) },
						{ pos = vector3(681.29, 568.09, 129.46), rot = vector4(0, 0, 0, 0.6) },
						{ pos = vector3(684.18, 567.04, 129.46), rot = vector4(0, 0, 0, 0.6) },
					}
				},
			},
		},
	}
}
```

ButtonType.LIST example

```lua
-- The key must be same like in Config.MixerList otherwise it wont show in mixer
Config.WorldEffects["Vinewood Bowl"] = {
	effects = {
		{
			-- this need an extra identifier which should describe all effects in the "name" 
			-- in this case PANEL_OBJECTS
			identifier = Effects.PANEL_OBJECTS,

			name = {
				Effects.REMOVE_PANEL,
				Effects.PANEL_PURPLE,
				Effects.PANEL_GREEN,
				Effects.PANEL_PINK
			},

			ButtonType = ButtonType.LIST,

			position = {
				{
					-- This is a center position / mixer position where the effects will be rendered
					mixerPosition = vector3(684.02, 571.54, 130.46),
					particlesPosition = {
						{ pos = vector3(694.5, 563.5466, 126.465), rot = vector4(0, 0, 250, 0.0) },
						{ pos = vector3(672.8753, 571.6515, 126.465), rot = vector4(0, 0, 250, 0.0) },
					}
				},
			},
		},
	}
}
```

ButtonType.TOGGLE example

```lua
-- The key must be same like in Config.MixerList otherwise it wont show in mixer
Config.WorldEffects["Vinewood Bowl"] = {
	effects = {
		{
			label = "Gold bars",
			name = Effects.YELLOW_BAR,

			-- on toggle it will spawn gold bars, on disable it will disable them
			ButtonType = ButtonType.TOGGLE,

			position = {
				{
					-- This is a center position / mixer position where the effects will be rendered
					mixerPosition = vec3(-1387.117432, -620.849243, 30.819593),
					particlesPosition = {
						{ pos = vec3(-1381.110352, -624.237183, 30.819550), rot = vector4(90, 0, 0, 1.0) },
						{ pos = vec3(-1391.769897, -624.655151, 30.819599), rot = vector4(90, 0, 0, 1.0) },
						{ pos = vec3(-1394.501709, -620.457947, 30.819548), rot = vector4(90, 0, 0, 1.0) },
					}
				},
			},
		},
	}
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.rcore.cz/paid-resources/xdiskjockey/config/world_effects.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
