Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
2cd6021
Starter Commit
Absolutionism Nov 4, 2024
feede48
PR ready
Absolutionism Nov 4, 2024
1c22720
remove "runtime"
Absolutionism Nov 5, 2024
da23e33
Starter Commit
Absolutionism Nov 8, 2024
6736a9d
Changes
Absolutionism Nov 8, 2024
3441021
Merge branch 'dev/feature' into dev/ToolComponents
sovdeeth Nov 8, 2024
92e8162
Merge branch 'dev/feature' into dev/EquippableComponents
sovdeeth Nov 8, 2024
97ce295
Partial Changes
Absolutionism Nov 9, 2024
ecc728e
Merge branch 'dev/ToolComponents' of https://github.com/TheAbsolution…
Absolutionism Nov 9, 2024
74cac7e
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Nov 10, 2024
15d5fd7
Merge branch 'dev/feature' into dev/EquippableComponents
Absolutionism Nov 10, 2024
e49a8a2
Update
Absolutionism Nov 10, 2024
01b3fe7
Update
Absolutionism Nov 11, 2024
70c7186
Merge branch 'dev/feature' into dev/EquippableComponents
Absolutionism Nov 16, 2024
ab6209c
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Nov 16, 2024
d78a8f2
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Nov 23, 2024
671d6e3
Merge branch 'dev/feature' into dev/ToolComponents
Moderocky Nov 30, 2024
8ed850f
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Dec 15, 2024
2500976
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Dec 15, 2024
8f944a2
Merge branch 'dev/feature' into dev/EquippableComponents
Absolutionism Dec 15, 2024
256781a
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Dec 24, 2024
c332d27
Merge remote-tracking branch 'upstream/dev/feature' into dev/ToolComp…
Absolutionism Dec 24, 2024
e250c95
Update
Absolutionism Dec 24, 2024
7e59693
Merge branch 'dev/feature' into dev/EquippableComponents
Absolutionism Dec 24, 2024
cc57b63
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism May 10, 2025
2c2cc84
Overhaul
Absolutionism May 11, 2025
e889044
Update CondEquipCompInteract.java
Absolutionism May 11, 2025
96c2481
Requested Changes
Absolutionism May 12, 2025
b51820a
Partial Changes
Absolutionism May 21, 2025
9b46199
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism May 21, 2025
f312699
Update EquippableComponents.sk
Absolutionism May 21, 2025
29e19b0
revert
Absolutionism May 21, 2025
675c6b1
Record Usage
Absolutionism May 29, 2025
5536e9b
Merge branch 'dev/feature' into dev/EquippableComponents
Absolutionism May 29, 2025
e6f13bf
Partial Changes
Absolutionism Jun 6, 2025
a9f7382
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Jun 6, 2025
3394d3d
More Changes
Absolutionism Jun 7, 2025
353fa92
Merge remote-tracking branch 'upstream/dev/feature' into dev/ToolComp…
Absolutionism Jun 10, 2025
7f1a48b
Merge branch 'dev/EquippableComponents' into dev/ToolComponents
Absolutionism Jun 10, 2025
94214cc
Overhaul
Absolutionism Jun 10, 2025
df55cc3
Changes
Absolutionism Jun 11, 2025
94397c0
Merge branch 'dev/EquippableComponents' into dev/ToolComponents
Absolutionism Jun 11, 2025
c903b54
Docs Update
Absolutionism Jun 11, 2025
024a0e1
Requested Changes
Absolutionism Jun 24, 2025
ab5ad52
Update EquippableComponents.sk
Absolutionism Jun 24, 2025
7a85b0e
Update EquippableComponents.sk
Absolutionism Jun 24, 2025
353ee6e
Adooblus Changes
Absolutionism Jun 25, 2025
a958f27
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Jun 27, 2025
f24aadb
Update EquippableExperiment.java
Absolutionism Jun 27, 2025
6404bc5
Update Experiment Class Name
Absolutionism Jun 27, 2025
838250b
Requested Changes
Absolutionism Jun 30, 2025
78e96dd
Cloneable Changes
Absolutionism Jun 30, 2025
888727a
Update EquippableModule.java
Absolutionism Jun 30, 2025
953c200
Update ItemComponentModule.java
Absolutionism Jun 30, 2025
bf978f2
Merge remote-tracking branch 'upstream/dev/feature' into dev/Equippab…
Absolutionism Jul 17, 2025
b424e24
Partial Update
Absolutionism Jul 18, 2025
8366ccb
Docs Update
Absolutionism Jul 18, 2025
e8dcdeb
Missing Import
Absolutionism Jul 18, 2025
6a694c2
More Elements
Absolutionism Jul 19, 2025
53cd00d
Docs Fix
Absolutionism Jul 19, 2025
5bc5797
Fix ItemType
Absolutionism Jul 19, 2025
63e05f8
Revert Misc Changed Files
Absolutionism Jul 19, 2025
76e97a6
Source Retainability
Absolutionism Jul 19, 2025
7adea5c
Update EquippableComponents.sk
Absolutionism Jul 19, 2025
53681d7
Update ExprEquippableComponent.java
Absolutionism Jul 19, 2025
29d6648
Requested Changes
Absolutionism Aug 27, 2025
a085ea9
Merge branch 'dev/EquippableComponents' into dev/ToolComponents
Absolutionism Aug 29, 2025
4d96196
Partial Update - Broken
Absolutionism Aug 30, 2025
f4587a5
Merge remote-tracking branch 'upstream/dev/feature' into dev/ToolComp…
Absolutionism Aug 30, 2025
cf66093
Fix Test
Absolutionism Aug 30, 2025
b1de5f6
Javadocs
Absolutionism Aug 30, 2025
7b482e9
# Conflicts:
Absolutionism Sep 8, 2025
71e56fa
Update
Absolutionism Sep 8, 2025
ff4c5dd
Update ExprSecBlankToolComp.java
Absolutionism Sep 9, 2025
9e1dc21
Merge dev/feature
Absolutionism Sep 10, 2025
9c5f394
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Sep 10, 2025
bbb0987
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Sep 23, 2025
f2ce4a5
Merge remote-tracking branch 'upstream/dev/feature' into dev/ToolComp…
Absolutionism Oct 1, 2025
1d31ce9
Update
Absolutionism Oct 1, 2025
edb8339
Pickle's Changes
Absolutionism Nov 11, 2025
84c6975
Merge branch 'dev/feature' into dev/ToolComponents
Absolutionism Nov 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/ch/njol/skript/registrations/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public enum Feature implements Experiment {
CATCH_ERRORS("catch runtime errors", LifeCycle.EXPERIMENTAL, "error catching [section]"),
TYPE_HINTS("type hints", LifeCycle.EXPERIMENTAL, "[local variable] type hints"),
DAMAGE_SOURCE("damage source", LifeCycle.EXPERIMENTAL, "damage source[s]"),
EQUIPPABLE_COMPONENTS("equippable components", LifeCycle.EXPERIMENTAL, "equippable components")
EQUIPPABLE_COMPONENTS("equippable components", LifeCycle.EXPERIMENTAL, "equippable components"),
TOOL_COMPONENTS("tool components", LifeCycle.EXPERIMENTAL, "tool components"),
;

private final String codeName;
Expand Down
53 changes: 50 additions & 3 deletions src/main/java/ch/njol/util/Math2.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package ch.njol.util;

import ch.njol.skript.Skript;
import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval;
import org.jetbrains.annotations.ApiStatus;

import java.util.Arrays;

/**
* This class is not to be used by addons. In the future methods may
* change signature, contract and/or get removed without warning.
Expand Down Expand Up @@ -57,6 +54,56 @@ public static double fit(double min, double value, double max) {
return Math.min(Math.max(value, min), max);
}

/**
* Fits the sum of {@code base} and {@code add} into the interval of {@code min} and {@link Integer#MAX_VALUE}.
* If the sum of {@code base} and {@code add} results in an overflow, returns {@link Integer#MAX_VALUE}.
*
* @return An int in between {@code min} and {@link Integer#MAX_VALUE} or {@link Integer#MAX_VALUE} if the sum overflowed.
*/
public static int fitOverflowMax(int min, int base, int add) {
return fitOverflow(min, base, add, Integer.MAX_VALUE, Integer.MAX_VALUE);
}

/**
* Fits the sum of {@code base} and {@code add} into the interval of {@code min} and {@code max}.
* If the sum of {@code base} and {@code add} results in an overflow, returns {@code overflow}.
*
* @return An int in between {@code min} and {@code max} or {@code overflow} if the sum overflowed.
*/
public static int fitOverflow(int min, int base, int add, int max, int overflow) {
assert min <= max;
int value = base + add;
boolean overflowed = value - base != add;
if (overflowed)
return overflow;
return Math.min(Math.max(value, min), max);
}

/**
* Fits the sum of {@code base} and {@code add} into the interval of {@code min} and {@link Float#MAX_VALUE}.
* If the sum of {@code base} and {@code add} results in an overflow, returns {@link Float#MAX_VALUE}.
*
* @return A float in between {@code min} and {@link Float#MAX_VALUE} or {@link Float#MAX_VALUE} if the sum overflowed.
*/
public static float fitOverflowMax(float min, float base, float add) {
return fitOverflow(min, base, add, Float.MAX_VALUE, Float.MAX_VALUE);
}

/**
* Fits the sum of {@code base} and {@code add} into the interval of {@code min} and {@code max}.
* If the sum of {@code base} and {@code add} results in an overflow, returns {@code overflow}.
*
* @return A float in between {@code min} and {@code max} or {@code overflow} if the sum overflowed.
*/
public static float fitOverflow(float min, float base, float add, float max, float overflow) {
assert min <= max;
float value = base + add;
boolean overflowed = value - base != add;
if (overflowed)
return overflow;
return Math.min(Math.max(value, min), max);
}

/**
* Modulo that returns positive values even for negative arguments.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.skriptlang.skript.addon.SkriptAddon;
import org.skriptlang.skript.bukkit.itemcomponents.equippable.EquippableModule;
import org.skriptlang.skript.bukkit.itemcomponents.generic.ExprItemCompCopy;
import org.skriptlang.skript.bukkit.itemcomponents.tool.ToolModule;

public class ItemComponentModule implements AddonModule {

Expand Down Expand Up @@ -47,7 +48,10 @@ public String toVariableNameString(ComponentWrapper wrapper) {

@Override
public void load(SkriptAddon addon) {
addon.loadModules(new EquippableModule());
addon.loadModules(
new EquippableModule(),
new ToolModule()
);

ExprItemCompCopy.register(addon.syntaxRegistry());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.skriptlang.skript.bukkit.itemcomponents.tool;

import ch.njol.skript.lang.SyntaxElement;
import ch.njol.skript.registrations.Feature;
import org.skriptlang.skript.lang.experiment.ExperimentData;
import org.skriptlang.skript.lang.experiment.SimpleExperimentalSyntax;

/**
* Typed {@link SimpleExperimentalSyntax} for {@link SyntaxElement}s that require {@link Feature#TOOL_COMPONENTS}.
*/
public interface ToolExperimentalSyntax extends SimpleExperimentalSyntax {

ExperimentData EXPERIMENT_DATA = ExperimentData.createSingularData(Feature.TOOL_COMPONENTS);

@Override
default ExperimentData getExperimentData() {
return EXPERIMENT_DATA;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package org.skriptlang.skript.bukkit.itemcomponents.tool;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.classes.ClassInfo;
import ch.njol.skript.classes.Parser;
import ch.njol.skript.expressions.base.EventValueExpression;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.registrations.Classes;
import ch.njol.skript.util.ItemSource;
import ch.njol.skript.util.slot.Slot;
import io.papermc.paper.datacomponent.item.Tool;
import io.papermc.paper.datacomponent.item.Tool.Rule;
import org.bukkit.inventory.ItemStack;
import org.skriptlang.skript.addon.AddonModule;
import org.skriptlang.skript.addon.SkriptAddon;
import org.skriptlang.skript.bukkit.itemcomponents.tool.elements.*;
import org.skriptlang.skript.lang.converter.Converter;
import org.skriptlang.skript.lang.converter.Converters;
import org.skriptlang.skript.registration.SyntaxRegistry;

import java.util.Arrays;
import java.util.function.Consumer;

public class ToolModule implements AddonModule {

@Override
public boolean canLoad(SkriptAddon addon) {
return Skript.classExists("io.papermc.paper.datacomponent.item.Tool");
}

@Override
public void init(SkriptAddon addon) {
Classes.registerClass(new ClassInfo<>(ToolWrapper.class, "toolcomponent")
.user("tool ?components?")
.name("Tool Component")
.description("""
Represents a tool component used for items.
NOTE: Tool component elements are experimental. Thus, they are subject to change and may not work as intended.
""")
.requiredPlugins("Minecraft 1.21.3+")
.since("INSERT VERSION")
.defaultExpression(new EventValueExpression<>(ToolWrapper.class))
.parser(new Parser<>() {
@Override
public boolean canParse(ParseContext context) {
return false;
}

@Override
public String toString(ToolWrapper wrapper, int flags) {
return "tool component";
}

@Override
public String toVariableNameString(ToolWrapper wrapper) {
return "tool component#" + wrapper.hashCode();
}
})
.after("itemstack", "itemtype", "slot")
);

Classes.registerClass(new ClassInfo<>(ToolRuleWrapper.class, "toolrule")
.user("tool ?rules?")
.name("Tool Rule")
.description("""
Represents a rule that can be applied to a tool component.
A tool rule consists of:
- Block types that the rule should be applied to
- Mining speed for the blocks
- Whether the blocks should drop their respective items
NOTE: Tool component elements are experimental. Thus, they are subject to change and may not work as intended.
""")
.requiredPlugins("Minecraft 1.21.3+")
.since("INSERT VERSION")
.defaultExpression(new EventValueExpression<>(ToolRuleWrapper.class))
.parser(new Parser<>() {
@Override
public boolean canParse(ParseContext context) {
return false;
}

@Override
public String toString(ToolRuleWrapper wrapper, int flags) {
return "tool rule";
}

@Override
public String toVariableNameString(ToolRuleWrapper wrapper) {
return "tool rule#" + wrapper.hashCode();
}
})
);

Converters.registerConverter(Tool.class, ToolWrapper.class, ToolWrapper::new, Converter.NO_RIGHT_CHAINING);
Converters.registerConverter(ItemStack.class, ToolWrapper.class, ToolWrapper::new, Converter.NO_RIGHT_CHAINING);
Converters.registerConverter(ItemType.class, ToolWrapper.class, itemType -> new ToolWrapper(new ItemSource<>(itemType)), Converter.NO_RIGHT_CHAINING);
Converters.registerConverter(Slot.class, ToolWrapper.class, slot -> {
ItemSource<Slot> itemSource = ItemSource.fromSlot(slot);
if (itemSource == null)
return null;
return new ToolWrapper(itemSource);
}, Converter.NO_RIGHT_CHAINING);
Converters.registerConverter(Rule.class, ToolRuleWrapper.class, ToolRuleWrapper::new, Converter.NO_RIGHT_CHAINING);
}

@Override
public void load(SkriptAddon addon) {
register(addon.syntaxRegistry(),

CondToolCompCreative::register,
CondToolRuleDrops::register,

EffToolCompCreative::register,
EffToolRuleDrops::register,

ExprToolCompDamage::register,
ExprToolCompMiningSpeed::register,
ExprToolComponent::register,
ExprToolCompRules::register,
ExprToolRuleBlocks::register,
ExprToolRuleSpeed::register,

ExprSecBlankToolComp::register,
ExprSecToolRule::register
);
}

private void register(SyntaxRegistry registry, Consumer<SyntaxRegistry>... consumers) {
Arrays.stream(consumers).forEach(consumer -> consumer.accept(registry));
}

}
Loading