# 🎄Merry Christmas!✝️
Merry Christmas everyone, I hope you've all had the chance to spend these last few days with your loved ones and I pray for all of you to be able to happily celebrate New Year's Eve; 2024 is coming to a close and after just over 4 months without public releases and a ton of work behind the scenes I'm happy to announce **Lusk 1.3**, this update took a while to make but I'm satisfied with the result and I think you'll be too!
> _If you're interested in getting early access to releases/features, join the [skUnity Discord](https://skunity.com/), I often give out betas and prereleases there._
# Your Lusk
To go along with this release I would also like to mention that if you have any suggestions, ideas, want to see something added or just need help with something you can [contact me at any time](https://discord.com/users/842074156405358652) or open an issue [here](https://github.com/JakeGBLP/Lusk/issues) if appropriate!
> _Where there's demand there's supply._
#
## » This is the official Download Page! «
> From now on all official releases of Lusk will only be available on Modrinth; Modrinth grants developers 75% of the ad revenue and this can REALLY help a ton when making updates!
# **Supported Versions:**
> - Minecraft 1.16.5 -> 1.21.4+ (Spigot and Paper)
> - Skript 2.6.4 -> 2.10+
# 🚀 Added:
> Each addition is paired with a working example, but for most elements multiple patterns are available, consider checking the documentation for more info.
## ⚒️ Anvil GUI:
- ### Events:
- on Anvil Gui Open: `on anvil gui open:`
- on Anvil Gui Click: `on anvil gui click:`
- on Anvil Gui Close: `on anvil gui close:`
- ### Conditions:
- Can Be Closed:`if the anvil cannot be closed:`
- is Viewing:`if {_player} is viewing any anvil gui:` ` if {_player} is viewing anvil gui {_anvilGui}:`
- ### Effects:
- Close: `close anvil gui {_anvilGui}`
- Open: `open anvil gui {_anvilGui} to {_player}`
- Prevent Closing: `prevent anvil gui {_anvilGui} from closing`
- ### Expressions:
- The Anvil Gui: `the anvil gui`
- Interactable Slots: `send the anvil gui interactable slots of {_anviGui}`
- Inventory: `anvil gui inventory of {_anvilGui}`
- Opened Anvil GUI: `currently open anvil gui of {_player}`
- First/Second/Result Item: `set the anvil gui first item of {_anvilGui} to stone named "hi"`
- Text Input/Title: `set the anvil gui text input of {_anvilGui} to "new text!"`
- New Anvil Gui:
- `set {_anvilGui} to a new anvil gui`
- `set {_anvilGui} to a new anvil gui copying {_otherAnvilGui}`
- All Open Anvil Gui: `send all of the open anvil guis`
- ### Types:
- Anvil Gui
- ### Sections:
- on Open/Close/Click Section:
```
when {_anvilGui} gets opened:
broadcast "%{_anvilGui}% has been opened!"
when {_anvilGui} gets clicked:
broadcast "%{_anvilGui}% has been clicked!"
when {_anvilGui} gets closed:
broadcast "%{_anvilGui}% has been closed!"
```
#
## 🖱️ Inventory:
- ### Expressions:
- on Inventory Click - Clicked Item: `set the clicked itemstack to stone`
#
## 🧍🏼♂️ Player:
- ### Events:
- on Inventory Slot Drop: `on player slot drop:`
- Drop Info (Condition):
- `if the item is being dropped from the cursor:`
- `if the item is not being dropped from the inventory:`
- `if the whole stack is being dropped:`
- `if the whole stack is being dropped from the cursor:`
- on Interact: #18
- `on player off hand interaction with an entity:`
- `on player interacting with a block:`
- `on player main hand interact:`
- on Velocity Change: `on player velocity change:`
- New Velocity Vector (Expression): `set the new player velocity to vector(0.4, 5, 1)`
- ### Effects:
- Start/Stop Riptiding:
- `make player start riptiding for 5 seconds`
- `make player start riptiding for 5 seconds using tool with attack damage 12`
- `make player stop riptiding`
- Sleep:
- `forcefully make {_player} sleep at {_location}`
- `try making {_player} sleep at {_location}`
- `force {_player} to sleep at {_location}`
#
## 👤 Entity:
- ### Effects:
- Make Burn Under The Sun:
- `make {_entity} not burn under the sun`
- `make {_entity} immune to the sunlight`
- ### Conditions:
- is Aggressive: `if {_entity} is aggressive:`
- ### Expressions:
- Collidable Exemptions:
- `add {_entities::*} to collidable exemptions of {_entity}`
- `set {_uuids::*} to collidable exemptions uuids of {_entities::*}`
- Client Sided Custom Name Visibility (Property): `set client sided custom name visibility of {_entity} to false`
- Item from Equipment Slot: `set equipment slot chest slot of {_entity} to iron chestplate`
- Protocol Id: `send entity id of {_entity}`
- is Aggressive (Property): `set whether {_entity} is aggressive to true`
#
## 📷 Entity Snapshot:
- ### Effects:
- Spawn:
- `spawn snapshot {_entitySnapshot} at {_location}`
- `spawn 3 of snapshots {_entitySnapshots::*} at {_location}`
- ### Expressions:
- Entity Type: `send entity snapshot type of {_entitySnapshot}`
- ### Types:
- Entity Snapshot
#
## ✏️ Item:
- ### Expressions:
- Supported/Preferred Enchantments: `broadcast supported enchantments of {_tool}`
- ### Types:
- Comparator with Item Rarity.
#
## 🧰 Skript:
- ### Events:
- on Effect Command: `on skript effect command:`
- Effect Command String (Expression): `the effect command`
## 🖼️ Item Frame:
- ### Conditions:
- is Fixed: `if item frame {_frame} is fixed:`
- is Visible / is Invisible: #17
- `if item frame {_frame} is visible:`
- `if item frame {_frame} is invisible:`
- ### Effects:
- Rotate:
- `rotate {_itemFrame} counter clockwise twice`
- `rotate {_itemFrames::*} by 45 degrees 3 times`
- set Item Silently: `silently set item frame item of {_itemFrame} to iron sword`
- ### Expressions:
- Rotation: `set the item frame rotation of {_itemFrames::*} to 45 degrees`
- Item Drop Chance: `set the item frame drop chance of {_frame} to 0.74`
- is Fixed (Property): `set whether item frame {_frame} is fixed to false`
-is Visible / is Invisible (Property): #17
- `set whether item frame {_frame} is visible to false`
- `set whether item frame {_frame} is invisible to false`
- Item (Silently Set):
```
silently:
set item frame item of {_frame} to stone
# Won't make the placing sound.
```
- ### Types:
- Rotation: `45 degrees`, `135 degrees`
#
## 🤸♂️ Armor Stand:
- ### Conditions:
- is Equipment Slot Disabled: `if chest slot is disabled for {_armorStand}:`
- ### Effects:
- Disabled Slots: `set the armor stand disable slots of {_armorStand} to chest slot and hand slot`
- is Invisible (Property): `set whether armor stand {_armorStand} is invisible to true`
- ### Types:
- BodyPart
#
## 📖 Enchanted Book:
- ### Conditions:
- has Stored Enchantments: `if {_book} has stored enchants:`
- ### Expressions:
- Stored Enchantments: `set stored enchantments of {_book} to sharpness and unbreaking 3`
#
## 🏹 Crossbow:
- ### Conditions:
- has Charged Projectiles: `if {_crossbow} has charged projectiles:`
- ### Expressions:
- Charged Projectiles: `set charged projectiles of {_crossbow} to iron sword, dirt and arrow`
#
## ⚽ Projectile:
- ### Conditions:
- has Left The Shooter: `if {_projectile} has left its shooter:`
- ### Expressions:
- has Left The Shooter (Property): `set whether {_projectile} has left its shooter to true`
#
## 🏹 Arrow:
- ### Expressions:
- Damage: `set the arrow damage of {_projectile} to 10`
- Piece Amount: `set the arrow pierce amount of {_projectile} to 3`
#
## 🐔 Chicken:
- ### Conditions:
- is Chicken Jockey: `if {_chicken} is chicken jockey:`
- ### Expressions:
- is Chicken Jockey (Property): `set whether {_chicken} is a chicken jockey to true:`
#
## ⬛ Enderman:
- ### Effects:
- Teleport Towards Entity: `teleport {_endermen::*} towards {_entity}`
#
## 🐺 Wolf:
- ### Types:
- Wolf Variant.
#
## 🐇 Rabbit:
- ### Types:
- Rabbit Type
#
## 🐟 Salmon:
- ### Types:
- Salmon Variant
#
## 🐠 Tropical Fish:
- ### Types:
- Tropical Fish Pattern
#
## 🦊 Fox:
- ### Conditions:
- Trusts Players: `if {_foxes::*} trust {_players::*}:`
- ### Expressions:
- is Crouching (Property): `set whether fox {_fox} is crouching to true:`
- is Defending (Property): `set whether fox {_fox} is defending to false:`
- is Faceplanted (Property): `set whether fox {_fox} is faceplanted to false:`
- is Leaping (Property): `set whether fox {_fox} is leaping to true:`
- Variant: `set fox variant of {_fox} to red fox type:`
- ### Types:
- Fox Variant
#
## 🍄 Mushroom Cow:
- ### Types:
- Mushroom Cow Variant
#
## 🦜 Parrot:
- ### Types:
- Parrot Variant
#
## 🦙 Llama:
- ### Types:
- Llama Color
#
## 🐎 Horse:
- ### Types:
- Horse Color
- Horse Style
#
## 🐸 Frog:
- ### Types:
- Frog Variant
#
## 🪸 Axolotl:
- ### Types:
- Axolotl Variant
#
## 🧌 Warden:
- ### Types:
- Comparator with Warden Anger.
#
## 🔮 End Crystal:
- ### Conditions:
- is Showing Bottom: `if {_endCrystal} is showing its bottom:`
- ### Effects:
- Hide/Show Bottom Plate:
- `hide end crystal bottom of {_endCrystals::*}`
- `show entity's end crystal bottom`
- ### Expressions:
- Beam Target: `set end crystal beam target location of {_endCrystals::*} to location(54, 90.5, 54)`
- is Showing Bottom (Property): `set whether ender crystal {_endCrystal} is showing the bottom to true`
#
## 👁️ Ender Signal:
- ### Conditions:
- is Going to Drop/Shatter:
- `if ender eye {_enderEye} is going to drop:`
- `if ender eye {_enderEye} is going to shatter:`
- ### Effects:
- Set Target Location Without Updating: `set the ender signal target location of {_enderEye} to {_location} without updating`
- ### Expressions:
- Despawn Time/Ticks: `set ender eye despawn time of {_enderEye} to 2 seconds`
- Item: `set ender signal item of {_enderEye} to stone`
- is Going to Drop/Shatter (Property): `set the ender signal is going to drop property of {_enderEye} to false`
- Target Location: `set ender eye target location of {_enderEye} to location of player`
#
## 🖥️ Server:
- ### Expressions:
- Version: `the server version`
#
## 🗣️ Sound:
- ### Types:
- Sound
#
## 🧊 Block:
> [!TIP]
> Most of the new Block elements support Blocks, BlockStates, BlockDatas and **Items**!
- ### Events:
- on Damage Update:
- `on block damage update:`
- `on block break progress update:`
- on Ignite [Lusk Extension]:
- `on block ignition due to lava ignition:`
- `on player block ignition:`
- ### Conditions:
- can Be Waterlogged:
- `if {_block} can be waterlogged:`
- `if tool of player can be waterlogged:`
- is Waterlogged:
- `if {_blockData} is waterlogged:`
- `if {_blockState} is not waterlogged:`
- ### Effects:
- Water Log:
- `waterlog {_blocks::*}`
- `make {_item} not waterlogged`
- ### Expressions:
- is Waterlogged (Property):
- `set whether {_block} is waterlogged to true`
- `send is waterlogged property of {_item}`
- Fluid Level Change Event - new Block Data: `set the fluid level blockdata to water[level=4]`
- ### Types:
- Ignition Cause
#
## 🪧 Sign:
- ### Conditions:
- is Waxed:
- `if tool of player is waxed:`
- `if block is waxed:`
- ### Expressions:
- is Waxed (Property):
- `set whether offhand tool of player is waxed to false`
- `send is waxed property of {_blockStates::*}`
#
## 📦 BlockState:
- ### Conditions:
- is Placed: `if {_blockState} is not placed:`
- ### Types:
- BlockState
#
## ⬡ Bounding Box:
- ### Conditions:
- Overlaps: `if {_boundingBox} overlaps {_boxes::*}:`
- ### Expressions:
- Blocks Within: `all of the blocks within {_box} in world {_world}`
- Entities Within:
- `all of the zombies in box {_box} in world {_world}`
- `all the entities in boxes {_boxes::*} in {_world}`
- Corners/Center Coordinates:
- `set {_lesserX} to the bounding box lesser x-loc of {_box}`
- `set {_centerY::*} to the bounding box center y-coord of {_boxes::*}`
- Corners/Center :
- `set {_lesserX} to the bounding box lesser corner of {_box}`
- `set {_centerY::*} to the bounding box center of {_boxes::*}`
#
## 📐 Math/Geometry:
- ### Types:
- EulerAngle: Converter to vector and back.
#
## 🧱 BlockFace:
- ### Expressions:
- Between Blocks: `set {_face} to blockface from {_block1} to {_block2}`
#
## 🏴 Banner:
- ### Expressions:
- From Pattern Type and Color: `banner pattern skull pattern type with color red`
- ### Types:
- Pattern Type
- Pattern
#
## ⏳ Time:
- ### Types:
- Timespan Period
#
## 💣 Creeper/Primed TNT/TNT Minecart:
- ### Expressions:
- Max/Regular Fuse Time/Ticks:
- `set max fuse ticks of {_creeper} to 10`
- `set fuse time of {_tntMinecart} to 4 seconds`
- `set fuse ticks of {_tnt} to 35`
#
## 🧮 3D Vectors, 4D Vectors, 2D Vectors, Location, Chunk Etc:
- ### Expressions:
- XYZ(W) Coordinate/Coordinate List:
- `send coordinate list of {_quaternion}`
- `broadcast x coordinate of {_location}`
#
## 🎨 Entity, Block, BlockState, Item:
- ### Conditions:
- is Collidable: `if {_object} is collidable:`
#
## Other:
- ### Sections:
- Run Silently:
```
silently:
set item frame item of {_frame} to iron sword # won't play the sound
```
# 📈 Changes:
## 🧍🏼♂️ Player:
- ### Conditions:
- is Crawling:
- Added plural support.
- Improved logic, it now works in cases where the player is rapidly changing pose.
- is Slim: Added offline player support.
#
## 👤 Entity:
- ### Conditions:
- is In Powdered Snow: Added plural support.
- ### Expressions:
- is Interested (Property): Added plural support.
- Origin: Added plural support.
- Spawn Category: Added plural support.
- Width: Added plural support.
- Spawn Reason: Added plural support.
- Pose: Added plural support.
- Should Burn During The Day (Property): Added paper and spigot safeties.
#
## ☄️Fireball:
- ### Expressions:
- Displayed Item: Added plural support.
#
## 🤸♂️ Armor Stand:
- ### Events:
- on Manipulate: Added `event-livingentity`.
- ### Expressions:
- Rotations:
- Switched to degrees instead of radians.
- Now uses bodyparts.
- has Arms (Property): Added item support.
- has Base Plate (Property): Added item support.
- is Marker (Property): Added item support.
- is Small (Property): Added item support.
#
## ⬛ Enderman:
- ### Events:
- on Escape: Added `event-endermanescapereason`.
- ### Effects:
- Randomly Teleport: Added spigot support.
- ### Expressions:
- Held Block Data: Added plural support.
#
## 🐐 Goat:
- ### Conditions:
- Has Left/Right/Both/Either Horn: Added plural, both horns and either horn support.
#
## 🐬 Dolphin:
- ### Expressions:
- Has Been Fed Fish (Property): Added plural support.
- Moisture Level: Added plural, 'add' and 'remove' support.
#
## 🦙 Llama:
- ### Conditions:
- is In Caravan: Added plural support.
- ### Expressions:
- Strength: Added plural support.
#
## 🐔 Chicken:
- ### Expressions:
- Egg Lay Time/Ticks: Added ticks support.
#
## 🐈 Cat:
- ### Expressions:
- is Looking Up (Property): Added plural and 'reset' support.
- is Lying Down (Property): Added plural and reset support.
#
## 🧊 Block:
- ### Conditions:
- is Full: Added blockstate support.
- ### Expressions:
- Blast Resistance: Added block, blockstate and blockdata support.
- Slipperiness: Added plural, block, blockstate and blockdata support.
#
## 🪧 Sign:
- ### Conditions:
- is Editable: Added plural and blockstate support.
- ### Expressions:
- is Editable (Property): Added plural, blockstate and item support.
#
## ⚗️ Brewing Stand:
- ### Expressions:
- Fuel Item: Added plural, blockstate and item support.
- Ingredient: Added plural, blockstate and item support.
- Fuel Level: Added plural, blockstate and item support.
- Remaining Time/Ticks: Added plural, blockstate, item and ticks support.
#
## 💽 Jukebox:
- ### Conditions:
- is Playing: Added blockstate support.
- ### Effects:
- Eject Disc: Added blockstate support.
- Start/Stop Playing: Added blockstate support.
- ### Expressions:
- Record/Disc: Added plural and blockstate support.
#
## 🔔 Bell:
- ### Conditions:
- is Resonating:
- Removed deprecation.
- Added blockstate and plural support.
- is Ringing:
- Removed deprecation.
- Added blockstate and plural support.
- ### Effects:
- Ring: Added blockstate and plural support.
- ### Expressions:
- Resonating Time/Ticks:
- Removed deprecation.
- Added blockstate and ticks support.
- Shaking Time/Ticks:
- Removed deprecation.
- Added blockstate and ticks support.
#
## ✏️ Item:
- ### Expressions:
- Unenchanted/Disenchanted: Added plural support.
#
## ⬡ Bounding Box:
- ### Expressions:
- of Entity/Block: Added blockstate support-
- New Bounding Box: Added copy/clone support.
- ### Types:
- Added converters from Entity, Block, Structure Piece and Generates Structure.
#
## ⏹️ World Border:
- ### Expressions:
- on Change - Change Duration: Added milliseconds support.
#
## 🧚🏻♀️ Allay:
- ### Conditions:
- can Be Duplicated: Added plural support.
- ### Expressions:
- can Be Duplicated (Property): Added plural support.
- Duplication Cooldown: Added plural and ticks support.
#
## 📝 String:
- ### Expressions:
- Small Capital Case; Added lenient option as opposed to "strict".
# ⚙️ Internal Changes:
Made almost everything spigot and version safe.
Improved `build.gradle`.
Added better console logging and startup messages.
Fixed `UpdateChecker.java`.
Added custom Skript API and modified what was already present.
Small changes to the documentation of `EnumWrapper.java`.
Moved classes around.
Removed redundant parentheses.
Removed redundant "class exists" checks.
Renamed variables for consistency.
Added to do comments for future reference.
Turned repeated "class exists" checks into Constants.
Added/removed spaces where it seemed necessary.
Improved many classes code-wise.
Replaced non jetbrains annotations with jetbrains'.
Improved documentation.
Improved patterns.
Set the more accurate expression type for some expressions, some of which i need reimplementation (ex. ExprIronGolemCreatedByPlayerState.java).
Made a big chunk of utility classes that help a LOT of syntax elements be more readable and more straight to the point.
Took some pieces of code from other places (skript and skbee) and added credits.
Added a lot of tests.
**Full Changelog**: https://github.com/JakeGBLP/Lusk/compare/1.2.1...1.3
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }