Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@
import com.denizenscript.denizencore.utilities.CoreConfiguration;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.Deprecations;
import com.denizenscript.denizencore.utilities.data.Actionable;
import com.denizenscript.denizencore.utilities.data.DataActionException;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.tags.TagContext;

/**
* Durations are a convenient way to get a 'unit of time' within Denizen.
*/
public class DurationTag implements ObjectTag {
public class DurationTag implements ObjectTag, Actionable<DurationTag> {

// <--[ObjectType]
// @name DurationTag
Expand Down Expand Up @@ -560,4 +562,22 @@ public String formatted(boolean words) {
}
return (isNegative ? "negative " : "") + timeString.trim();
}

@Override
public DurationTag operationAdd(ObjectTag value, TagContext context) {
DurationTag toAdd = value.asType(DurationTag.class, context);
if (toAdd == null) {
throw new DataActionException("Cannot add non-duration to duration!");
}
return new DurationTag(this.seconds + toAdd.seconds);
}

@Override
public DurationTag operationSub(ObjectTag value, TagContext context) {
DurationTag toSub = value.asType(DurationTag.class, context);
if (toSub == null) {
throw new DataActionException("Cannot subtract non-duration from duration!");
}
return new DurationTag(this.seconds - toSub.seconds);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.denizenscript.denizencore.tags.*;
import com.denizenscript.denizencore.tags.core.EscapeTagUtil;
import com.denizenscript.denizencore.utilities.*;
import com.denizenscript.denizencore.utilities.data.Actionable;
import com.denizenscript.denizencore.utilities.debugging.Debug;

import java.io.UnsupportedEncodingException;
Expand All @@ -24,7 +25,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ElementTag implements ObjectTag {
public class ElementTag implements ObjectTag, Actionable<ElementTag> {

// NOTE: Explicitly no example value
// <--[ObjectType]
Expand Down Expand Up @@ -2623,5 +2624,40 @@ public boolean advancedMatches(String matcher, TagContext context) {
};
}

@Override
public ElementTag operationAdd(ObjectTag value, TagContext context) {
BigDecimal toAdd = parseBigDecimal(value);
return new ElementTag(asBigDecimal().add(toAdd));
}

@Override
public ElementTag operationSub(ObjectTag value, TagContext context) {
BigDecimal toSubtract = parseBigDecimal(value);
return new ElementTag(asBigDecimal().subtract(toSubtract));
}

@Override
public ElementTag operationMul(ObjectTag value, TagContext context) {
BigDecimal toMultiply = parseBigDecimal(value);
return new ElementTag(asBigDecimal().multiply(toMultiply));
}

@Override
public ElementTag operationDiv(ObjectTag value, TagContext context) {
BigDecimal toDivide = parseBigDecimal(value).setScale(15, RoundingMode.HALF_UP);
return new ElementTag(asBigDecimal().divide(toDivide, RoundingMode.HALF_UP));
}

public static BigDecimal parseBigDecimal(ObjectTag object) {
if (object == null) {
return BigDecimal.ZERO;
}
try {
return new BigDecimal(object.toString());
} catch (NumberFormatException e) {
return BigDecimal.ZERO;
}
}

public static final Pattern UNACCENTED_PATTERN = Pattern.compile("[\\u0300-\\u036f]");
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.Deprecations;
import com.denizenscript.denizencore.utilities.data.Actionable;
import com.denizenscript.denizencore.utilities.data.DataActionException;
import com.denizenscript.denizencore.utilities.debugging.Debug;

import java.time.*;
Expand All @@ -20,7 +22,7 @@
import java.util.List;
import java.util.Locale;

public class TimeTag implements ObjectTag, Adjustable, FlaggableObject {
public class TimeTag implements ObjectTag, Adjustable, FlaggableObject, Actionable<TimeTag> {

// <--[ObjectType]
// @name TimeTag
Expand Down Expand Up @@ -751,4 +753,22 @@ public void applyProperty(Mechanism mechanism) {
public void adjust(Mechanism mechanism) {
tagProcessor.processMechanism(this, mechanism);
}

@Override
public TimeTag operationAdd(ObjectTag value, TagContext context) {
DurationTag toAdd = value.asType(DurationTag.class, context);
if (toAdd == null) {
throw new DataActionException("Cannot add non-duration to time!");
}
return new TimeTag(this.millis() + toAdd.getMillis(), this.instant.getZone());
}

@Override
public TimeTag operationSub(ObjectTag value, TagContext context) {
DurationTag toSub = value.asType(DurationTag.class, context);
if (toSub == null) {
throw new DataActionException("Cannot subtract non-duration from time!");
}
return new TimeTag(this.millis() - toSub.getMillis(), this.instant.getZone());
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package com.denizenscript.denizencore.objects.core;

import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.DenizenImplementation;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.data.Actionable;
import com.denizenscript.denizencore.utilities.debugging.Debug;

import java.util.Vector;

/**
* Represents an object that contains X/Y/Z 3D Vector.
*/
public interface VectorObject extends ObjectTag {
public interface VectorObject extends ObjectTag, Actionable<VectorObject> {

// <--[ObjectType]
// @name VectorObject
Expand Down Expand Up @@ -291,29 +298,54 @@ static <T extends VectorObject> void register(Class<T> type, ObjectTagProcessor
// -->
processor.registerTag(QuaternionTag.class, type, "quaternion_between_vectors", (attribute, object, other) -> {
double dot = object.dot(other);
if (dot < -0.9999f)
{
if (dot < -0.9999f) {
double absX = Math.abs(object.getX());
double absY = Math.abs(object.getY());
double absZ = Math.abs(object.getZ());
if (absX < absY && absX < absZ)
{
if (absX < absY && absX < absZ) {
return new QuaternionTag(0, -object.getZ(), object.getY(), 0).normalized();
}
else if (absY < absZ)
{
else if (absY < absZ) {
return new QuaternionTag(-object.getZ(), 0, object.getX(), 0).normalized();
}
else
{
else {
return new QuaternionTag(-object.getY(), object.getX(), 0, 0).normalized();
}
}
else
{
else {
VectorObject axis = object.crossProduct(other);
return new QuaternionTag(axis.getX(), axis.getY(), axis.getZ(), dot + 1).normalized();
}
});
}

@Override
default VectorObject operationAdd(ObjectTag value, TagContext context) {
VectorObject toAdd = DenizenCore.implementation.vectorize(value, context);
VectorObject toReturn = duplicate();
toReturn.setX(getX() + toAdd.getX());
toReturn.setY(getY() + toAdd.getY());
toReturn.setZ(getZ() + toAdd.getZ());
return toReturn;
}

@Override
default VectorObject operationSub(ObjectTag value, TagContext context) {
VectorObject toSub = DenizenCore.implementation.vectorize(value, context);
VectorObject toReturn = duplicate();
toReturn.setX(getX() - toSub.getX());
toReturn.setY(getY() - toSub.getY());
toReturn.setZ(getZ() - toSub.getZ());
return toReturn;
}

@Override
default VectorObject operationMul(ObjectTag value, TagContext context) {
return this.duplicate().multipliedBy(value.asElement().asDouble());
}

@Override
default VectorObject operationDiv(ObjectTag value, TagContext context) {
return this.duplicate().multipliedBy(1.0 / value.asElement().asDouble());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.denizenscript.denizencore.utilities.data;

import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.tags.TagContext;

public interface Actionable<T extends ObjectTag> {

default T operationAdd(ObjectTag value, TagContext context) {
throw new DataActionException("This object does not support adding operations.");
}

default T operationSub(ObjectTag value, TagContext context) {
throw new DataActionException("This object does not support subtracting operations.");
}

default T operationMul(ObjectTag value, TagContext context) {
throw new DataActionException("This object does not support multiplying operations.");
}

default T operationDiv(ObjectTag value, TagContext context) {
throw new DataActionException("This object does not support dividing operations.");
}
}
Loading