Skip to content

Commit

Permalink
Add gemstone and gemstone slots component to Pojo Expansion
Browse files Browse the repository at this point in the history
  • Loading branch information
nahkd123 committed Feb 17, 2024
1 parent e8ae040 commit 236cacf
Show file tree
Hide file tree
Showing 21 changed files with 1,034 additions and 167 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ Pojo Scripts are powered by [MangoScript](https://github.com/MangoPlex/MangoScri
+ [ ] Stats component
+ [x] Vanilla attributes
+ [ ] Hook with other plugins (mainly RPG plugins)
+ [ ] Gemstones component
+ [x] Gemstones component
+ [x] Allow other components to modify a component's output (quite complicated I'd say)
+ [ ] Item type filtering (eg: only apply effects from `pojo:gemstones` type)
+ [x] ~~Item type filtering (eg: only apply effects from `pojo:gemstones` type)~~ Replaced with gemstone slot ID
- [ ] Custom blocks
- [ ] Scripting support
+ [x] [MangoScript](https://github.com/MangoPlex/MangoScript)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
public class PojoKeys {
public final NamespacedKey id;
public final NamespacedKey displayMode;
public final NamespacedKey seed;

public PojoKeys(Plugin plugin) {
id = new NamespacedKey(plugin, "id");
displayMode = new NamespacedKey(plugin, "display_mode");
seed = new NamespacedKey(plugin, "seed");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ public static boolean isDisplayMode(ItemMeta meta) {
return poc.getOrDefault(keys().displayMode, PersistentDataType.BOOLEAN, false);
}

public static PojoItem getFrom(UserDefinedId id) {
return PojoInternal.instance().getItems().get(id);
}

/**
* <p>
* Get the {@link PojoItem} by getting ID from {@link ItemMeta}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;

import io.github.nahkd123.pojo.api.internal.PojoInternal;
import io.github.nahkd123.pojo.api.item.PojoItem;
Expand Down Expand Up @@ -101,10 +102,10 @@ public ItemStack createNew(boolean displayMode) {
LoreSorter lore = new LoreSorter(loreSections);

for (Component component : components) {
Object obj = dataHolder.get(component);
mat = component.applyMaterial(obj, mat, displayMode);
name = component.applyName(obj, name, displayMode);
component.applyLore(obj, lore, displayMode);
Object data = dataHolder.get(component);
mat = component.applyMaterial(data, mat, displayMode);
name = component.applyName(data, name, displayMode);
component.applyLore(data, lore, displayMode);
}

List<String> loreList = lore.build();
Expand Down Expand Up @@ -146,7 +147,7 @@ public ItemMeta updateMeta(ItemMeta source, boolean displayMode) {
}

List<String> loreList = lore.build();
if (name != null) source.setLocalizedName(name);
if (name != null) source.setDisplayName(name);
if (loreList.size() > 0) source.setLore(loreList);

// 3. Post display (storing data is not included atm)
Expand All @@ -155,22 +156,26 @@ public ItemMeta updateMeta(ItemMeta source, boolean displayMode) {
return source;
}

public ComponentDataHolder loadDataFrom(ItemMeta meta, boolean manipulate) {
return loadDataFrom(meta.getPersistentDataContainer(), manipulate);
}

/**
* <p>
* Load all component data from {@link ItemMeta}.
* Load all component data from {@link PersistentDataContainer}.
* </p>
*
* @param meta The meta to load.
* @param meta The persistent data container to load.
* @param manipulate {@code true} will allows components to manipulate others,
* like applying to computed stats for example.
* @return Loaded component data.
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public ComponentDataHolder loadDataFrom(ItemMeta meta, boolean manipulate) {
@SuppressWarnings({ "unchecked", "rawtypes" })
public ComponentDataHolder loadDataFrom(PersistentDataContainer container, boolean manipulate) {
ComponentDataHolder dataHolder = ComponentDataHolder.newHolder();

for (Component component : components) {
Object data = component.loadDataFrom(meta.getPersistentDataContainer());
Object data = component.loadDataFrom(container);
dataHolder.addRaw(component, data);
}

Expand All @@ -192,16 +197,21 @@ public void saveDataTo(ItemMeta meta, ComponentDataHolder dataHolder) {
}

List<String> loreList = lore.build();
if (name != null) meta.setLocalizedName(name);
if (name != null) meta.setDisplayName(name);
if (loreList.size() > 0) meta.setLore(loreList);

// 2. Post display & store data
for (Component component : components)
component.applyPostDisplay(dataHolder.get(component), meta, displayMode);

saveDataTo(meta.getPersistentDataContainer(), dataHolder);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public void saveDataTo(PersistentDataContainer container, ComponentDataHolder dataHolder) {
for (Component component : components) {
Object obj = dataHolder.get(component);
component.storeDataTo(meta.getPersistentDataContainer(), obj);
component.storeDataTo(container, obj);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public <C extends Component<T>, T> void add(C component, T data) {
List list = mapOfLists.get(component.getClass());
if (list == null) mapOfLists.put(component.getClass(), list = new ArrayList());
list.add(data);
mapOfData.put(component, mapOfData);
mapOfData.put(component, data);
}

@SuppressWarnings("unchecked")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,28 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.function.LongSupplier;
import java.util.function.Supplier;
import java.util.random.RandomGenerator;

import org.bukkit.NamespacedKey;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;

import io.github.nahkd123.pojo.expansion.event.InventoryEventsListener;
import io.github.nahkd123.pojo.expansion.item.standard.GemstoneComponent;
import io.github.nahkd123.pojo.expansion.item.standard.GemstoneSlotsComponent;
import io.github.nahkd123.pojo.expansion.item.standard.StatsComponent;
import io.github.nahkd123.pojo.expansion.stat.StatFactory;
import io.github.nahkd123.pojo.expansion.stat.StatLocalizer;
import io.github.nahkd123.pojo.expansion.stat.StatsLocalizer;
import io.github.nahkd123.pojo.expansion.stat.localize.GemstonesLocalizer;
import io.github.nahkd123.pojo.expansion.stat.localize.StatsLocalizer;
import io.github.nahkd123.pojo.expansion.stat.provided.AttributeStat;

public class PojoExpansionPlugin extends JavaPlugin {
// Shared
private RandomGenerator randomGenerator = new Random();
private StatsLocalizer statsLocalizer;
private GemstonesLocalizer gemstonesLocalizer;

// TODO Weird ass registry; replace this later
private Map<NamespacedKey, StatFactory> stats = new HashMap<>();
Expand All @@ -29,17 +35,33 @@ public void onLoad() {
// Stats
AttributeStat.registerFactory(new NamespacedKey(this, "attribute"));

// Getters (lazy/late)
Supplier<StatsLocalizer> statsLocalizer = () -> this.statsLocalizer;
Supplier<GemstonesLocalizer> gemstonesLocalizer = () -> this.gemstonesLocalizer;
LongSupplier seedGenerator = randomGenerator::nextLong;

// Item components
StatsComponent.registerFactory(new NamespacedKey(this, "stats"), () -> statsLocalizer,
randomGenerator::nextLong);
StatsComponent.registerFactory(new NamespacedKey(this, "stats"), statsLocalizer, seedGenerator);
GemstoneSlotsComponent.registerFactory(new NamespacedKey(this, "gemstone_slots"), gemstonesLocalizer);
GemstoneComponent.registerFactory(
new NamespacedKey(this, "gemstone"),
gemstonesLocalizer,
statsLocalizer,
seedGenerator);
}

@Override
public void onEnable() {
// Events
getServer().getPluginManager().registerEvents(new InventoryEventsListener(), this);

// Configurations
// @formatter:off
YamlConfiguration statsConfig = getOrSaveConfig("stats.yml");
statsLocalizer = new StatsLocalizer(StatLocalizer.DEFAULT).fromConfig(statsConfig.getConfigurationSection("localization"));
statsLocalizer = new StatsLocalizer().fromConfig(statsConfig.getConfigurationSection("localization"));

YamlConfiguration gemstonesConfig = getOrSaveConfig("gemstones.yml");
gemstonesLocalizer = new GemstonesLocalizer().fromConfig(gemstonesConfig.getConfigurationSection("localization"));
// @formatter:on
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package io.github.nahkd123.pojo.expansion.event;

import java.util.Optional;

import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import io.github.nahkd123.pojo.api.item.PojoItem;
import io.github.nahkd123.pojo.api.item.standard.StandardPojoItem;
import io.github.nahkd123.pojo.api.item.standard.component.ComponentDataHolder;
import io.github.nahkd123.pojo.expansion.item.standard.GemstoneComponent;
import io.github.nahkd123.pojo.expansion.item.standard.GemstoneSlotsComponent;
import io.github.nahkd123.pojo.expansion.stat.gemstone.Gemstone;
import io.github.nahkd123.pojo.expansion.stat.gemstone.GemstonesHolder;

public class InventoryEventsListener implements Listener {
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (event.isCancelled()) return;
if (event.getInventory().getType() != InventoryType.CRAFTING) return;
if (checkGemstoneApply(event)) return;
}

private boolean checkGemstoneApply(InventoryClickEvent event) {
ItemStack cursorStack = event.getCursor();
if (!(PojoItem.getFrom(cursorStack) instanceof StandardPojoItem cursorStd)) return false;

ItemStack clickedStack = event.getCurrentItem();
if (!(PojoItem.getFrom(clickedStack) instanceof StandardPojoItem clickedStd)) return false;

Optional<GemstoneComponent> gemstoneComponent = cursorStd.getComponents().stream()
.filter(s -> s instanceof GemstoneComponent)
.findAny().map(s -> (GemstoneComponent) s);
if (gemstoneComponent.isEmpty()) return false;

Optional<GemstoneSlotsComponent> gemstoneSlotComponent = clickedStd.getComponents().stream()
.filter(s -> s instanceof GemstoneSlotsComponent)
.findAny().map(s -> (GemstoneSlotsComponent) s);
if (gemstoneSlotComponent.isEmpty()) return false;

// Test
ComponentDataHolder clickedDataHolder = clickedStd.loadDataFrom(clickedStack.getItemMeta(), true);
GemstonesHolder slots = clickedDataHolder.get(gemstoneSlotComponent.get());

ComponentDataHolder cursorDataHolder = cursorStd.loadDataFrom(cursorStack.getItemMeta(), true);
Gemstone gemstone = new Gemstone(PojoItem.getId(cursorStack), cursorDataHolder);
if (!slots.tryAttachGemstone(gemstoneComponent.get().getSlotId(), gemstone)) return false;

// Apply
clickedStack = clickedStack.clone();
ItemMeta meta = clickedStack.getItemMeta();
clickedStd.saveDataTo(meta.getPersistentDataContainer(), clickedDataHolder);
clickedStd.updateMeta(meta);
clickedStack.setItemMeta(meta);
event.setCancelled(true);
event.setCurrentItem(clickedStack);
event.getWhoClicked().setItemOnCursor(null);
if (event.getWhoClicked() instanceof Player p)
p.playSound(p.getEyeLocation(), Sound.BLOCK_SMITHING_TABLE_USE, 1f, 1f);
return true;
}
}
Loading

0 comments on commit 236cacf

Please sign in to comment.