Merge branch '1.20.6' into 1.20.4

# Conflicts:
#	gradle.properties
This commit is contained in:
Oth3r 2024-12-17 12:44:55 -06:00
commit 18ad774e63
10 changed files with 76 additions and 111 deletions

View file

@ -1,32 +1,9 @@
# v1.2.0 - The Rewrite!
Hey yall, 1.2.0 is here!
Not too much to show in the changelog, as most of the changes were under the hood.
There is still some work that can be done, but I am happy where the mod is at currently.
As always, leave suggestions / bugs in the discord or github, and help localize the mod on [Crowdin](https://crowdin.com/project/oth3r-sit)!
Thank you for playing, and have a good day! - Oth3r 🦦
### 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
# v1.2.1
Quick bugfix update. :)
### block interaction checker
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
### other changes
* added refreshes to the config files on startup and reload to write missing parts to disk
* bumped the `server-config.json` version
* fixed `usable` hand filter not working

View file

@ -10,11 +10,10 @@ yarn_mappings=1.20.4+build.3
loader_version=0.15.11
# Mod Properties
mod_version=1.2.0+1.20.4
mod_version=1.2.1+1.20.4
maven_group=one.oth3r
file_name=sit!
# Dependencies
fabric_version=0.97.1+1.20.4
modmenu_version=9.0.0
yacl_version=3.4.1+1.20.4-fabric

View file

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

View file

@ -51,6 +51,7 @@ public class CustomBlock {
boolean blockType = checkBlockType(blockState);
if (!blockType) return false;
/// BLOCK STATE CHECKER
// now check if the state is one of the acceptable states
for (String state : blockStates) {
// 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();
// update the instance
updateToNewFile(file);
file.update();
// load the file to the current object
loadFileData(file);
}
@NotNull
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

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 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),
@ -80,6 +88,12 @@ public class FileData {
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(
false,new HandSetting.Filter.Presets(),
new CustomItem(

View file

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

View file

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

View file

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

View file

@ -12,7 +12,6 @@ import net.minecraft.entity.EntityType;
import net.minecraft.entity.decoration.DisplayEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.registry.Registries;
import net.minecraft.server.network.ServerPlayerEntity;
@ -34,7 +33,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
@ -138,7 +136,7 @@ public class Utl {
// try the default conditions
if (presets.isBlock() && itemStack.getItem() instanceof BlockItem) 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
return FALSE;
@ -165,14 +163,14 @@ public class Utl {
Block block = blockState.getBlock();
// 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;
}
// only if custom is enabled
if (config.isCustomEnabled()) {
// 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()) {
// if the block is valid, true
@ -198,63 +196,13 @@ public class Utl {
}
/**
* checks if a block has an interaction
* @param blockState the blockstate of the block to check
* @return if the block has an interaction or not
* checks if a blockstate is in the list provided
* @return
*/
public static boolean hasInteraction(BlockState blockState) {
return isMethodOverridden(AbstractBlock.class, blockState.getBlock().getClass(), "onUse", BlockState.class, World.class, BlockPos.class, PlayerEntity.class, BlockHitResult.class);
public static boolean blockIsInList(ArrayList<CustomBlock> blockList, BlockState blockState) {
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 {
/**