[5] Initial implementation of some attribute stuff. Nothing in this commit actually works but the game still launches! Will need to move item and armor stuff to a more generic file as well to make it less unique so it can be used broadly. Directory structure extended to add items and resources

[5] **WORKING** add custom item and item group to game. primarily metaljacket items not added yet - but example item works.

[5] initial add of custom blocks

[5] Made adding blocks more dynamic - tested to work

[5] Fixed metal jacket armor & created correct texture files to not break game. TEXTURES ARE RANDOM ON WEARING AS I DONT HAVE AN ACTUAL TEXTURE YET

[5] Started attribute tree stuff
This commit is contained in:
Jkibbels 2024-08-24 22:21:57 -04:00
parent 14ebf3062e
commit d94f405980
33 changed files with 670 additions and 26 deletions

View File

@ -0,0 +1,81 @@
package jesse.keeblarcraft.Armor;
import jesse.keeblarcraft.Keeblarcraft;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ArmorMaterial;
import net.minecraft.item.Items;
import net.minecraft.recipe.Ingredient;
import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents;
public class MetalJacketArmor implements ArmorMaterial {
// All references to this class must refer to this
public static final MetalJacketArmor INSTANCE = new MetalJacketArmor();
int defaultArmorModifier = 3;
/// FUNCTIONS BELOW
public MetalJacketArmor() {
System.out.println("Constructor for armor called");
}
@Override
public int getDurability(ArmorItem.Type type) {
System.out.println("durability for armor called");
// Replace this multiplier by a constant value for the durability of the armor.
// For reference, diamond uses 33 for all armor pieces, whilst leather uses 5.
return switch (type) {
case ArmorItem.Type.BOOTS -> Integer.MAX_VALUE;
case ArmorItem.Type.LEGGINGS -> Integer.MAX_VALUE;
case ArmorItem.Type.CHESTPLATE -> Integer.MAX_VALUE;
case ArmorItem.Type.HELMET -> Integer.MAX_VALUE;
};
}
@Override
public int getProtection(ArmorItem.Type type) {
System.out.println("Protection called");
// Protection values for all the slots.
// For reference, diamond uses 3 for boots, 6 for leggings, 8 for chestplate, and 3 for helmet,
// whilst leather uses 1, 2, 3 and 1 respectively.
return switch (type) {
case ArmorItem.Type.BOOTS -> defaultArmorModifier;
case ArmorItem.Type.HELMET -> defaultArmorModifier;
case ArmorItem.Type.LEGGINGS -> defaultArmorModifier;
case ArmorItem.Type.CHESTPLATE -> defaultArmorModifier;
};
}
@Override
public int getEnchantability() {
return Integer.MAX_VALUE;
}
@Override
public SoundEvent getEquipSound() {
// Example for Iron Armor
return SoundEvents.ITEM_ARMOR_EQUIP_IRON;
}
@Override
public Ingredient getRepairIngredient() {
return Ingredient.ofItems(Items.BEDROCK); // prayfully impossible repair or just not worth it
}
@Override
public String getName() {
return Keeblarcraft.MOD_ID + ":" + "metaljacket";
}
@Override
public float getToughness() {
// Toughness is the actual "resistance" the armor provides to HIGH damage attacks
return (float) defaultArmorModifier;
}
@Override
public float getKnockbackResistance() {
return 0;
}
}

View File

@ -0,0 +1,22 @@
/*
*
* AttributeMgr
*
* Central point for the attribute skill system in the mod
*
*
*/
package jesse.keeblarcraft.AttributeMgr;
import jesse.keeblarcraft.AttributeMgr.Nodes.MetalJacket_Node;
import jesse.keeblarcraft.ConfigMgr.ConfigManager;
public class AttributeMgr {
ConfigManager config;
public AttributeMgr() {
// register armor
MetalJacket_Node mjn = new MetalJacket_Node();
}
}

View File

@ -0,0 +1,137 @@
/*
*
* AttributeTree
*
* Handles a players individual attribute tree
*
*
*/
package jesse.keeblarcraft.AttributeMgr;
import java.util.ArrayList;
import java.util.List;
import jesse.keeblarcraft.AttributeMgr.Nodes.AbstractNode;
import jesse.keeblarcraft.ConfigMgr.ConfigManager;
import jesse.keeblarcraft.Utils.ChatUtil;
import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR;
import jesse.keeblarcraft.Utils.CustomExceptions.FILE_WRITE_EXCEPTION;
public class AttributeTree {
PlayerTree playerAttributeTree = new PlayerTree();
ConfigManager config = new ConfigManager();
private class TreeNode {
public TreeNode(TreeNode parent, AbstractNode newNode) {
// If parent node is not null; that means this is not root of tree
if (parentNode != null) {
parentNode = parent;
} else {
parentNode = null;
}
// Set the next nodes
thisNode = newNode;
}
AbstractNode thisNode; // The attribute information
// The below variables are used in context of the TREE (typically when drawing it). They do not affect the
// actual code of the attribute itself
Boolean isNodeUnlocked; // If false then node levels are ignored and node is grayed out
Boolean isNodeHidden; // Default is false when drawing tree's; but if true then becomes hidden.
Integer currentNodeLevel; // Some nodes may have levels to unlocking them; set current level here
Integer maxNodeLevel; // The max node level can be set here
Integer nodeIdentifier; // The unique identifier of this node
List<TreeNode> nextNodes = new ArrayList<TreeNode>(); // Leave as empty list if no more nodes
TreeNode parentNode; // Leave as null if this is root node
}
// Separate structure as this is written to the config file
private class PlayerTree {
String uuid;
String username;
Integer treeSize;
TreeNode root;
}
// If parent node remains null; we will assume this is root node. If root node is already
// taken; then this will return false. True in any other case
public Boolean AddNewNode(AbstractNode parentNode, AbstractNode newNode) {
Boolean success = false;
return success;
}
public void ChangeNodeLevel(Integer id, Integer newLevel) {
}
public void DeleteNode(Integer id) {
}
public void DeleteNode(String nodeName) {
}
// Id will be retrieved from gui most likely (future us)
public TreeNode GetNodeDetails(Integer id) {
TreeNode ret = null;
return ret;
}
// Getting a node by string will likely have poor performance
public TreeNode GetNodeDetails(String nodeName) {
TreeNode ret = null;
return ret;
}
public AttributeTree(String uuid) {
// DEVELOPER NOTE:
// If you are testing this part of the code, please be reminded that anonymous testing starts a new
// player instance everytime you launch. This means the UUID CAN CHANGE when you launch the
// game! This is not an issue with proper registered accounts in production
Boolean existingFile = false;
try {
playerAttributeTree = config.GetJsonObjectFromFile("attributes/" + uuid + ".json", PlayerTree.class);
existingFile = true;
} catch (Exception e) {
// Do nothing. This means the file does not exist
}
// In the event the above code failed out, this means a new file has to be created for the player's uuid
if (!existingFile)
{
System.out.println(ChatUtil.ColoredString("Trying to create new file", CONSOLE_COLOR.BLUE));
try {
playerAttributeTree.uuid = uuid;
FlashConfig();
} catch (Exception e) {
System.out.println(ChatUtil.ColoredString("Could not write to file", CONSOLE_COLOR.RED));
}
} else {
System.out.println(ChatUtil.ColoredString("Moving on", CONSOLE_COLOR.BLUE));
}
// It's possible the above code will return a blank class if a file doesn't exist. This will make
// a new file with this players uuid
if ("".equals(playerAttributeTree.uuid)) {
System.out.println(ChatUtil.ColoredString("Assigning new config file for this uuid. No previous existing", CONSOLE_COLOR.BLUE));
playerAttributeTree.uuid = uuid;
}
}
public void FlashConfig() {
try {
config.WriteToJsonFile("attributes/" + playerAttributeTree.uuid + ".json", playerAttributeTree);
} catch (FILE_WRITE_EXCEPTION e) {
System.out.println(ChatUtil.ColoredString("Could not flash notes configuration file", CONSOLE_COLOR.RED));
}
}
}

View File

@ -0,0 +1,44 @@
/*
*
* AbstractNode
*
* This is the general definition of everything that is allowed inside a node and is called by our system
*
*
*/
package jesse.keeblarcraft.AttributeMgr.Nodes;
import java.util.HashMap;
import java.util.List;
abstract public class AbstractNode {
/////////////////////////////////////////////////////////////////////////////
/// @fn GetNodeTitle
///
/// @brief The title of your node/skill!
/////////////////////////////////////////////////////////////////////////////
abstract String GetNodeTitle();
/////////////////////////////////////////////////////////////////////////////
/// @fn GetNodeDescription
///
/// @brief This will become the hover-over text display of a skill in
/// the skill tree
/////////////////////////////////////////////////////////////////////////////
abstract String GetNodeDescription();
/////////////////////////////////////////////////////////////////////////////
/// @fn GetDetails
///
/// @brief This is the general details that may be displayed inside the
/// GUI when the skill tree becomes available to a player. The
/// object is suggested to be treated as such:
///
/// KEY (String) -> The title of an effect/attribute
/// VAL (List<String>) -> Treated as a list of description
/// attributes. 1 string per description
/////////////////////////////////////////////////////////////////////////////
abstract HashMap<String, List<String>> GetDetails();
}

View File

@ -0,0 +1,51 @@
package jesse.keeblarcraft.AttributeMgr.Nodes;
import java.util.HashMap;
import java.util.List;
import jesse.keeblarcraft.Armor.MetalJacketArmor;
import jesse.keeblarcraft.CustomItems.ItemManager;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.Item;
public final class MetalJacket_Node extends AbstractNode {
// This is the custom armor set that players will receive if no armor is on & attribute is equipped
public final Item jacketHelm = new ArmorItem(MetalJacketArmor.INSTANCE, ArmorItem.Type.HELMET, new Item.Settings());
public final Item jacketChest = new ArmorItem(MetalJacketArmor.INSTANCE, ArmorItem.Type.CHESTPLATE, new Item.Settings());
public final Item jacketLegs = new ArmorItem(MetalJacketArmor.INSTANCE, ArmorItem.Type.LEGGINGS, new Item.Settings());
public final Item jacketBoots = new ArmorItem(MetalJacketArmor.INSTANCE, ArmorItem.Type.BOOTS, new Item.Settings());
public MetalJacket_Node() {
// Finally register items with game
ItemManager.RegisterItem("metaljacket_helmet",jacketHelm);
ItemManager.RegisterItem("metaljacket_chestplate",jacketChest);
ItemManager.RegisterItem("metaljacket_leggings",jacketLegs);
ItemManager.RegisterItem("metaljacket_boots",jacketBoots);
}
@Override
String GetNodeTitle() {
return "MetalJacket";
}
// Short description of node on hover-event in GUI
@Override
String GetNodeDescription() {
return "MetalJacket affects armor value modifiers or gives player base armor when none is worn";
}
// Detailed description of node on click-event in GUI
@Override
HashMap<String, List<String>> GetDetails() {
HashMap<String, List<String>> ret = new HashMap<String, List<String>>();
// Filling out description item stuff here
ret.put("durability", List.of (
"Gives player a base armor set with 3 protection and resistance",
"If armor is being worn, this attribute multiplies each pieces armor value by 120% (rounding up to nearest integer)"
));
return ret;
}
}

View File

@ -0,0 +1,4 @@
package jesse.keeblarcraft.AttributeMgr;
public class SkillTree {
}

View File

@ -165,7 +165,7 @@ public class BankManager {
if (config.GetFile("bank/" + GetUuidByName(server, otherParty) + ".json").size() < 1) { if (config.GetFile("bank/" + GetUuidByName(server, otherParty) + ".json").size() < 1) {
BankManagerFile newBankInfo = new BankManagerFile(); BankManagerFile newBankInfo = new BankManagerFile();
BankManagerMetaData newBank = new BankManagerMetaData(0, "Account Created", 0, "Server", 0); BankManagerMetaData newBank = new BankManagerMetaData(0, "Account Created", 0, "Server", 0);
newBankInfo.bank.put(GetUuidByName(server, otherParty).toString(), newBank); newBankInfo.bank.put(GetUuidByName(server, otherParty).toString(), newBank);
try { try {
config.WriteToJsonFile("bank/" + newBankInfo.uuid + ".json", newBankInfo); config.WriteToJsonFile("bank/" + newBankInfo.uuid + ".json", newBankInfo);
} catch (FILE_WRITE_EXCEPTION e) { } catch (FILE_WRITE_EXCEPTION e) {
@ -193,7 +193,7 @@ public class BankManager {
} catch (FILE_WRITE_EXCEPTION e) { } catch (FILE_WRITE_EXCEPTION e) {
System.out.println(ChatUtil.ColoredString("Could not flash notes configuration file", CONSOLE_COLOR.RED)); System.out.println(ChatUtil.ColoredString("Could not flash notes configuration file", CONSOLE_COLOR.RED));
} }
} else { } else {
System.out.println(ChatUtil.ColoredString("Player Not Found: " + otherParty, CONSOLE_COLOR.RED)); System.out.println(ChatUtil.ColoredString("Player Not Found: " + otherParty, CONSOLE_COLOR.RED));
return; return;

View File

@ -0,0 +1,70 @@
/*
*
* AttributeCommands
*
* This class handles all the possible in-game commands for the attribute system
*
*
*/
package jesse.keeblarcraft.Commands;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.context.CommandContext;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.command.argument.EntityArgumentType;
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
public class AttributeCommands {
public void RegisterCommands() {
// Command Root: "/attributes apply <username> <attribute name>"
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("attributes")
.then(CommandManager.literal("apply")
.then(CommandManager.argument("username", EntityArgumentType.player()))
.then(CommandManager.argument("attributeName", StringArgumentType.string()))
.executes(context -> ApplyAttribute(
EntityArgumentType.getPlayer(context, "username"),
StringArgumentType.getString(context, "attributeName"),
context
))));
});
// Command Root: "/attributes remove <username> <attribute name>"
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("attributes")
.then(CommandManager.literal("delete")
.then(CommandManager.argument("username", EntityArgumentType.player()))
.then(CommandManager.argument("attributeName", StringArgumentType.string()))
.executes(context -> DeleteAttribute(
EntityArgumentType.getPlayer(context, "username"),
StringArgumentType.getString(context, "attributeName"),
context
))));
});
}
public int ApplyAttribute(ServerPlayerEntity targetPlayer, String attributeName, CommandContext<ServerCommandSource> context) {
int ret = -1;
// if (context.getSource().isExecutedByPlayer()) {
// ServerPlayerEntity targetPlayer = context.getSource().getPlayerNames();
// if (context.getSource().getpla)
// }
return ret;
}
public int DeleteAttribute(ServerPlayerEntity username, String attributeName, CommandContext<ServerCommandSource> context) {
int ret = -1;
return ret;
}
}

View File

@ -21,12 +21,14 @@ public class CustomCommandManager {
ShortcutCommands shortcuts = new ShortcutCommands(); ShortcutCommands shortcuts = new ShortcutCommands();
NoteCommands noteCommands = new NoteCommands(); NoteCommands noteCommands = new NoteCommands();
BankCommands bankCommands = new BankCommands(); BankCommands bankCommands = new BankCommands();
AttributeCommands attributeCommands = new AttributeCommands();
// REGISTER COMMANDS BELOW // REGISTER COMMANDS BELOW
System.out.println(ChatUtil.ColoredString("REGISTERING CUSTOM COMMAND EXTENSIONS BELOW", CONSOLE_COLOR.BLUE)); System.out.println(ChatUtil.ColoredString("REGISTERING CUSTOM COMMAND EXTENSIONS BELOW", CONSOLE_COLOR.BLUE));
shortcuts.RegisterShortcutCommands(); shortcuts.RegisterShortcutCommands();
noteCommands.RegisterNoteCommands(); noteCommands.RegisterNoteCommands();
bankCommands.RegisterCommands(); bankCommands.RegisterCommands();
attributeCommands.RegisterCommands();
} }
} }

View File

@ -4,6 +4,8 @@
* *
* A class that simplifies some of the current vanilla commands with shortcut commands in the game. You may remember an old plugin * A class that simplifies some of the current vanilla commands with shortcut commands in the game. You may remember an old plugin
* called "Essentials" (Or EssentialsEx in a later version) -> This file is re-creating a portion of that plugin but in mod-format * called "Essentials" (Or EssentialsEx in a later version) -> This file is re-creating a portion of that plugin but in mod-format
*
*
*/ */
package jesse.keeblarcraft.Commands; package jesse.keeblarcraft.Commands;
@ -21,7 +23,7 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
public class ShortcutCommands { public class ShortcutCommands {
float DEFAULT_FLIGHT_SPEED = 0.05f; // Minecraft operates on a 0.0 -> 1.0 scale; with each .01 making a difference in speed. 0.05 is creative flight speed float DEFAULT_FLIGHT_SPEED = 0.05f; // Minecraft operates on a 0.0 -> 1.0 scale; with each .01 making a difference in speed. 0.05 is creative flight speed
float SPEED_SCALAR = 20.0f; // For clamping speed down to half of its max output (So 0.5 will be max speed on a system that goes up in 0.05'ths) float SPEED_SCALAR = 20.0f; // For clamping speed down to half of its max output (So 0.5 will be max speed on a system that goes up in 0.05'ths)
@ -34,7 +36,7 @@ public class ShortcutCommands {
.executes(context -> GamemodeShortcut(IntegerArgumentType.getInteger(context, "value"), context)))); .executes(context -> GamemodeShortcut(IntegerArgumentType.getInteger(context, "value"), context))));
}); });
// Fly command ///TODO: Is this just being condensed into the FlightSpeedShortcut fn? // Fly command
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("fly") dispatcher.register(CommandManager.literal("fly")
.executes(context -> { FlightShortcut(context); .executes(context -> { FlightShortcut(context);

View File

@ -12,7 +12,6 @@
package jesse.keeblarcraft.ConfigMgr; package jesse.keeblarcraft.ConfigMgr;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.FileReader;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -21,27 +20,19 @@ import com.google.common.base.Charsets;
import com.google.common.io.Files; import com.google.common.io.Files;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonIOException; import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import java.util.List; import java.util.List;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo.Map;
import java.util.ArrayList; import java.util.ArrayList;
import jesse.keeblarcraft.Utils.ChatUtil; import jesse.keeblarcraft.Utils.ChatUtil;
import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR; import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR;
// Import all custom exceptions
import jesse.keeblarcraft.Utils.CustomExceptions.*; import jesse.keeblarcraft.Utils.CustomExceptions.*;
//minecraft server instance
import net.minecraft.server.MinecraftServer;
public class ConfigManager { public class ConfigManager {
// Pedantic empty constructor // Pedantic empty constructor

View File

@ -0,0 +1,67 @@
package jesse.keeblarcraft.CustomBlocks;
import java.util.ArrayList;
import java.util.List;
import jesse.keeblarcraft.Keeblarcraft;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.item.BlockItem;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.Identifier;
public class BlockManager {
/// The block list. DO NOT ADD TO THE LIST YOURSELF. USE
/// THE RegisterBlock(...) FUNCTION OTHERWISE YOUR BLOCK WILL
/// NOT BE REGISTERED PROPERLY AND MAY BREAK THE GAME
public static final List<Block> blockList = new ArrayList<Block>();
/////////////////////////////////////////////////////////////////////////////
/// @fn RegisterBlock
///
/// @arg[in] name is the block name. IMPORTANT: Name must adhere to rules:
/// 1. The name provided here must match these names:
/// * This blocks models/block name
/// * This blocks textures/block name
/// 2 Name must be lowercase & no special characters besides '_'
///
/// @arg[in] block is the block to be added to the block list
///
/// @brief This is the call to register your block to the game! Please
/// do not forget to update the models/block json file, the
/// textures/block png name, and finally the lang/en_us.json file
/////////////////////////////////////////////////////////////////////////////
public static void RegisterBlock(String name, Block block) {
// This call registers the block as an item in inventories
Registry.register(Registries.ITEM, new Identifier(Keeblarcraft.MOD_ID, name), new BlockItem(block, new FabricItemSettings()));
// This call registers the block as placed
Block newBlock = Registry.register(Registries.BLOCK, new Identifier(Keeblarcraft.MOD_ID, name), block);
// Add the block to the block list
blockList.add(newBlock);
}
/////////////////////////////////////////////////////////////////////////////
/// @fn RegisterBlocks
///
/// @brief This function is only meant to be called by the main mod
/// execution path and should only be called once. This is a
/// glorified print statement - but also serves to add the
/// example block in the game
/////////////////////////////////////////////////////////////////////////////
public static void RegisterBlocks() {
Keeblarcraft.LOGGER.info("Registering modded blocks for " + Keeblarcraft.MOD_ID);
// Register example block to the mod
Block exampleBlock = new Block(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).sounds(BlockSoundGroup.AMETHYST_BLOCK));
RegisterBlock("example_block", exampleBlock);
}
}

View File

@ -0,0 +1,41 @@
package jesse.keeblarcraft.CustomItems;
import jesse.keeblarcraft.Keeblarcraft;
import jesse.keeblarcraft.CustomBlocks.BlockManager;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
public class CustomItemGroups {
// This is the custom mod group for the mod
public static final ItemGroup MOD_GROUP = Registry.register(Registries.ITEM_GROUP,
new Identifier(Keeblarcraft.MOD_ID, "keeblarcraft"),
FabricItemGroup.builder().displayName(Text.translatable("itemgroup.keeblarcraft"))
.icon(() -> new ItemStack(Items.ANVIL)).entries((displayContext, entries) -> {
// We iterate through all the modded items and add them to the custom item group here
for (int i = 0; i < ItemManager.itemList.size(); i++) {
entries.add(ItemManager.itemList.get(i));
}
// We iterate through all the modded blocks and add them to the custom block group here
for (int i = 0; i < BlockManager.blockList.size(); i++) {
entries.add(BlockManager.blockList.get(i));
}
}).build());
/////////////////////////////////////////////////////////////////////////////
/// @fn RegisterGroups
///
/// @brief Glorified print statement that the class has initialized
/// basically - meaning that all item groups have registered
/////////////////////////////////////////////////////////////////////////////
public static void RegisterGroups() {
Keeblarcraft.LOGGER.info("Registering item groups for " + Keeblarcraft.MOD_ID);
}
}

View File

@ -0,0 +1,70 @@
/*
*
* ItemManager
*
* This is the general purpose item manager for the mod. All items will be registered through
* this class in order to make custom items a lot cleaner to make!
*
*
*/
package jesse.keeblarcraft.CustomItems;
import java.util.ArrayList;
import java.util.List;
import jesse.keeblarcraft.Keeblarcraft;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
public class ItemManager {
/// The item list. DO NOT ADD TO THE LIST YOURSELF. USE
/// THE RegisterItem(...) FUNCTION OTHERWISE YOUR ITEM WILL
/// NOT BE REGISTERED PROPERLY AND MAY BREAK THE GAME
public static final List<Item> itemList = new ArrayList<Item>();
/////////////////////////////////////////////////////////////////////////////
/// @fn RegisterItem
///
/// @arg[in] name is the item name. IMPORTANT: Name must adhere to rules:
/// 1. The name provided here must match these names:
/// * This items models/item name
/// * This items textures/item name
/// 2 Name must be lowercase & no special characters besides '_'
///
/// @arg[in] item is the item to be added to the item list
///
/// @brief This is the call to register your item to the game! Please
/// do not forget to update the models/item json file, the
/// textures/item png name, and finally the lang/en_us.json file
/////////////////////////////////////////////////////////////////////////////
public static void RegisterItem(String name, Item item) {
Item newItem = Registry.register(Registries.ITEM, new Identifier(Keeblarcraft.MOD_ID, name), item);
itemList.add(newItem);
}
/////////////////////////////////////////////////////////////////////////////
/// @fn RegisterAllItems
///
/// @brief This function is only meant to be called by the main mod
/// execution path and should only be called once. This is a
/// glorified print statement - but also serves to add the
/// example item in the game
/////////////////////////////////////////////////////////////////////////////
public static void RegisterAllItems() {
Keeblarcraft.LOGGER.info("Registering mod items for " + Keeblarcraft.MOD_ID);
// Call the item group register function first
CustomItemGroups.RegisterGroups();
// The example item provides a demo of how you could make an item in your class
// Item exampleItem = new Item(new FabricItemSettings());
// RegisterItem("metaljacket_helmet", exampleItem);
}
}

View File

@ -7,7 +7,6 @@
package jesse.keeblarcraft.JsonClassObjects; package jesse.keeblarcraft.JsonClassObjects;
import java.math.BigInteger;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map.Entry; import java.util.Map.Entry;

View File

@ -15,7 +15,11 @@ import net.fabricmc.api.ModInitializer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import jesse.keeblarcraft.AttributeMgr.AttributeMgr;
import jesse.keeblarcraft.Commands.CustomCommandManager; import jesse.keeblarcraft.Commands.CustomCommandManager;
import jesse.keeblarcraft.CustomBlocks.BlockManager;
import jesse.keeblarcraft.CustomItems.CustomItemGroups;
import jesse.keeblarcraft.CustomItems.ItemManager;
import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION; import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION;
import jesse.keeblarcraft.Utils.ChatUtil; import jesse.keeblarcraft.Utils.ChatUtil;
import jesse.keeblarcraft.Utils.Setup; import jesse.keeblarcraft.Utils.Setup;
@ -28,6 +32,7 @@ public class Keeblarcraft implements ModInitializer {
// This logger is used to write text to the console and the log file. // This logger is used to write text to the console and the log file.
// It is considered best practice to use your mod id as the logger's name. // It is considered best practice to use your mod id as the logger's name.
// That way, it's clear which mod wrote info, warnings, and errors. // That way, it's clear which mod wrote info, warnings, and errors.
public static String MOD_ID = "keeblarcraft";
public static final Logger LOGGER = LoggerFactory.getLogger("keeblarcraft"); public static final Logger LOGGER = LoggerFactory.getLogger("keeblarcraft");
CustomCommandManager cmdMgr = new CustomCommandManager(); CustomCommandManager cmdMgr = new CustomCommandManager();
@ -50,6 +55,18 @@ public class Keeblarcraft implements ModInitializer {
LOGGER.info("\033[34m Running command registration \033[0m"); LOGGER.info("\033[34m Running command registration \033[0m");
cmdMgr.RegisterCustomCommands(); cmdMgr.RegisterCustomCommands();
// Register attributes (TODO: Remove this and place elsewhere)
AttributeMgr attributes = new AttributeMgr();
/// THE BELOW ITEMS MUST BE DONE LAST IN THE STEPS
// Register items
ItemManager.RegisterAllItems();
// Register blocks
BlockManager.RegisterBlocks();
} catch (SETUP_FAILED_EXCEPTION e) { } catch (SETUP_FAILED_EXCEPTION e) {
System.out.println(ChatUtil.ColoredString("ERROR. Setup failed to initialize environment. Mod likely does not have read/write permissions inside area. Mod will now close out.", CONSOLE_COLOR.RED)); System.out.println(ChatUtil.ColoredString("ERROR. Setup failed to initialize environment. Mod likely does not have read/write permissions inside area. Mod will now close out.", CONSOLE_COLOR.RED));
e.printStackTrace(); e.printStackTrace();

View File

@ -1,4 +1,4 @@
package jesse.keeblarcraft; package jesse.keeblarcraft.Utils;
import jesse.CommonServerUtils; import jesse.CommonServerUtils;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;

View File

@ -12,17 +12,11 @@ package jesse.keeblarcraft.Utils;
import java.util.List; import java.util.List;
import org.apache.commons.io.FileUtils;
import org.spongepowered.include.com.google.common.io.Files;
import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import jesse.keeblarcraft.Keeblarcraft;
import jesse.keeblarcraft.ServerTickListener;
import jesse.keeblarcraft.ConfigMgr.ConfigManager; import jesse.keeblarcraft.ConfigMgr.ConfigManager;
import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR; import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR;
import jesse.keeblarcraft.Utils.CustomExceptions.DIRECTORY_CREATE_EXCEPTION; import jesse.keeblarcraft.Utils.CustomExceptions.DIRECTORY_CREATE_EXCEPTION;
import jesse.keeblarcraft.Utils.CustomExceptions.DIRECTORY_DELETE_EXCEPTION;
import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION; import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION;
// Singleton class is designed to help the mod set itself up and create all the important things. It does two things: // Singleton class is designed to help the mod set itself up and create all the important things. It does two things:
@ -62,14 +56,16 @@ public final class Setup {
add("commands"); // Expect 1 file per command that's configurable! add("commands"); // Expect 1 file per command that's configurable!
add("events"); // Expect 1 file per event that is configurable! add("events"); // Expect 1 file per event that is configurable!
add("bank"); add("bank");
add("attributes");
}}; }};
// These will be top-level config files above the directories this mod creates // These will be top-level config files above the directories this mod creates
private static final List<String> FILE_LIST = new ArrayList<String>() {{ private static final List<String> FILE_LIST = new ArrayList<String>() {{
add("story/story.json"); // Big config file, determines when players can do certain things at different story levels add("story/general_story_config.json"); // Big config file, determines when players can do certain things at different story levels
add("factions/factions.json"); // General configuration file for factions stuff add("factions/general_factions_config.json"); // General configuration file for factions stuff
add("events/1events.json"); // General configuration file for story events! add("events/general_event_config.json"); // General configuration file for story events!
add("general.json"); // The super general configuration file! (May be removed) add("general.json"); // The super general configuration file! (May be removed)
add("attributes/general_attribute_config.json");
}}; }};
// RunChecks() // RunChecks()
@ -166,7 +162,7 @@ public final class Setup {
System.out.println(ChatUtil.ColoredString("servertick failed to inilize.", CONSOLE_COLOR.RED)); System.out.println(ChatUtil.ColoredString("servertick failed to inilize.", CONSOLE_COLOR.RED));
throw new SETUP_FAILED_EXCEPTION(); throw new SETUP_FAILED_EXCEPTION();
} }
System.out.println(ChatUtil.ColoredString("DID SETUP COMPLETE SUCCESSFULLY? ", CONSOLE_COLOR.YELLOW) + (ret ? ChatUtil.ColoredString("YES", CONSOLE_COLOR.YELLOW) : ChatUtil.ColoredString("NO", CONSOLE_COLOR.YELLOW))); System.out.println(ChatUtil.ColoredString("DID SETUP COMPLETE SUCCESSFULLY? ", CONSOLE_COLOR.YELLOW) + (ret ? ChatUtil.ColoredString("YES", CONSOLE_COLOR.YELLOW) : ChatUtil.ColoredString("NO", CONSOLE_COLOR.YELLOW)));
return ret; return ret;

View File

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "keeblarcraft:block/example_block"
}
}
}

View File

@ -0,0 +1,10 @@
{
"item.keeblarcraft.metaljacket_helmet": "MetalJacket Helmet",
"item.keeblarcraft.metaljacket_chestplate": "MetalJacket Chestplate",
"item.keeblarcraft.metaljacket_leggings": "MetalJacket Leggings",
"item.keeblarcraft.metaljacket_boots": "MetalJacket Booties",
"itemgroup.keeblarcraft": "Keeblarcraft Modded Items",
"block.keeblarcraft.example_block": "Keeblarcraft example block"
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "keeblarcraft:block/example_block"
}
}

View File

@ -0,0 +1,3 @@
{
"parent": "keeblarcraft:block/example_block"
}

View File

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "keeblarcraft:item/metaljacket_boots"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "keeblarcraft:item/metaljacket_chestplate"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "keeblarcraft:item/metaljacket_helmet"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "keeblarcraft:item/metaljacket_leggings"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B