Devblog 3
Published: 2020-11-02 22:50:15

# What's new this week in SupremeObsidian.

This week we worked an absolute ton on professions, as well as worked on biomes and how they work within our terrain generation system.

## Fisher

This week I did some minimal work on spells, getting different specific subclasses working. Each player class type will have a different set of spells that they can use. Inside of those sets will be other different types, like specializations.

![SpellTypes](https://dev-to-uploads.s3.amazonaws.com/i/3rp689zmdfejs16kzspq.png)

Again, very primitive, early work on this, but still laying the groundwork for that.

This week I mostly contributed to the resourcepack building script that I talked about in detail [in this post](https://dev.to/fishermedders/how-i-host-minecraft-server-resourcepacks-on-github-2ia4). This makes it very easy for us to host our resourcepacks in a Github repository, so we can all make changes and update it automatically through [Github Actions](https://github.com/features/actions).

I also started updating our Discord bot with new code, and prepared a new branch for **Fyrlex**, one of our new Developers, and I to start working on the bot rewrite.

![Discord Rank Separators](https://dev-to-uploads.s3.amazonaws.com/i/jufi4okpn4j0l1jzomct.png)
This is an image of the new rank specific separators that I implemented just last night.

`pssst we are gonna have a towny server soon`
did anyone hear something? not I.

## Async

This week I made the world more realistic by making it use more octaves for noise, and also added in [Frational Brownian Motion](https://en.wikipedia.org/wiki/Fractional_Brownian_motion), and made the oceans slightly steeper.

![Height map](https://dev-to-uploads.s3.amazonaws.com/i/qkfxuj2t3lfkbc0gjujg.png)
This is an example of a height map that uses random noise!

## Fyrlex

*Disclaimer, this is Fisher speaking for Fyrlex*
This week, we got a new Developer by the name of Fyrlex. He's gonna be working on our discord bot, as well as his own. I hear he's got a lot of experience in this area and can't wait to collaborate with him rewriting the current iteration of our bot.

## violetskyzz

*Still Fisher speaking*
This week, violet spent a lot of time working on the textures and models for the Professions. Here's a good amount of textures that have been made now.

![Different Grindstone Speeds](https://dev-to-uploads.s3.amazonaws.com/i/b99za5njmv1xh3dugk9m.gif)
Different Grindstone Speeds are shown here

![New Models](https://dev-to-uploads.s3.amazonaws.com/i/5qqmaxxvr581iu101jga.png)
Here we see the Bucket with nothing, with water, the bellows for the blacksmith furnace, and all of the different new types of ingots.

![Bellow animation](https://dev-to-uploads.s3.amazonaws.com/i/as6ur9b4leptgstex3fq.gif)
Here we see the new bellow animation for the blacksmith furnace.

## **Kennedy**

### **New Items and Blocks**
Each new item and block that Kennedy has added this week is accessible with the command "/ci"
##### **Blacksmith Grindstone** _(Block)_
The Blacksmith Grindstone will be used by the blacksmith profession to sharpen swords and axes- possibly tools as well! The sharpness of an item increases the temporary lifespan of that item by increasing the item's instantaneous durability. However, every time an item is sharpened, the max durability of that item is decreased by half of what the item gained back in durability. Therefore, items are doomed to break... eventually, but it can be delayed with sharpening.

> **Example**: A sword with 100/500 durability is sharpened. The sword now has 200/450 durability.

This Grindstone is also animated using custom model data when it is being used. There will also be an animation for the item being sharpened in the next update to the grindstone.

##### **Blacksmith Furnace** _(Block)_
The Blacksmith Furnace will be used by the blacksmith profession to smelt ores into **Metal Ingots**. Only **Metal Ores** can be placed into the crafting slot of the furnace. Metal Ores must each reach a specific **Melting Point** in the furnace to turn into ingots. The furnace's heat can be initially set using different tiers of burnable **fuel.** _(Not implemented yet)_ Each Fuel will have a different **base burning temperature**. The furnace's temperature can then be increased from its base temperature using a **Blacksmith Bellow**. 

![Furnace](https://dev-to-uploads.s3.amazonaws.com/i/p3il3mmcrcb41wtiusxh.png)

There will also be an animation for the ore being smelted, and placed into the furnace in the next update to the furnaces.

##### **Blacksmith Cauldron** _(Block)_
The Blacksmith Cauldron will be used by the blacksmith profession to cool down **hot items** that were just crafted on the **Blacksmith Anvil**. Hot items cannot be equipped or used until cooled. Also, the attributes of that item/weapon will become visible once that item/weapon is cooled. A Blacksmith Cauldron must be filled with water using a **Water Pail** _(See unimplemented items)_ before it can be used. When used, a "cooling" animation plays. 

![Cauldron Animation](https://dev-to-uploads.s3.amazonaws.com/i/dz27lku1pvpaa7jkb8yx.gif)

##### **Blacksmith Anvil** _(Block)_
The Blacksmith Anvil will be used by the blacksmith profession to choose and craft **hot armor and weapons** from **Metal Ingots**. A **Blacksmith Hammer** is necessary to craft items on the anvil. When crafting, a "hammer" animation will play with the blacksmith hammer. The item crafted on the anvil will be a "Hot" variant of its selected parent item, which is either a piece of **Armor** or a weapon. This "Hot" item cannot be used or equipped, until cooled in the Blacksmith Cauldron.

Each item has a recipe cost of 1-5 ingots of any **Metal Ingot**. This means you can use any combination of metal alloys to craft armor, and the attribute boosts will stack. 

![Anvil](https://dev-to-uploads.s3.amazonaws.com/i/pz0zaymem1qcvq8kcyq0.png)

##### **Metal Ingots and Ores** _(Items)_
Metal Ingots will be used by the blacksmith profession to craft items. They are obtained by smelting ores in a **Blacksmith Furnace**. You can use any combination of metal alloys to craft **Armor**, and the attribute boosts will stack. The melting point is the temperature at which the furnace needs to be to melt the metal's ore into Metal Ingots. 

> **Example**: An item created with 4 aluminum ingots (1% boost each) will have a total of +4% attribute boost applied to the final item. 

![Ingots](https://dev-to-uploads.s3.amazonaws.com/i/5gotrxt1y7y83pgnigmp.png)

##### **Blacksmith Bellow** _(Handheld Item)_
The bellow is an animated hand-held tool that can be used by the blacksmith profession to increase the instantaneous temperature of a **Blacksmith Furnace**. The rate at which it increases temperature is still undetermined. It will likely be dependent on the level of the blacksmith themselves.
All professions can use it by clicking or holding down their right mouse button to blow air particles. 

[Bellow](https://dev-to-uploads.s3.amazonaws.com/i/wydi6zzwe4i5jobcd1dw.gif)
 

##### **Hot Items** _(Items)_
Hot Items are crafted on a **Blacksmith Anvil**, and cannot be worn or used until cooled in a **Blacksmith Cauldron**. Attributes are inherited on that item, but not visible to the player. The attributes will become visible once that item is cooled. They can be differentiated from their cooled counterparts by a red texture overlay on their icon, and "Hot" in their ItemMeta displayname. 

![Hot Chestplate](https://dev-to-uploads.s3.amazonaws.com/i/kuh0pk0wa2xil5kazhnn.png)

#### **Armor** _(Wearable Items)_
Armor is a wearable item that is used by different **character classes** to defend against attacks from **monsters** or **other players in PVP**. Each piece of armor has a level, attributes, initial durability, and a specific player class by whom which the armor can only be used by. Armor can either be crafted on a **Blacksmith Anvil**, purchased from other players, or found in loot.

#### Armor Craft/Drop Rates
Drop rates for Armor is increased by crafting it on a **Blacksmith Anvil**: 

|Item Level|Natural Drop Rate|Anvil Drop Rate|
|:-----|:-----|:-----|
|1|1.80%|1.6%|
|2|1.78|1.59%|
|3 - 99|...|...|
|100|0.19%|0.39%|

> **Natural Drop Rate** = (5-((Level-1)*0.045))/2.7725
> **Anvil Drop Rate** = -0.0254585*(Level)+(5.045/1.5)

![Chestplate Lore](https://dev-to-uploads.s3.amazonaws.com/i/rkznidipq5neqhxc8249.png)
 

The Armor's **attributes, materials,** and **required class** are all included in the armor's lore.  
The Armor's **star-rating** is determined by calculating the total "score" accumulated by armor level, positive attributes, initial durability, and material used compared to a piece of armor with "perfect" armor level, attributes, initial durability, and material.  
The Armor's current **durability** is shown in green on the durability bar in the item's lore. Durability that can be regained by repair or sharpening (weapons only) is indicated by grey on the durability bar. Durability that cannot be regained due to sharpening (weapons only) or [OTHER REASONS REDACTED] is indicated by red on the durability bar.

The length of the divider line between item information and its attributes is equal to the length of the longest line of lore applied to the item. 

#### Blacksmith Items not yet implemented

##### **Blacksmith Hammer**
The **Blacksmith Hammer** is a tool used by the blacksmith profession to craft items with the **Blacksmith Anvil**. It can be found in natural drops around the world. There are 5 tiers of Blacksmith Hammers that can be acquired, each with different attributes. 
The attributes of each tier of Blacksmith Hammer can be seen below:

|Name|Crafting Time Reduction|Durability|
|:-----|:-----|:-----|
|Broken Hammer|-50%|200|
|Old Hammer|-25%|300|
|Firm Hammer|0%|400|
|Sturdy Hammer|+25%|500|
|Shiny Hammer|+50%|600|

![Hammer](https://dev-to-uploads.s3.amazonaws.com/i/ic69o8d90j35fupjzxqf.png)

##### **Water Pail**
A **Water Pail** is a handheld item that can be used to transport water and fill **Blacksmith Cauldrons**. 
There will be an animation when filling a Water Pail at a water source block, or another full cauldron. 

![Water Pail](https://dev-to-uploads.s3.amazonaws.com/i/wpn8hqika15wmee3gbha.png)

### **Profession Crafting Mechanics**

##### **SupremeItems and CraftBlocks**
Kennedy and Fisher have both been working on implementing into the core an item builder called "SupremeItem" for creating and managing custom items with specified tags, persistent data, and other cool features. The items currently implemented with this class can be accessed with the command "/ci"

![Custom Items Menu](https://dev-to-uploads.s3.amazonaws.com/i/gwu0r9xcix2v3gsnhqyq.png)

Each custom item is initialized and can be referenced as an enum, as seen here:
{% spoiler Custom Item Enum %}
```Java

BLACKSMITH_BELLOW(                                                                      // CUSTOM ITEM ENUM IDENTIFIER
            "Bellow",                                                                   // CUSTOM ITEM NAME
            ItemStackBuilder.of(Material.IRON_AXE)                                      // CUSTOM ITEM MATERIAL
                    .name("Bellow")                                                     // CUSTOM ITEM            
                    .lore("Left-Click on blast furnace to increase its heat.")          // CUSTOM ITEM LORE/DESCRIPTION
                    .build(),                                                           // RETURNS ITEMSTACK
            new HashMap<ItemFlags, Object>() {                                          
                {
                put(ItemFlags.CRAFTABLE_AT, ItemCraftLocations.BLACKSMITH);             // ITEM TAGS
                }
            },
            new HashMap<String, String>() {                                             // PERSISTENT DATA
                {
                    put("custom-item", "true");                                         
                    put("custom-model", "4");                                           
                }
            }
    )

```
{% endspoiler %}

Kennedy also created an object class called CraftingBlock for creating and managing custom profession crafting blocks that can be associated with SupremeItems. Each CraftingBlock is similarly initialized and can be referenced as an enum as well, as seen here:

{% spoiler CraftingBlock Enum %}
```Java
BLACKSMITH_FURNACE(
            "blacksmith-furnace",                                                                       //NAME
            SupremeItem.BLACKSMITH_FURNACE,                                                             //ASSOCIATED SUPREMEITEM
            new HashMap<String, Object>() {                                                             // DATA STORED IN BLOCK
                {
                    put("blacksmith-furnace", "true");
                    put("block-durability", SupremeItem.BLACKSMITH_FURNACE.getBlockDurability());
                }
            },
            new HashMap<Integer, String>() {                                                            // TUTORIAL STAGES
                {
                    put(1, "Blacksmith Furnace");
                    put(2, "Right-click to smelt ores!");
                }
            }
    )

```
{% endspoiler %}

Any type of Data can be stored in CraftingBlocks as armorstands. These are the methods that can be called from a CraftingBlock:

CraftBlock Static Methods:

|Method|Use|
|:-----|:-----|
|getCraftingBlockFromSupremeItem(SupremeItem)|Returns CraftingBlock from supremeitem associated|
|getCraftingBlockMaterials()|Returns List<Material> of materials used by CraftingBlocks|
|isCraftingBlock(Block)|Returns true if block is an instance of CraftingBlock|
|getCraftingBlock(Block)|Returns CraftingBlock for block instance of CraftingBlock.|

Inherited Methods:

|Method|Use|
|:-----|:-----|
|CraftingBlock.getItem()|Returns itemstack from supremeitem for this CraftingBlock|
|CraftingBlock.getSupremeItem()|Returns raw supremeitem for this CraftingBlock|
|CraftingBlock.getTutorialStages()|Returns HashMap of tutorial stages for this CraftingBlock|
|CraftingBlock.getTutorialStage(Stage)|Returns String of tutorial stage for this CraftingBlock|
|CraftingBlock.getBlockId()|Returns specific CraftingBlock id for this CraftingBlock|
|CraftingBlock.getMaterial()|Returns material of SupremeItem associated with this CraftingBlock|
|CraftingBlock.getStandKeys()|Returns HashMap<String, Object> of data that this CraftingBlock should be storing in armorstands|
|CraftingBlock.hasKey(ArmorStand, Key)|Returns boolean if ArmorStand has Key|

##### **Crafting Bossbar**
The CraftingBossBar object allows for displaying progress during crafting tasks.  

![Bossbar](https://dev-to-uploads.s3.amazonaws.com/i/yo5n1nnjogs1v8c1798k.png)

There are a few methods that can be called to manage a CraftingBossBar:

|Method|Use|
|:-----|:-----|
|Constructor: CraftingBossBar(EventName, Player, BarColor)|Uses parameters to initialize bossbar. Does NOT display bar.|
|CraftingBossBar.displayBar(Player)|Displays the bar for a specific player|
|CraftingBossBar.displayBar()|Displays the bar to initialized player|
|CraftingBossBar.removeBar()|Removes the bar|
|CraftingBossBar.setProgress(Progress)|Sets the bar's live progress out of 1.0|
|CraftingBossBar.setTitle(Title)|Sets the bar's title to format: (%title% + %progress% + "%")|
|CraftingBossBar.isDisplayed()|Returns true if bar is visible for player|

##### **Also...**
Some features that Kalinox doesn't get to know about yet.


```diff
+ added different speeds of grindstone
+ added new grindstone handlers, blacksmith furnace handlers, cauldron animations, bellow animation.
+ new discord branch for bot rewrite.
+ fixed server listing on the discord (amount of players and if online)
+ new discord rank separators.
+ new biomes as well as new noise types, and edits to noise octaves.
+ new craftblock handlers for information on blocks and checking if a block is a certain type with armor stands and custom nbt
- removed the singular grindstone static in place for adding different speeds as well as static.
- removed herobrine
```