Merge branch '1.21.3' into 1.21.1

# Conflicts:
#	gradle.properties
This commit is contained in:
Oth3r 2024-12-15 11:36:25 -06:00
commit fda08029bb
10 changed files with 76 additions and 110 deletions

View file

@ -1,32 +1,9 @@
# v1.2.0 - The Rewrite! # v1.2.1
Hey yall, 1.2.0 is here! Quick bugfix update. :)
Not too much to show in the changelog, as most of the changes were under the hood. ### block interaction checker
There is still some work that can be done, but I am happy where the mod is at currently. now it actually works (based on config sadly)
* added `interaction-blocks` to the server config, any block added to this list will block sitting with the hand
As always, leave suggestions / bugs in the discord or github, and help localize the mod on [Crowdin](https://crowdin.com/project/oth3r-sit)! ### other changes
* added refreshes to the config files on startup and reload to write missing parts to disk
Thank you for playing, and have a good day! - Oth3r 🦦 * bumped the `server-config.json` version
* fixed `usable` hand filter not working
### Config
brand new config system for a better editing experience
* switch to json for all mod configuration
* split the config into 2, `server-config` & `sitting-config`
* block & item tag selection support
* select multiple block ids / tags per sitting height
* `sit-while-seated` config entry defaulted to false
* added a sitting block blacklist
* removed the YACL ModMenu config, as it is incompatible with the new system
* added a new custom config UI (full config control still WIP)
### Dismounting
*fixed dismounting sit entities!*
* added a new custom dismounting system
* dismounts the player in the direction that they are looking in, instead of on top of the block every time
### QOL
*im sure ive missed some things*
* interaction blocks now cannot be sat with the hand
* mod id is now `sit-oth3r` from `oth3r-sit`
* added keybinds
* sit toggle command
* `/sit` priorities target block over the block below the player

View file

@ -10,7 +10,7 @@ yarn_mappings=1.21.1+build.3
loader_version=0.16.9 loader_version=0.16.9
# Mod Properties # Mod Properties
mod_version=1.2.0+1.21-1.21.1 mod_version=1.2.1+1.21-1.21.1
maven_group=one.oth3r maven_group=one.oth3r
file_name=sit! file_name=sit!

View file

@ -10,6 +10,8 @@ public class Sit implements ModInitializer {
@Override @Override
public void onInitialize() { public void onInitialize() {
FileData.loadFiles(); FileData.loadFiles();
// save the files to populate all missing config options
FileData.saveFiles();
Events.registerCommon(); Events.registerCommon();
} }
} }

View file

@ -51,6 +51,7 @@ public class CustomBlock {
boolean blockType = checkBlockType(blockState); boolean blockType = checkBlockType(blockState);
if (!blockType) return false; if (!blockType) return false;
/// BLOCK STATE CHECKER
// now check if the state is one of the acceptable states // now check if the state is one of the acceptable states
for (String state : blockStates) { for (String state : blockStates) {
// if there is a NOT (!) blockstate // if there is a NOT (!) blockstate

View file

@ -56,13 +56,24 @@ public interface CustomFile <T extends CustomFile<T>> {
if (file == null) throw new NullPointerException(); if (file == null) throw new NullPointerException();
// update the instance // update the instance
updateToNewFile(file); file.update();
// load the file to the current object
loadFileData(file);
} }
@NotNull @NotNull
Class<T> getFileClass(); Class<T> getFileClass();
void updateToNewFile(T newFile); /**
* loads the data from the file object into the current object
* @param newFile the file to take the properties from
*/
void loadFileData(T newFile);
/**
* updates the file based on the version number of the current instance
*/
void update();
/** /**
* logic for the file not existing when loading, defaults to saving * logic for the file not existing when loading, defaults to saving

View file

@ -69,6 +69,14 @@ public class FileData {
} }
} }
/**
* saves all config files
*/
public static void saveFiles() {
getSittingConfig().save();
getServerConfig().save();
}
public static class Defaults { public static class Defaults {
public static final ArrayList<SittingBlock> SITTING_BLOCKS = new ArrayList<>(Arrays.asList( public static final ArrayList<SittingBlock> SITTING_BLOCKS = new ArrayList<>(Arrays.asList(
new SittingBlock(new ArrayList<>(),new ArrayList<>(Arrays.asList("#minecraft:campfires")), new ArrayList<>(Arrays.asList("lit=false")),.437), new SittingBlock(new ArrayList<>(),new ArrayList<>(Arrays.asList("#minecraft:campfires")), new ArrayList<>(Arrays.asList("lit=false")),.437),
@ -80,6 +88,12 @@ public class FileData {
new CustomBlock(new ArrayList<>(),new ArrayList<>(Arrays.asList("#minecraft:shulker_boxes")),new ArrayList<>()) new CustomBlock(new ArrayList<>(),new ArrayList<>(Arrays.asList("#minecraft:shulker_boxes")),new ArrayList<>())
)); ));
public static final ArrayList<CustomBlock> INTERACTION_BLOCKS = new ArrayList<>(Arrays.asList(
new CustomBlock(new ArrayList<>(Arrays.asList("minecraft:crafter")),new ArrayList<>(Arrays.asList(
"#minecraft:shulker_boxes","#c:player_workstations/furnaces","#c:player_workstations/crafting_tables",
"#c:villager_job_sites","#minecraft:trapdoors","#c:chests")),new ArrayList<>())
));
public static final HandSetting MAIN_HAND = new HandSetting(HandSetting.SittingRequirement.EMPTY, new HandSetting.Filter( public static final HandSetting MAIN_HAND = new HandSetting(HandSetting.SittingRequirement.EMPTY, new HandSetting.Filter(
false,new HandSetting.Filter.Presets(), false,new HandSetting.Filter.Presets(),
new CustomItem( new CustomItem(

View file

@ -20,7 +20,7 @@ import java.util.Properties;
public class ServerConfig implements CustomFile<ServerConfig> { public class ServerConfig implements CustomFile<ServerConfig> {
@SerializedName("version") @SerializedName("version")
private Double version = 2.0; private Double version = 2.1;
@SerializedName("lang") @SerializedName("lang")
private String lang = "en_us"; private String lang = "en_us";
@SerializedName("lang-options") @SerializedName("lang-options")
@ -37,6 +37,8 @@ public class ServerConfig implements CustomFile<ServerConfig> {
private ArrayList<SittingBlock> sittingBlocks = FileData.Defaults.SITTING_BLOCKS; private ArrayList<SittingBlock> sittingBlocks = FileData.Defaults.SITTING_BLOCKS;
@SerializedName("blacklisted-blocks") @SerializedName("blacklisted-blocks")
private ArrayList<CustomBlock> blacklistedBlocks = FileData.Defaults.BLACKLISTED_BLOCKS; private ArrayList<CustomBlock> blacklistedBlocks = FileData.Defaults.BLACKLISTED_BLOCKS;
@SerializedName("interaction-blocks")
private ArrayList<CustomBlock> interactionBlocks = FileData.Defaults.INTERACTION_BLOCKS;
public ServerConfig() {} public ServerConfig() {}
@ -49,11 +51,13 @@ public class ServerConfig implements CustomFile<ServerConfig> {
this.customEnabled = serverConfig.customEnabled; this.customEnabled = serverConfig.customEnabled;
this.sittingBlocks = serverConfig.sittingBlocks; this.sittingBlocks = serverConfig.sittingBlocks;
this.blacklistedBlocks = serverConfig.blacklistedBlocks; this.blacklistedBlocks = serverConfig.blacklistedBlocks;
this.interactionBlocks = serverConfig.interactionBlocks;
} }
public ServerConfig(Double version, String lang, boolean keepActive, boolean sitWhileSeated, public ServerConfig(Double version, String lang, boolean keepActive, boolean sitWhileSeated,
PresetBlocks presetBlocks, boolean customEnabled, PresetBlocks presetBlocks, boolean customEnabled,
ArrayList<SittingBlock> sittingBlocks, ArrayList<CustomBlock> blacklistedBlocks) { ArrayList<SittingBlock> sittingBlocks, ArrayList<CustomBlock> blacklistedBlocks,
ArrayList<CustomBlock> interactionBlocks) {
this.version = version; this.version = version;
this.lang = lang; this.lang = lang;
this.keepActive = keepActive; this.keepActive = keepActive;
@ -62,6 +66,7 @@ public class ServerConfig implements CustomFile<ServerConfig> {
this.customEnabled = customEnabled; this.customEnabled = customEnabled;
this.sittingBlocks = sittingBlocks; this.sittingBlocks = sittingBlocks;
this.blacklistedBlocks = blacklistedBlocks; this.blacklistedBlocks = blacklistedBlocks;
this.interactionBlocks = interactionBlocks;
} }
public Double getVersion() { public Double getVersion() {
@ -96,6 +101,10 @@ public class ServerConfig implements CustomFile<ServerConfig> {
return blacklistedBlocks; return blacklistedBlocks;
} }
public ArrayList<CustomBlock> getInteractionBlocks() {
return interactionBlocks;
}
public static class PresetBlocks { public static class PresetBlocks {
@SerializedName("stairs") @SerializedName("stairs")
@ -135,7 +144,7 @@ public class ServerConfig implements CustomFile<ServerConfig> {
@Override @Override
public void reset() { public void reset() {
updateToNewFile(new ServerConfig()); loadFileData(new ServerConfig());
} }
@Override @Override
@ -144,7 +153,7 @@ public class ServerConfig implements CustomFile<ServerConfig> {
} }
@Override @Override
public void updateToNewFile(ServerConfig newFile) { public void loadFileData(ServerConfig newFile) {
this.version = newFile.version; this.version = newFile.version;
this.lang = newFile.lang; this.lang = newFile.lang;
this.keepActive = newFile.keepActive; this.keepActive = newFile.keepActive;
@ -155,6 +164,14 @@ public class ServerConfig implements CustomFile<ServerConfig> {
this.blacklistedBlocks = newFile.blacklistedBlocks; this.blacklistedBlocks = newFile.blacklistedBlocks;
} }
@Override
public void update() {
/// update to 2.1, just a new list, nothing to change
if (version == 2.0) {
version = 2.1;
}
}
@Override @Override
public String getFileName() { public String getFileName() {
return "server-config.json"; return "server-config.json";
@ -283,7 +300,7 @@ public class ServerConfig implements CustomFile<ServerConfig> {
Boolean.parseBoolean((String) properties.computeIfAbsent("custom", a -> String.valueOf(defaultConfig.isCustomEnabled()))), Boolean.parseBoolean((String) properties.computeIfAbsent("custom", a -> String.valueOf(defaultConfig.isCustomEnabled()))),
getCustomBlocks(new Gson().fromJson((String) getCustomBlocks(new Gson().fromJson((String)
properties.computeIfAbsent("custom-blocks", a -> "[]"), listType)), properties.computeIfAbsent("custom-blocks", a -> "[]"), listType)),
new ArrayList<>() new ArrayList<>(), FileData.Defaults.INTERACTION_BLOCKS
); );
SittingConfig defaultSittingConfig = new SittingConfig(); SittingConfig defaultSittingConfig = new SittingConfig();

View file

@ -3,16 +3,8 @@ package one.oth3r.sit.file;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Data;
import one.oth3r.sit.utl.Utl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
public class SittingConfig implements CustomFile<SittingConfig> { public class SittingConfig implements CustomFile<SittingConfig> {
@SerializedName("version") @SerializedName("version")
@ -37,7 +29,7 @@ public class SittingConfig implements CustomFile<SittingConfig> {
} }
public SittingConfig(SittingConfig sittingConfig) { public SittingConfig(SittingConfig sittingConfig) {
updateToNewFile(sittingConfig); loadFileData(sittingConfig);
} }
public Double getVersion() { public Double getVersion() {
@ -74,7 +66,7 @@ public class SittingConfig implements CustomFile<SittingConfig> {
@Override @Override
public void reset() { public void reset() {
updateToNewFile(new SittingConfig()); loadFileData(new SittingConfig());
} }
@Override @Override
@ -83,7 +75,7 @@ public class SittingConfig implements CustomFile<SittingConfig> {
} }
@Override @Override
public void updateToNewFile(SittingConfig newFile) { public void loadFileData(SittingConfig newFile) {
this.version = newFile.version; this.version = newFile.version;
this.enabled = newFile.enabled; this.enabled = newFile.enabled;
this.handSitting = newFile.handSitting; this.handSitting = newFile.handSitting;
@ -91,6 +83,9 @@ public class SittingConfig implements CustomFile<SittingConfig> {
this.offHand = newFile.offHand; this.offHand = newFile.offHand;
} }
@Override
public void update() {}
@Override @Override
public String getFileName() { public String getFileName() {
return "sitting-config.json"; return "sitting-config.json";

View file

@ -147,6 +147,7 @@ public class Logic {
*/ */
public static void reload() { public static void reload() {
FileData.loadFiles(); FileData.loadFiles();
FileData.saveFiles();
} }
/** /**

View file

@ -13,7 +13,6 @@ import net.minecraft.entity.EntityType;
import net.minecraft.entity.decoration.DisplayEntity; import net.minecraft.entity.decoration.DisplayEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
@ -34,7 +33,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
@ -138,7 +136,7 @@ public class Utl {
// try the default conditions // try the default conditions
if (presets.isBlock() && itemStack.getItem() instanceof BlockItem) return TRUE; if (presets.isBlock() && itemStack.getItem() instanceof BlockItem) return TRUE;
if (presets.isFood() && food.contains(itemStack.getUseAction())) return TRUE; if (presets.isFood() && food.contains(itemStack.getUseAction())) return TRUE;
if (presets.isUsable() && hasItemUse(itemStack)) return TRUE; if (presets.isUsable() && !notUsable.contains(itemStack.getUseAction())) return TRUE;
// if nothing else is met, the item is filtered out // if nothing else is met, the item is filtered out
return FALSE; return FALSE;
@ -165,14 +163,14 @@ public class Utl {
Block block = blockState.getBlock(); Block block = blockState.getBlock();
// make sure that the block that is being sit on has no interaction when hand sitting // make sure that the block that is being sit on has no interaction when hand sitting
if (hit != null && hasInteraction(blockState)) { if (hit != null && blockIsInList(config.getInteractionBlocks(), blockState)) {
return null; return null;
} }
// only if custom is enabled // only if custom is enabled
if (config.isCustomEnabled()) { if (config.isCustomEnabled()) {
// if the block is on the blacklist, false // if the block is on the blacklist, false
if (config.getBlacklistedBlocks().stream().anyMatch(c -> c.isValid(blockState))) return null; if (blockIsInList(config.getBlacklistedBlocks(),blockState)) return null;
for (SittingBlock sittingBlock : config.getSittingBlocks()) { for (SittingBlock sittingBlock : config.getSittingBlocks()) {
// if the block is valid, true // if the block is valid, true
@ -198,63 +196,13 @@ public class Utl {
} }
/** /**
* checks if a block has an interaction * checks if a blockstate is in the list provided
* @param blockState the blockstate of the block to check * @return
* @return if the block has an interaction or not
*/ */
public static boolean hasInteraction(BlockState blockState) { public static boolean blockIsInList(ArrayList<CustomBlock> blockList, BlockState blockState) {
return isMethodOverridden(AbstractBlock.class, blockState.getBlock().getClass(), "onUse", BlockState.class, World.class, BlockPos.class, PlayerEntity.class, BlockHitResult.class); return blockList.stream().anyMatch(c -> c.isValid(blockState));
} }
/**
* checks if an item has a use
* @param itemStack the itemstack to check
* @return if the item has a use or not
*/
public static boolean hasItemUse(ItemStack itemStack) {
return isMethodOverridden(Item.class, itemStack.getItem().getClass(), "use", World.class, PlayerEntity.class, Hand.class);
}
/**
* checks if a method in the base class has been overridden in the subclass(es) by:
* checking the subclass and its supers till the original method is found or the original method is found
* @param baseClass the base class
* @param subclass the subclass to check
* @param methodName the method to check for
* @param parameterTypes the parameterTypes for the method, see {@link java.lang.Class#getDeclaredMethod(java.lang.String, java.lang.Class[])}
* @return if the method is overridden or not
*/
public static boolean isMethodOverridden(Class<?> baseClass, Class<?> subclass, String methodName, Class<?>... parameterTypes) {
try {
// get the original method
Method superMethod = baseClass.getMethod(methodName, parameterTypes);
// the current class to check, starting with the subclass
Class<?> currentClass = subclass;
// while the class is null and the current class isn't the same as the baseclass.
while (currentClass != null && !currentClass.equals(baseClass)) {
try {
// get the submethod
Method subMethod = currentClass.getDeclaredMethod(methodName, parameterTypes);
// check if the methods are different
if (!superMethod.equals(subMethod)) {
return true;
}
} catch (NoSuchMethodException ignored) {
// method isnt in this class, bump up a class and check that one
}
currentClass = currentClass.getSuperclass();
}
} catch (NoSuchMethodException e) {
// method doesn't exist in the base class
return false;
}
// an override wasn't found
return false;
}
public static class Entity { public static class Entity {
/** /**