aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/shcm/shsupercm/fabric/citresewn/cit/CITCondition.java
blob: cd4cb9dd595d3afbac57a6316b50a8837f5fe853 (plain)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package shcm.shsupercm.fabric.citresewn.cit;

import shcm.shsupercm.fabric.citresewn.CITResewn;
import shcm.shsupercm.fabric.citresewn.api.CITConditionContainer;
import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
import shcm.shsupercm.fabric.citresewn.ex.CITParsingException;
import shcm.shsupercm.fabric.citresewn.pack.format.PropertyGroup;
import shcm.shsupercm.fabric.citresewn.pack.format.PropertyValue;

import java.util.Collections;
import java.util.Set;

/**
 * Instanced parent for CIT Types that are applied to items when conditions pass.<br>
 * Common condition types are available under {@link shcm.shsupercm.fabric.citresewn.cit.builtin.conditions}.
 * @see CITConditionContainer
 * @see CIT
 */
public abstract class CITCondition {
    /**
     * Parses the given property value into the condition.
     * @param value value to read
     * @param properties the group containing value
     * @throws CITParsingException if errored while parsing the condition
     */
    public abstract void load(PropertyValue value, PropertyGroup properties) throws CITParsingException;

    /**
     * @return a set of classes of conditions that have integration with this condition
     */
    public Set<Class<? extends CITCondition>> siblingConditions() {
        return Collections.emptySet();
    }

    /**
     * Modifies the given sibling if present in the CIT and declared in {@link #siblingConditions()}.
     * @param sibling sibling to modify or be modified by
     * @return the sibling or null to remove it from the CIT.
     */
    public <T extends CITCondition> T modifySibling(T sibling) {
        return sibling;
    }

    /**
     * Tests the given context against this condition.
     * @param context context to check
     * @return true if the given context passes
     */
    public abstract boolean test(CITContext context);

    /**
     * Logs a warning with the given value's descriptor if enabled in config.
     *
     * @see CITResewn#logWarnLoading(String)
     * @see CITResewnConfig#mute_warns
     * @param message warning message
     * @param value value associated with the warning
     * @param properties property group associated with the warning
     */
    protected void warn(String message, PropertyValue value, PropertyGroup properties) {
        CITResewn.logWarnLoading("Warning: " + properties.messageWithDescriptorOf(message, value.position()));
    }
}