mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Merge branch 'master' of https://github.com/TheBusyBiscuit/Slimefun4
into experimental Conflicts: CHANGELOG.md src/main/java/io/github/thebusybiscuit/slimefun4/api/ErrorReport.java src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java
This commit is contained in:
commit
5c159b4247
28
CHANGELOG.md
28
CHANGELOG.md
@ -2,7 +2,8 @@
|
|||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
**Table of contents**
|
**Table of contents**
|
||||||
|
|
||||||
- [Release Candidate 14 (TBD)](#release-candidate-14-tbd)
|
- [Release Candidate 15 (TBD)](#release-candidate-15-tbd)
|
||||||
|
- [Release Candidate 14 (12 Jul 2020)](#release-candidate-14-12-jul-2020)
|
||||||
- [Release Candidate 13 (16 Jun 2020)](#release-candidate-13-16-jun-2020)
|
- [Release Candidate 13 (16 Jun 2020)](#release-candidate-13-16-jun-2020)
|
||||||
- [Release Candidate 12 (27 May 2020)](#release-candidate-12-27-may-2020)
|
- [Release Candidate 12 (27 May 2020)](#release-candidate-12-27-may-2020)
|
||||||
- [Release Candidate 11 (25 Apr 2020)](#release-candidate-11-25-apr-2020)
|
- [Release Candidate 11 (25 Apr 2020)](#release-candidate-11-25-apr-2020)
|
||||||
@ -19,7 +20,14 @@
|
|||||||
|
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
|
||||||
## Release Candidate 14 (TBD)
|
## Release Candidate 15 (TBD)
|
||||||
|
|
||||||
|
#### Additions
|
||||||
|
* Added Reinforced Cloth
|
||||||
|
* Added Bee protection to Hazmat Suit
|
||||||
|
* Added Enchantment Rune
|
||||||
|
|
||||||
|
## Release Candidate 14 (12 Jul 2020)
|
||||||
|
|
||||||
#### Additions
|
#### Additions
|
||||||
* Added support for Minecraft 1.16
|
* Added support for Minecraft 1.16
|
||||||
@ -42,9 +50,7 @@
|
|||||||
* Added runtime deprecation warnings for ItemHandlers and Attributes used by Addons
|
* Added runtime deprecation warnings for ItemHandlers and Attributes used by Addons
|
||||||
* Added a proper lag profiler
|
* Added a proper lag profiler
|
||||||
* Added per-plugin lag info to /sf timings
|
* Added per-plugin lag info to /sf timings
|
||||||
* Added Reinforced Cloth
|
* Added Indonesian translations
|
||||||
* Added Bee protection to Hazmat Suit
|
|
||||||
* Added Enchantment Rune
|
|
||||||
|
|
||||||
#### Changes
|
#### Changes
|
||||||
* Coolant Cells now last twice as long
|
* Coolant Cells now last twice as long
|
||||||
@ -65,9 +71,15 @@
|
|||||||
* performance improvements to Generators and Electric Machines
|
* performance improvements to Generators and Electric Machines
|
||||||
* Cargo timings will now be attributed to the corresponding node and not the Cargo manager
|
* Cargo timings will now be attributed to the corresponding node and not the Cargo manager
|
||||||
* Thunderstorms now count as night time for Solar Generators
|
* Thunderstorms now count as night time for Solar Generators
|
||||||
|
<<<<<<< HEAD
|
||||||
* Fixed an issue with moving androids getting stuck
|
* Fixed an issue with moving androids getting stuck
|
||||||
* Changed recipe of Hazmat Suits
|
* Changed recipe of Hazmat Suits
|
||||||
* Uranium can no longer be placed down
|
* Uranium can no longer be placed down
|
||||||
|
=======
|
||||||
|
* Coolant Cells can no longer be placed on the ground
|
||||||
|
* Crafting Nether Ice Coolant Cells now results in 4 items
|
||||||
|
* Moved Soulbound Backpack to the "Magical Gadgets" Category
|
||||||
|
>>>>>>> branch 'master' of https://github.com/TheBusyBiscuit/Slimefun4
|
||||||
|
|
||||||
#### Fixes
|
#### Fixes
|
||||||
* Fixed #2005
|
* Fixed #2005
|
||||||
@ -92,6 +104,12 @@
|
|||||||
* Fixed #2066
|
* Fixed #2066
|
||||||
* Fixed Rainbow Glass Panes not properly connecting to blocks
|
* Fixed Rainbow Glass Panes not properly connecting to blocks
|
||||||
* Fixed Androids turning in the wrong direction
|
* Fixed Androids turning in the wrong direction
|
||||||
|
* Fixed contributors losing their texture after restarts
|
||||||
|
* Fixed "korean" showing up as "null"
|
||||||
|
* Fixed an issue with moving androids getting stuck
|
||||||
|
* Fixed Cargo nodes sometimes preventing chunks from unloading
|
||||||
|
* Fixed #2081
|
||||||
|
* Fixed a NullPointerException when Generators throw an Error Report
|
||||||
|
|
||||||
## Release Candidate 13 (16 Jun 2020)
|
## Release Candidate 13 (16 Jun 2020)
|
||||||
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#13
|
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#13
|
||||||
|
@ -30,7 +30,7 @@ Here is a full summary of the differences between the two different versions of
|
|||||||
|
|
||||||
| | development (latest) | "stable" |
|
| | development (latest) | "stable" |
|
||||||
| ------------------ | -------- | -------- |
|
| ------------------ | -------- | -------- |
|
||||||
| **Minecraft version(s)** | :video_game: **1.13.\* - 1.16.\*** | :video_game: **1.13.\* - 1.15.\*** |
|
| **Minecraft version(s)** | :video_game: **1.13.\* - 1.16.\*** | :video_game: **1.13.\* - 1.16.\*** |
|
||||||
| **automatic updates** | :heavy_check_mark: | :heavy_check_mark: |
|
| **automatic updates** | :heavy_check_mark: | :heavy_check_mark: |
|
||||||
| **frequent updates** | :heavy_check_mark: | :x: |
|
| **frequent updates** | :heavy_check_mark: | :x: |
|
||||||
| **latest content** | :heavy_check_mark: | :x: |
|
| **latest content** | :heavy_check_mark: | :x: |
|
||||||
@ -114,6 +114,8 @@ To compile Slimefun yourself, follow these steps:
|
|||||||
|
|
||||||
If you are already using an IDE, make sure to import the project via git and set it as a *Maven project*. Then you should be able build it via Maven using the goals `clean package`.
|
If you are already using an IDE, make sure to import the project via git and set it as a *Maven project*. Then you should be able build it via Maven using the goals `clean package`.
|
||||||
|
|
||||||
|
If you have any further questions, then please join our [Discord Support Server](#discord) and ask your questions in the `#programming-help` channel. Note that we will not accept any bug reports from custom-compiled versions of Slimefun.
|
||||||
|
|
||||||
### Code Quality
|
### Code Quality
|
||||||
Slimefun uses [Sonarcloud.io](https://sonarcloud.io/dashboard?id=TheBusyBiscuit_Slimefun4) to monitor Code Quality.
|
Slimefun uses [Sonarcloud.io](https://sonarcloud.io/dashboard?id=TheBusyBiscuit_Slimefun4) to monitor Code Quality.
|
||||||
|
|
||||||
|
4
pom.xml
4
pom.xml
@ -60,7 +60,7 @@
|
|||||||
<url>https://repo.destroystokyo.com/repository/maven-public/</url>
|
<url>https://repo.destroystokyo.com/repository/maven-public/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
<id>worldedit-worldguard-repo</id>
|
<id>worldedit-repo</id>
|
||||||
<url>https://maven.sk89q.com/repo/</url>
|
<url>https://maven.sk89q.com/repo/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
@ -298,7 +298,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mockito</groupId>
|
<groupId>org.mockito</groupId>
|
||||||
<artifactId>mockito-core</artifactId>
|
<artifactId>mockito-core</artifactId>
|
||||||
<version>3.3.3</version>
|
<version>3.4.0</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.api;
|
package io.github.thebusybiscuit.slimefun4.api;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@ -92,7 +91,7 @@ public class ErrorReport {
|
|||||||
|
|
||||||
addon.getLogger().log(Level.WARNING, "");
|
addon.getLogger().log(Level.WARNING, "");
|
||||||
}
|
}
|
||||||
catch (IOException x) {
|
catch (Exception x) {
|
||||||
addon.getLogger().log(Level.SEVERE, x, () -> "An Error occurred while saving an Error-Report for Slimefun " + SlimefunPlugin.getVersion());
|
addon.getLogger().log(Level.SEVERE, x, () -> "An Error occurred while saving an Error-Report for Slimefun " + SlimefunPlugin.getVersion());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -116,6 +115,12 @@ public class ErrorReport {
|
|||||||
stream.println();
|
stream.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item.getEnergyTicker() != null) {
|
||||||
|
stream.println("Ticker-Info:");
|
||||||
|
stream.println(" Type: Indirect (Energy Network)");
|
||||||
|
stream.println();
|
||||||
|
}
|
||||||
|
|
||||||
stream.println("Slimefun Data:");
|
stream.println("Slimefun Data:");
|
||||||
stream.println(" ID: " + item.getID());
|
stream.println(" ID: " + item.getID());
|
||||||
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
|
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.api.exceptions;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.attributes.DamageableItem;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link WrongItemStackException} is thrown when someone tries to alter an {@link ItemStack}
|
||||||
|
* but actually wanted to alter a different one.
|
||||||
|
*
|
||||||
|
* If for example a {@link DamageableItem} accidentally damages the original {@link SlimefunItem}
|
||||||
|
* instead of the held {@link ItemStack}, this will be thrown.
|
||||||
|
*
|
||||||
|
* @author TheBusyBiscuit
|
||||||
|
*
|
||||||
|
* @see SlimefunItemStack
|
||||||
|
* @see SlimefunItem
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class WrongItemStackException extends RuntimeException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 9144658137363309071L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This constructs a new {@link WrongItemStackException} with the given error context.
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* An error message to display
|
||||||
|
*/
|
||||||
|
public WrongItemStackException(String message) {
|
||||||
|
super("You probably wanted alter a different ItemStack: " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -54,7 +54,7 @@ public class GPSNetwork {
|
|||||||
|
|
||||||
private final Map<UUID, Set<Location>> transmitters = new HashMap<>();
|
private final Map<UUID, Set<Location>> transmitters = new HashMap<>();
|
||||||
private final TeleportationManager teleportation = new TeleportationManager();
|
private final TeleportationManager teleportation = new TeleportationManager();
|
||||||
private final ResourceManager resourceManager = new ResourceManager(SlimefunPlugin.instance);
|
private final ResourceManager resourceManager = new ResourceManager(SlimefunPlugin.instance());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method updates the status of a {@link GPSTransmitter}.
|
* This method updates the status of a {@link GPSTransmitter}.
|
||||||
@ -256,7 +256,7 @@ public class GPSNetwork {
|
|||||||
SlimefunPlugin.getLocalization().sendMessage(p, "gps.waypoint.new", true);
|
SlimefunPlugin.getLocalization().sendMessage(p, "gps.waypoint.new", true);
|
||||||
p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 0.5F, 1F);
|
p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 0.5F, 1F);
|
||||||
|
|
||||||
ChatInput.waitForPlayer(SlimefunPlugin.instance, p, message -> addWaypoint(p, message, l));
|
ChatInput.waitForPlayer(SlimefunPlugin.instance(), p, message -> addWaypoint(p, message, l));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,6 +225,10 @@ public abstract class Network {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Location getRegulator() {
|
||||||
|
return regulator;
|
||||||
|
}
|
||||||
|
|
||||||
public void tick() {
|
public void tick() {
|
||||||
discoverStep();
|
discoverStep();
|
||||||
}
|
}
|
||||||
|
@ -372,7 +372,7 @@ public final class PlayerProfile {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(SlimefunPlugin.instance, () -> {
|
Bukkit.getScheduler().runTaskAsynchronously(SlimefunPlugin.instance(), () -> {
|
||||||
PlayerProfile pp = new PlayerProfile(p);
|
PlayerProfile pp = new PlayerProfile(p);
|
||||||
SlimefunPlugin.getRegistry().getPlayerProfiles().put(uuid, pp);
|
SlimefunPlugin.getRegistry().getPlayerProfiles().put(uuid, pp);
|
||||||
callback.accept(pp);
|
callback.accept(pp);
|
||||||
@ -393,7 +393,7 @@ public final class PlayerProfile {
|
|||||||
public static boolean request(OfflinePlayer p) {
|
public static boolean request(OfflinePlayer p) {
|
||||||
if (!SlimefunPlugin.getRegistry().getPlayerProfiles().containsKey(p.getUniqueId())) {
|
if (!SlimefunPlugin.getRegistry().getPlayerProfiles().containsKey(p.getUniqueId())) {
|
||||||
// Should probably prevent multiple requests for the same profile in the future
|
// Should probably prevent multiple requests for the same profile in the future
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(SlimefunPlugin.instance, () -> {
|
Bukkit.getScheduler().runTaskAsynchronously(SlimefunPlugin.instance(), () -> {
|
||||||
PlayerProfile pp = new PlayerProfile(p);
|
PlayerProfile pp = new PlayerProfile(p);
|
||||||
SlimefunPlugin.getRegistry().getPlayerProfiles().put(p.getUniqueId(), pp);
|
SlimefunPlugin.getRegistry().getPlayerProfiles().put(p.getUniqueId(), pp);
|
||||||
});
|
});
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.core.attributes;
|
||||||
|
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.misc.BasicCircuitBoard;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MobDropListener;
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This interface, when attached to a {@link SlimefunItem}, provides an easy method for adding
|
||||||
|
* a % chance to drop for an {@link SlimefunItem} on {@link EntityDeathEvent}, this chance is 0-100
|
||||||
|
* and used in conjunction with the MOB_DROP {@link RecipeType}.
|
||||||
|
*
|
||||||
|
* @author dNiym
|
||||||
|
*
|
||||||
|
* @see BasicCircuitBoard
|
||||||
|
* @see MobDropListener
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface RandomMobDrop extends ItemAttribute {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this method to make the object have a variable chance of being
|
||||||
|
* added to the dropList when {@link EntityType} (specified in the recipe)
|
||||||
|
* is killed by the {@link Player}
|
||||||
|
*
|
||||||
|
* @return The integer chance (0-100%) {@link SlimefunItem} has to drop.
|
||||||
|
*/
|
||||||
|
int getMobDropChance();
|
||||||
|
|
||||||
|
}
|
@ -14,6 +14,7 @@ import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
|
|||||||
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is just a simple helper class to provide static methods to the {@link Rechargeable}
|
* This is just a simple helper class to provide static methods to the {@link Rechargeable}
|
||||||
@ -26,7 +27,7 @@ import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
|
|||||||
*/
|
*/
|
||||||
final class RechargeableHelper {
|
final class RechargeableHelper {
|
||||||
|
|
||||||
private static final NamespacedKey CHARGE_KEY = new NamespacedKey(SlimefunPlugin.instance, "item_charge");
|
private static final NamespacedKey CHARGE_KEY = new NamespacedKey(SlimefunPlugin.instance(), "item_charge");
|
||||||
private static final String LORE_PREFIX = ChatColors.color("&8\u21E8 &e\u26A1 &7");
|
private static final String LORE_PREFIX = ChatColors.color("&8\u21E8 &e\u26A1 &7");
|
||||||
private static final Pattern REGEX = Pattern.compile(ChatColors.color("(&c&o)?" + LORE_PREFIX) + "[0-9\\.]+ \\/ [0-9\\.]+ J");
|
private static final Pattern REGEX = Pattern.compile(ChatColors.color("(&c&o)?" + LORE_PREFIX) + "[0-9\\.]+ \\/ [0-9\\.]+ J");
|
||||||
|
|
||||||
@ -69,7 +70,8 @@ final class RechargeableHelper {
|
|||||||
if (meta.hasLore()) {
|
if (meta.hasLore()) {
|
||||||
for (String line : meta.getLore()) {
|
for (String line : meta.getLore()) {
|
||||||
if (REGEX.matcher(line).matches()) {
|
if (REGEX.matcher(line).matches()) {
|
||||||
return Float.parseFloat(PatternUtils.SLASH_SEPARATOR.split(line)[0].replace(LORE_PREFIX, ""));
|
String data = ChatColor.stripColor(PatternUtils.SLASH_SEPARATOR.split(line)[0].replace(LORE_PREFIX, ""));
|
||||||
|
return Float.parseFloat(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,13 +60,19 @@ final class ContributorsMenu {
|
|||||||
|
|
||||||
menu.addItem(46, ChestMenuUtils.getPreviousButton(p, page + 1, pages));
|
menu.addItem(46, ChestMenuUtils.getPreviousButton(p, page + 1, pages));
|
||||||
menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
|
menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
|
||||||
if (page > 0) open(pl, page - 1);
|
if (page > 0) {
|
||||||
|
open(pl, page - 1);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
menu.addItem(52, ChestMenuUtils.getNextButton(p, page + 1, pages));
|
menu.addItem(52, ChestMenuUtils.getNextButton(p, page + 1, pages));
|
||||||
menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
|
menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
|
||||||
if (page + 1 < pages) open(pl, page + 1);
|
if (page + 1 < pages) {
|
||||||
|
open(pl, page + 1);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ class FireworksOption implements SlimefunGuideOption<Boolean> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SlimefunAddon getAddon() {
|
public SlimefunAddon getAddon() {
|
||||||
return SlimefunPlugin.instance;
|
return SlimefunPlugin.instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NamespacedKey getKey() {
|
public NamespacedKey getKey() {
|
||||||
return new NamespacedKey(SlimefunPlugin.instance, "research_fireworks");
|
return new NamespacedKey(SlimefunPlugin.instance(), "research_fireworks");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -22,12 +22,12 @@ class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideLayout> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SlimefunAddon getAddon() {
|
public SlimefunAddon getAddon() {
|
||||||
return SlimefunPlugin.instance;
|
return SlimefunPlugin.instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NamespacedKey getKey() {
|
public NamespacedKey getKey() {
|
||||||
return new NamespacedKey(SlimefunPlugin.instance, "guide_layout");
|
return new NamespacedKey(SlimefunPlugin.instance(), "guide_layout");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -23,7 +23,7 @@ class PlayerLanguageOption implements SlimefunGuideOption<String> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SlimefunAddon getAddon() {
|
public SlimefunAddon getAddon() {
|
||||||
return SlimefunPlugin.instance;
|
return SlimefunPlugin.instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -93,7 +93,7 @@ class PlayerLanguageOption implements SlimefunGuideOption<String> {
|
|||||||
String defaultLanguageString = SlimefunPlugin.getLocalization().getMessage(p, "languages.default");
|
String defaultLanguageString = SlimefunPlugin.getLocalization().getMessage(p, "languages.default");
|
||||||
|
|
||||||
menu.addItem(9, new CustomItem(defaultLanguage.getItem(), ChatColor.GRAY + defaultLanguageString + ChatColor.DARK_GRAY + " (" + defaultLanguage.getName(p) + ")", "", "&7\u21E8 &e" + SlimefunPlugin.getLocalization().getMessage(p, "guide.languages.select-default")), (pl, i, item, action) -> {
|
menu.addItem(9, new CustomItem(defaultLanguage.getItem(), ChatColor.GRAY + defaultLanguageString + ChatColor.DARK_GRAY + " (" + defaultLanguage.getName(p) + ")", "", "&7\u21E8 &e" + SlimefunPlugin.getLocalization().getMessage(p, "guide.languages.select-default")), (pl, i, item, action) -> {
|
||||||
SlimefunPlugin.instance.getServer().getPluginManager().callEvent(new PlayerLanguageChangeEvent(pl, SlimefunPlugin.getLocalization().getLanguage(pl), defaultLanguage));
|
SlimefunPlugin.instance().getServer().getPluginManager().callEvent(new PlayerLanguageChangeEvent(pl, SlimefunPlugin.getLocalization().getLanguage(pl), defaultLanguage));
|
||||||
setSelectedOption(pl, guide, null);
|
setSelectedOption(pl, guide, null);
|
||||||
|
|
||||||
SlimefunPlugin.getLocalization().sendMessage(pl, "guide.languages.updated", msg -> msg.replace("%lang%", defaultLanguageString));
|
SlimefunPlugin.getLocalization().sendMessage(pl, "guide.languages.updated", msg -> msg.replace("%lang%", defaultLanguageString));
|
||||||
@ -106,7 +106,7 @@ class PlayerLanguageOption implements SlimefunGuideOption<String> {
|
|||||||
|
|
||||||
for (Language language : SlimefunPlugin.getLocalization().getLanguages()) {
|
for (Language language : SlimefunPlugin.getLocalization().getLanguages()) {
|
||||||
menu.addItem(slot, new CustomItem(language.getItem(), ChatColor.GREEN + language.getName(p), "&b" + SlimefunPlugin.getLocalization().getProgress(language) + '%', "", "&7\u21E8 &e" + SlimefunPlugin.getLocalization().getMessage(p, "guide.languages.select")), (pl, i, item, action) -> {
|
menu.addItem(slot, new CustomItem(language.getItem(), ChatColor.GREEN + language.getName(p), "&b" + SlimefunPlugin.getLocalization().getProgress(language) + '%', "", "&7\u21E8 &e" + SlimefunPlugin.getLocalization().getMessage(p, "guide.languages.select")), (pl, i, item, action) -> {
|
||||||
SlimefunPlugin.instance.getServer().getPluginManager().callEvent(new PlayerLanguageChangeEvent(pl, SlimefunPlugin.getLocalization().getLanguage(pl), language));
|
SlimefunPlugin.instance().getServer().getPluginManager().callEvent(new PlayerLanguageChangeEvent(pl, SlimefunPlugin.getLocalization().getLanguage(pl), language));
|
||||||
setSelectedOption(pl, guide, language.getId());
|
setSelectedOption(pl, guide, language.getId());
|
||||||
|
|
||||||
String name = language.getName(pl);
|
String name = language.getName(pl);
|
||||||
|
@ -6,7 +6,7 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
|||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.food.DietCookie;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.food.DietCookie;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.food.FortuneCookie;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.food.FortuneCookie;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package io.github.thebusybiscuit.slimefun4.core.handlers;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.core.networks.cargo;
|
package io.github.thebusybiscuit.slimefun4.core.networks.cargo;
|
||||||
|
|
||||||
import java.util.Deque;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@ -8,23 +7,18 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.network.Network;
|
import io.github.thebusybiscuit.slimefun4.api.network.Network;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.network.NetworkComponent;
|
import io.github.thebusybiscuit.slimefun4.api.network.NetworkComponent;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram;
|
import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.inventory.DirtyChestMenu;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link CargoNet} is a type of {@link Network} which deals with {@link ItemStack} transportation.
|
* The {@link CargoNet} is a type of {@link Network} which deals with {@link ItemStack} transportation.
|
||||||
@ -49,7 +43,7 @@ public class CargoNet extends ChestTerminalNetwork {
|
|||||||
private final Set<Location> inputNodes = new HashSet<>();
|
private final Set<Location> inputNodes = new HashSet<>();
|
||||||
private final Set<Location> outputNodes = new HashSet<>();
|
private final Set<Location> outputNodes = new HashSet<>();
|
||||||
|
|
||||||
private final Map<Location, Integer> roundRobin = new HashMap<>();
|
protected final Map<Location, Integer> roundRobin = new HashMap<>();
|
||||||
private int tickDelayThreshold = 0;
|
private int tickDelayThreshold = 0;
|
||||||
|
|
||||||
public static CargoNet getNetworkFromLocation(Location l) {
|
public static CargoNet getNetworkFromLocation(Location l) {
|
||||||
@ -182,7 +176,9 @@ public class CargoNet extends ChestTerminalNetwork {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SlimefunPlugin.getProfiler().scheduleEntries(1 + inputNodes.size());
|
SlimefunPlugin.getProfiler().scheduleEntries(1 + inputNodes.size());
|
||||||
Slimefun.runSync(() -> run(inputs, outputs, chestTerminalInputs, chestTerminalOutputs));
|
|
||||||
|
CargoNetworkTask runnable = new CargoNetworkTask(this, inputs, outputs, chestTerminalInputs, chestTerminalOutputs);
|
||||||
|
Slimefun.runSync(runnable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,135 +236,6 @@ public class CargoNet extends ChestTerminalNetwork {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run(Map<Location, Integer> inputs, Map<Integer, List<Location>> outputs, Set<Location> chestTerminalInputs, Set<Location> chestTerminalOutputs) {
|
|
||||||
long timestamp = System.nanoTime();
|
|
||||||
|
|
||||||
// Chest Terminal Code
|
|
||||||
if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) {
|
|
||||||
handleItemRequests(chestTerminalInputs, chestTerminalOutputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// All operations happen here: Everything gets iterated from the Input Nodes.
|
|
||||||
// (Apart from ChestTerminal Buses)
|
|
||||||
for (Map.Entry<Location, Integer> entry : inputs.entrySet()) {
|
|
||||||
long nodeTimestamp = System.nanoTime();
|
|
||||||
Location input = entry.getKey();
|
|
||||||
Optional<Block> attachedBlock = getAttachedBlock(input.getBlock());
|
|
||||||
|
|
||||||
if (attachedBlock.isPresent()) {
|
|
||||||
routeItems(input, attachedBlock.get(), entry.getValue(), outputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will prevent this timings from showing up for the Cargo Manager
|
|
||||||
timestamp += SlimefunPlugin.getProfiler().closeEntry(entry.getKey(), SlimefunItems.CARGO_INPUT_NODE.getItem(), nodeTimestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chest Terminal Code
|
|
||||||
if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) {
|
|
||||||
updateTerminals(chestTerminalInputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Submit a timings report
|
|
||||||
SlimefunPlugin.getProfiler().closeEntry(regulator, SlimefunItems.CARGO_MANAGER.getItem(), timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void routeItems(Location inputNode, Block inputTarget, int frequency, Map<Integer, List<Location>> outputNodes) {
|
|
||||||
AtomicReference<Object> inventory = new AtomicReference<>();
|
|
||||||
ItemStackAndInteger slot = CargoUtils.withdraw(inputNode.getBlock(), inputTarget, inventory);
|
|
||||||
|
|
||||||
if (slot == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack stack = slot.getItem();
|
|
||||||
int previousSlot = slot.getInt();
|
|
||||||
List<Location> outputs = outputNodes.get(frequency);
|
|
||||||
|
|
||||||
if (outputs != null) {
|
|
||||||
stack = distributeItem(stack, inputNode, outputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack != null) {
|
|
||||||
Object inputInventory = inventory.get();
|
|
||||||
|
|
||||||
if (inputInventory instanceof DirtyChestMenu) {
|
|
||||||
DirtyChestMenu menu = (DirtyChestMenu) inputInventory;
|
|
||||||
|
|
||||||
if (menu.getItemInSlot(previousSlot) == null) {
|
|
||||||
menu.replaceExistingItem(previousSlot, stack);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
inputTarget.getWorld().dropItem(inputTarget.getLocation().add(0, 1, 0), stack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inputInventory instanceof Inventory) {
|
|
||||||
Inventory inv = (Inventory) inputInventory;
|
|
||||||
|
|
||||||
if (inv.getItem(previousSlot) == null) {
|
|
||||||
inv.setItem(previousSlot, stack);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
inputTarget.getWorld().dropItem(inputTarget.getLocation().add(0, 1, 0), stack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ItemStack distributeItem(ItemStack stack, Location inputNode, List<Location> outputNodes) {
|
|
||||||
ItemStack item = stack;
|
|
||||||
|
|
||||||
Deque<Location> destinations = new LinkedList<>(outputNodes);
|
|
||||||
Config cfg = BlockStorage.getLocationInfo(inputNode);
|
|
||||||
boolean roundrobin = "true".equals(cfg.getString("round-robin"));
|
|
||||||
|
|
||||||
if (roundrobin) {
|
|
||||||
roundRobinSort(inputNode, destinations);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Location output : destinations) {
|
|
||||||
Optional<Block> target = getAttachedBlock(output.getBlock());
|
|
||||||
|
|
||||||
if (target.isPresent()) {
|
|
||||||
item = CargoUtils.insert(output.getBlock(), target.get(), item);
|
|
||||||
|
|
||||||
if (item == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method sorts a given {@link Deque} of output node locations using a semi-accurate
|
|
||||||
* round-robin method.
|
|
||||||
*
|
|
||||||
* @param inputNode
|
|
||||||
* The {@link Location} of the input node
|
|
||||||
* @param outputNodes
|
|
||||||
* A {@link Deque} of {@link Location Locations} of the output nodes
|
|
||||||
*/
|
|
||||||
private void roundRobinSort(Location inputNode, Deque<Location> outputNodes) {
|
|
||||||
int index = roundRobin.getOrDefault(inputNode, 0);
|
|
||||||
|
|
||||||
if (index < outputNodes.size()) {
|
|
||||||
// Not ideal but actually not bad performance-wise over more elegant alternatives
|
|
||||||
for (int i = 0; i < index; i++) {
|
|
||||||
Location temp = outputNodes.removeFirst();
|
|
||||||
outputNodes.add(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
index = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
roundRobin.put(inputNode, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns the frequency a given node is set to.
|
* This method returns the frequency a given node is set to.
|
||||||
* Should there be an {@link Exception} to this method it will fall back to zero in
|
* Should there be an {@link Exception} to this method it will fall back to zero in
|
||||||
|
@ -0,0 +1,183 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.core.networks.cargo;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.inventory.DirtyChestMenu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link CargoNetworkTask} is the actual {@link Runnable} responsible for moving {@link ItemStack ItemStacks}
|
||||||
|
* around the {@link CargoNet}.
|
||||||
|
*
|
||||||
|
* Inbefore this was just a method in the {@link CargoNet} class.
|
||||||
|
* However for aesthetic reasons but mainly to prevent the Cargo Task from showing up as
|
||||||
|
* "lambda:xyz-123" in timing reports... this was moved.
|
||||||
|
*
|
||||||
|
* @see CargoNet
|
||||||
|
* @see CargoUtils
|
||||||
|
* @see ChestTerminalNetwork
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class CargoNetworkTask implements Runnable {
|
||||||
|
|
||||||
|
private final CargoNet network;
|
||||||
|
private final Map<Location, Inventory> inventories = new HashMap<>();
|
||||||
|
|
||||||
|
private final Map<Location, Integer> inputs;
|
||||||
|
private final Map<Integer, List<Location>> outputs;
|
||||||
|
|
||||||
|
private final Set<Location> chestTerminalInputs;
|
||||||
|
private final Set<Location> chestTerminalOutputs;
|
||||||
|
|
||||||
|
CargoNetworkTask(CargoNet network, Map<Location, Integer> inputs, Map<Integer, List<Location>> outputs, Set<Location> chestTerminalInputs, Set<Location> chestTerminalOutputs) {
|
||||||
|
this.network = network;
|
||||||
|
|
||||||
|
this.inputs = inputs;
|
||||||
|
this.outputs = outputs;
|
||||||
|
this.chestTerminalInputs = chestTerminalInputs;
|
||||||
|
this.chestTerminalOutputs = chestTerminalOutputs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
long timestamp = System.nanoTime();
|
||||||
|
|
||||||
|
// Chest Terminal Code
|
||||||
|
if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) {
|
||||||
|
network.handleItemRequests(inventories, chestTerminalInputs, chestTerminalOutputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// All operations happen here: Everything gets iterated from the Input Nodes.
|
||||||
|
// (Apart from ChestTerminal Buses)
|
||||||
|
for (Map.Entry<Location, Integer> entry : inputs.entrySet()) {
|
||||||
|
long nodeTimestamp = System.nanoTime();
|
||||||
|
Location input = entry.getKey();
|
||||||
|
Optional<Block> attachedBlock = network.getAttachedBlock(input);
|
||||||
|
|
||||||
|
if (attachedBlock.isPresent()) {
|
||||||
|
routeItems(input, attachedBlock.get(), entry.getValue(), outputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will prevent this timings from showing up for the Cargo Manager
|
||||||
|
timestamp += SlimefunPlugin.getProfiler().closeEntry(entry.getKey(), SlimefunItems.CARGO_INPUT_NODE.getItem(), nodeTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chest Terminal Code
|
||||||
|
if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) {
|
||||||
|
network.updateTerminals(chestTerminalInputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Submit a timings report
|
||||||
|
SlimefunPlugin.getProfiler().closeEntry(network.getRegulator(), SlimefunItems.CARGO_MANAGER.getItem(), timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void routeItems(Location inputNode, Block inputTarget, int frequency, Map<Integer, List<Location>> outputNodes) {
|
||||||
|
ItemStackAndInteger slot = CargoUtils.withdraw(inventories, inputNode.getBlock(), inputTarget);
|
||||||
|
|
||||||
|
if (slot == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemStack stack = slot.getItem();
|
||||||
|
int previousSlot = slot.getInt();
|
||||||
|
List<Location> destinations = outputNodes.get(frequency);
|
||||||
|
|
||||||
|
if (destinations != null) {
|
||||||
|
stack = distributeItem(stack, inputNode, destinations);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stack != null) {
|
||||||
|
Inventory inv = inventories.get(inputTarget.getLocation());
|
||||||
|
|
||||||
|
if (inv != null) {
|
||||||
|
if (inv.getItem(previousSlot) == null) {
|
||||||
|
inv.setItem(previousSlot, stack);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
inputTarget.getWorld().dropItem(inputTarget.getLocation().add(0, 1, 0), stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DirtyChestMenu menu = CargoUtils.getChestMenu(inputTarget);
|
||||||
|
|
||||||
|
if (menu != null) {
|
||||||
|
if (menu.getItemInSlot(previousSlot) == null) {
|
||||||
|
menu.replaceExistingItem(previousSlot, stack);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
inputTarget.getWorld().dropItem(inputTarget.getLocation().add(0, 1, 0), stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ItemStack distributeItem(ItemStack stack, Location inputNode, List<Location> outputNodes) {
|
||||||
|
ItemStack item = stack;
|
||||||
|
|
||||||
|
Deque<Location> destinations = new LinkedList<>(outputNodes);
|
||||||
|
Config cfg = BlockStorage.getLocationInfo(inputNode);
|
||||||
|
boolean roundrobin = "true".equals(cfg.getString("round-robin"));
|
||||||
|
|
||||||
|
if (roundrobin) {
|
||||||
|
roundRobinSort(inputNode, destinations);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Location output : destinations) {
|
||||||
|
Optional<Block> target = network.getAttachedBlock(output);
|
||||||
|
|
||||||
|
if (target.isPresent()) {
|
||||||
|
item = CargoUtils.insert(inventories, output.getBlock(), target.get(), item);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sorts a given {@link Deque} of output node locations using a semi-accurate
|
||||||
|
* round-robin method.
|
||||||
|
*
|
||||||
|
* @param inputNode
|
||||||
|
* The {@link Location} of the input node
|
||||||
|
* @param outputNodes
|
||||||
|
* A {@link Deque} of {@link Location Locations} of the output nodes
|
||||||
|
*/
|
||||||
|
private void roundRobinSort(Location inputNode, Deque<Location> outputNodes) {
|
||||||
|
int index = network.roundRobin.getOrDefault(inputNode, 0);
|
||||||
|
|
||||||
|
if (index < outputNodes.size()) {
|
||||||
|
// Not ideal but actually not bad performance-wise over more elegant alternatives
|
||||||
|
for (int i = 0; i < index; i++) {
|
||||||
|
Location temp = outputNodes.removeFirst();
|
||||||
|
outputNodes.add(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
index = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
network.roundRobin.put(inputNode, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,9 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.core.networks.cargo;
|
package io.github.thebusybiscuit.slimefun4.core.networks.cargo;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.Map;
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Tag;
|
import org.bukkit.Tag;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@ -83,15 +82,23 @@ final class CargoUtils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ItemStack withdraw(Block node, Block target, ItemStack template) {
|
static ItemStack withdraw(Map<Location, Inventory> inventories, Block node, Block target, ItemStack template) {
|
||||||
DirtyChestMenu menu = getChestMenu(target);
|
DirtyChestMenu menu = getChestMenu(target);
|
||||||
|
|
||||||
if (menu == null) {
|
if (menu == null) {
|
||||||
if (hasInventory(target)) {
|
if (hasInventory(target)) {
|
||||||
|
Inventory inventory = inventories.get(target.getLocation());
|
||||||
|
|
||||||
|
if (inventory != null) {
|
||||||
|
return withdrawFromVanillaInventory(node, template, inventory);
|
||||||
|
}
|
||||||
|
|
||||||
BlockState state = target.getState();
|
BlockState state = target.getState();
|
||||||
|
|
||||||
if (state instanceof InventoryHolder) {
|
if (state instanceof InventoryHolder) {
|
||||||
return withdrawFromVanillaInventory(node, template, ((InventoryHolder) state).getInventory());
|
inventory = ((InventoryHolder) state).getInventory();
|
||||||
|
inventories.put(target.getLocation(), inventory);
|
||||||
|
return withdrawFromVanillaInventory(node, template, inventory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,10 +142,10 @@ final class CargoUtils {
|
|||||||
ItemStackWrapper wrapper = new ItemStackWrapper(template);
|
ItemStackWrapper wrapper = new ItemStackWrapper(template);
|
||||||
|
|
||||||
for (int slot = minSlot; slot < maxSlot; slot++) {
|
for (int slot = minSlot; slot < maxSlot; slot++) {
|
||||||
// Changes to this ItemStack are synchronized with the Item in the Inventory
|
// Changes to these ItemStacks are synchronized with the Item in the Inventory
|
||||||
ItemStack itemInSlot = contents[slot];
|
ItemStack itemInSlot = contents[slot];
|
||||||
|
|
||||||
if (SlimefunUtils.isItemSimilar(itemInSlot, wrapper, true) && matchesFilter(node, itemInSlot)) {
|
if (SlimefunUtils.isItemSimilar(itemInSlot, wrapper, true, false) && matchesFilter(node, itemInSlot)) {
|
||||||
if (itemInSlot.getAmount() > template.getAmount()) {
|
if (itemInSlot.getAmount() > template.getAmount()) {
|
||||||
itemInSlot.setAmount(itemInSlot.getAmount() - template.getAmount());
|
itemInSlot.setAmount(itemInSlot.getAmount() - template.getAmount());
|
||||||
return template;
|
return template;
|
||||||
@ -154,7 +161,7 @@ final class CargoUtils {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ItemStackAndInteger withdraw(Block node, Block target, AtomicReference<Object> inventory) {
|
static ItemStackAndInteger withdraw(Map<Location, Inventory> inventories, Block node, Block target) {
|
||||||
DirtyChestMenu menu = getChestMenu(target);
|
DirtyChestMenu menu = getChestMenu(target);
|
||||||
|
|
||||||
if (menu != null) {
|
if (menu != null) {
|
||||||
@ -163,17 +170,30 @@ final class CargoUtils {
|
|||||||
|
|
||||||
if (matchesFilter(node, is)) {
|
if (matchesFilter(node, is)) {
|
||||||
menu.replaceExistingItem(slot, null);
|
menu.replaceExistingItem(slot, null);
|
||||||
inventory.set(menu);
|
|
||||||
return new ItemStackAndInteger(is, slot);
|
return new ItemStackAndInteger(is, slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (hasInventory(target)) {
|
else if (hasInventory(target)) {
|
||||||
|
Inventory inventory = inventories.get(target.getLocation());
|
||||||
|
|
||||||
|
if (inventory != null) {
|
||||||
|
return withdrawFromVanillaInventory(node, inventory);
|
||||||
|
}
|
||||||
|
|
||||||
BlockState state = target.getState();
|
BlockState state = target.getState();
|
||||||
|
|
||||||
if (state instanceof InventoryHolder) {
|
if (state instanceof InventoryHolder) {
|
||||||
Inventory inv = ((InventoryHolder) state).getInventory();
|
inventory = ((InventoryHolder) state).getInventory();
|
||||||
|
inventories.put(target.getLocation(), inventory);
|
||||||
|
return withdrawFromVanillaInventory(node, inventory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ItemStackAndInteger withdrawFromVanillaInventory(Block node, Inventory inv) {
|
||||||
ItemStack[] contents = inv.getContents();
|
ItemStack[] contents = inv.getContents();
|
||||||
int minSlot = 0;
|
int minSlot = 0;
|
||||||
int maxSlot = contents.length;
|
int maxSlot = contents.length;
|
||||||
@ -191,17 +211,14 @@ final class CargoUtils {
|
|||||||
|
|
||||||
if (matchesFilter(node, is)) {
|
if (matchesFilter(node, is)) {
|
||||||
inv.setItem(slot, null);
|
inv.setItem(slot, null);
|
||||||
inventory.set(inv);
|
|
||||||
return new ItemStackAndInteger(is, slot);
|
return new ItemStackAndInteger(is, slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ItemStack insert(Block node, Block target, ItemStack stack) {
|
static ItemStack insert(Map<Location, Inventory> inventories, Block node, Block target, ItemStack stack) {
|
||||||
if (!matchesFilter(node, stack)) {
|
if (!matchesFilter(node, stack)) {
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
@ -210,10 +227,18 @@ final class CargoUtils {
|
|||||||
|
|
||||||
if (menu == null) {
|
if (menu == null) {
|
||||||
if (hasInventory(target)) {
|
if (hasInventory(target)) {
|
||||||
|
Inventory inventory = inventories.get(target.getLocation());
|
||||||
|
|
||||||
|
if (inventory != null) {
|
||||||
|
return insertIntoVanillaInventory(stack, inventory);
|
||||||
|
}
|
||||||
|
|
||||||
BlockState state = target.getState();
|
BlockState state = target.getState();
|
||||||
|
|
||||||
if (state instanceof InventoryHolder) {
|
if (state instanceof InventoryHolder) {
|
||||||
return insertIntoVanillaInventory(stack, ((InventoryHolder) state).getInventory());
|
inventory = ((InventoryHolder) state).getInventory();
|
||||||
|
inventories.put(target.getLocation(), inventory);
|
||||||
|
return insertIntoVanillaInventory(stack, inventory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +276,7 @@ final class CargoUtils {
|
|||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ItemStack insertIntoVanillaInventory(ItemStack stack, Inventory inv) {
|
private static ItemStack insertIntoVanillaInventory(ItemStack stack, Inventory inv) {
|
||||||
ItemStack[] contents = inv.getContents();
|
ItemStack[] contents = inv.getContents();
|
||||||
int minSlot = 0;
|
int minSlot = 0;
|
||||||
int maxSlot = contents.length;
|
int maxSlot = contents.length;
|
||||||
@ -359,9 +384,10 @@ final class CargoUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store the returned Config instance to avoid heavy calls
|
// Store the returned Config instance to avoid heavy calls
|
||||||
Config blockInfo = BlockStorage.getLocationInfo(block.getLocation());
|
Config blockData = BlockStorage.getLocationInfo(block.getLocation());
|
||||||
String id = blockInfo.getString("id");
|
String id = blockData.getString("id");
|
||||||
|
|
||||||
|
// Cargo Output nodes have no filter actually
|
||||||
if (id.equals("CARGO_NODE_OUTPUT")) {
|
if (id.equals("CARGO_NODE_OUTPUT")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -373,43 +399,9 @@ final class CargoUtils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean lore = "true".equals(blockInfo.getString("filter-lore"));
|
boolean lore = "true".equals(blockData.getString("filter-lore"));
|
||||||
ItemStackWrapper wrapper = new ItemStackWrapper(item);
|
boolean allowByDefault = !"whitelist".equals(blockData.getString("filter-type"));
|
||||||
|
return matchesFilterList(item, menu, lore, allowByDefault);
|
||||||
if ("whitelist".equals(blockInfo.getString("filter-type"))) {
|
|
||||||
List<ItemStack> templateItems = new LinkedList<>();
|
|
||||||
|
|
||||||
for (int slot : FILTER_SLOTS) {
|
|
||||||
ItemStack template = menu.getItemInSlot(slot);
|
|
||||||
|
|
||||||
if (template != null) {
|
|
||||||
templateItems.add(template);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (templateItems.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ItemStack stack : templateItems) {
|
|
||||||
if (SlimefunUtils.isItemSimilar(wrapper, stack, lore)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (int slot : FILTER_SLOTS) {
|
|
||||||
ItemStack itemInSlot = menu.getItemInSlot(slot);
|
|
||||||
|
|
||||||
if (itemInSlot != null && SlimefunUtils.isItemSimilar(wrapper, itemInSlot, lore, false)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception x) {
|
catch (Exception x) {
|
||||||
Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Exception occurred while trying to filter items for a Cargo Node (" + id + ") at " + new BlockPosition(block));
|
Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Exception occurred while trying to filter items for a Cargo Node (" + id + ") at " + new BlockPosition(block));
|
||||||
@ -417,6 +409,27 @@ final class CargoUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean matchesFilterList(ItemStack item, BlockMenu menu, boolean respectLore, boolean defaultValue) {
|
||||||
|
ItemStackWrapper wrapper = null;
|
||||||
|
|
||||||
|
for (int slot : FILTER_SLOTS) {
|
||||||
|
ItemStack stack = menu.getItemInSlot(slot);
|
||||||
|
|
||||||
|
if (stack != null) {
|
||||||
|
if (wrapper == null) {
|
||||||
|
// Only create this as needed to save performance
|
||||||
|
wrapper = new ItemStackWrapper(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SlimefunUtils.isItemSimilar(stack, wrapper, respectLore, false)) {
|
||||||
|
return !defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the whitelist/blacklist slots in a Cargo Input Node. If you wish to access the items
|
* Get the whitelist/blacklist slots in a Cargo Input Node. If you wish to access the items
|
||||||
* in the cargo (without hardcoding the slots in case of change) then you can use this method.
|
* in the cargo (without hardcoding the slots in case of change) then you can use this method.
|
||||||
|
@ -12,7 +12,6 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -69,25 +68,29 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
super(SlimefunPlugin.getNetworkManager(), regulator);
|
super(SlimefunPlugin.getNetworkManager(), regulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Optional<Block> getAttachedBlock(Block block) {
|
protected Optional<Block> getAttachedBlock(Location l) {
|
||||||
|
if (l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4)) {
|
||||||
|
Block block = l.getBlock();
|
||||||
|
|
||||||
if (block.getType() == Material.PLAYER_WALL_HEAD) {
|
if (block.getType() == Material.PLAYER_WALL_HEAD) {
|
||||||
BlockFace cached = connectorCache.get(block.getLocation());
|
BlockFace cached = connectorCache.get(l);
|
||||||
|
|
||||||
if (cached != null) {
|
if (cached != null) {
|
||||||
return Optional.of(block.getRelative(cached));
|
return Optional.of(block.getRelative(cached));
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockFace face = ((Directional) block.getBlockData()).getFacing().getOppositeFace();
|
BlockFace face = ((Directional) block.getBlockData()).getFacing().getOppositeFace();
|
||||||
connectorCache.put(block.getLocation(), face);
|
connectorCache.put(l, face);
|
||||||
return Optional.of(block.getRelative(face));
|
return Optional.of(block.getRelative(face));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void handleItemRequests(Set<Location> providers, Set<Location> destinations) {
|
protected void handleItemRequests(Map<Location, Inventory> inventories, Set<Location> providers, Set<Location> destinations) {
|
||||||
collectImportRequests();
|
collectImportRequests(inventories);
|
||||||
collectExportRequests();
|
collectExportRequests(inventories);
|
||||||
collectTerminalRequests();
|
collectTerminalRequests();
|
||||||
|
|
||||||
Iterator<ItemRequest> iterator = itemRequests.iterator();
|
Iterator<ItemRequest> iterator = itemRequests.iterator();
|
||||||
@ -99,10 +102,10 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
|
|
||||||
switch (request.getDirection()) {
|
switch (request.getDirection()) {
|
||||||
case INSERT:
|
case INSERT:
|
||||||
distributeInsertionRequest(request, menu, iterator, destinations);
|
distributeInsertionRequest(inventories, request, menu, iterator, destinations);
|
||||||
break;
|
break;
|
||||||
case WITHDRAW:
|
case WITHDRAW:
|
||||||
collectExtractionRequest(request, menu, iterator, providers);
|
collectExtractionRequest(inventories, request, menu, iterator, providers);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -111,14 +114,14 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void distributeInsertionRequest(ItemRequest request, BlockMenu terminal, Iterator<ItemRequest> iterator, Set<Location> destinations) {
|
private void distributeInsertionRequest(Map<Location, Inventory> inventories, ItemRequest request, BlockMenu terminal, Iterator<ItemRequest> iterator, Set<Location> destinations) {
|
||||||
ItemStack item = request.getItem();
|
ItemStack item = request.getItem();
|
||||||
|
|
||||||
for (Location l : destinations) {
|
for (Location l : destinations) {
|
||||||
Optional<Block> target = getAttachedBlock(l.getBlock());
|
Optional<Block> target = getAttachedBlock(l);
|
||||||
|
|
||||||
if (target.isPresent()) {
|
if (target.isPresent()) {
|
||||||
item = CargoUtils.insert(l.getBlock(), target.get(), item);
|
item = CargoUtils.insert(inventories, l.getBlock(), target.get(), item);
|
||||||
|
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
terminal.replaceExistingItem(request.getSlot(), null);
|
terminal.replaceExistingItem(request.getSlot(), null);
|
||||||
@ -134,7 +137,7 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void collectExtractionRequest(ItemRequest request, BlockMenu terminal, Iterator<ItemRequest> iterator, Set<Location> providers) {
|
private void collectExtractionRequest(Map<Location, Inventory> inventories, ItemRequest request, BlockMenu terminal, Iterator<ItemRequest> iterator, Set<Location> providers) {
|
||||||
int slot = request.getSlot();
|
int slot = request.getSlot();
|
||||||
ItemStack prevStack = terminal.getItemInSlot(slot);
|
ItemStack prevStack = terminal.getItemInSlot(slot);
|
||||||
|
|
||||||
@ -147,10 +150,10 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
ItemStack item = request.getItem();
|
ItemStack item = request.getItem();
|
||||||
|
|
||||||
for (Location l : providers) {
|
for (Location l : providers) {
|
||||||
Optional<Block> target = getAttachedBlock(l.getBlock());
|
Optional<Block> target = getAttachedBlock(l);
|
||||||
|
|
||||||
if (target.isPresent()) {
|
if (target.isPresent()) {
|
||||||
ItemStack is = CargoUtils.withdraw(l.getBlock(), target.get(), item);
|
ItemStack is = CargoUtils.withdraw(inventories, l.getBlock(), target.get(), item);
|
||||||
|
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
if (stack == null) {
|
if (stack == null) {
|
||||||
@ -184,7 +187,7 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void collectImportRequests() {
|
private void collectImportRequests(Map<Location, Inventory> inventories) {
|
||||||
SlimefunItem item = SlimefunItem.getByID("CT_IMPORT_BUS");
|
SlimefunItem item = SlimefunItem.getByID("CT_IMPORT_BUS");
|
||||||
|
|
||||||
for (Location bus : imports) {
|
for (Location bus : imports) {
|
||||||
@ -192,10 +195,10 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
BlockMenu menu = BlockStorage.getInventory(bus);
|
BlockMenu menu = BlockStorage.getInventory(bus);
|
||||||
|
|
||||||
if (menu.getItemInSlot(17) == null) {
|
if (menu.getItemInSlot(17) == null) {
|
||||||
Optional<Block> target = getAttachedBlock(bus.getBlock());
|
Optional<Block> target = getAttachedBlock(bus);
|
||||||
|
|
||||||
if (target.isPresent()) {
|
if (target.isPresent()) {
|
||||||
ItemStackAndInteger stack = CargoUtils.withdraw(bus.getBlock(), target.get(), new AtomicReference<>());
|
ItemStackAndInteger stack = CargoUtils.withdraw(inventories, bus.getBlock(), target.get());
|
||||||
|
|
||||||
if (stack != null) {
|
if (stack != null) {
|
||||||
menu.replaceExistingItem(17, stack.getItem());
|
menu.replaceExistingItem(17, stack.getItem());
|
||||||
@ -211,7 +214,7 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void collectExportRequests() {
|
private void collectExportRequests(Map<Location, Inventory> inventories) {
|
||||||
SlimefunItem item = SlimefunItem.getByID("CT_EXPORT_BUS");
|
SlimefunItem item = SlimefunItem.getByID("CT_EXPORT_BUS");
|
||||||
|
|
||||||
for (Location bus : exports) {
|
for (Location bus : exports) {
|
||||||
@ -219,10 +222,10 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
BlockMenu menu = BlockStorage.getInventory(bus);
|
BlockMenu menu = BlockStorage.getInventory(bus);
|
||||||
|
|
||||||
if (menu.getItemInSlot(17) != null) {
|
if (menu.getItemInSlot(17) != null) {
|
||||||
Optional<Block> target = getAttachedBlock(bus.getBlock());
|
Optional<Block> target = getAttachedBlock(bus);
|
||||||
|
|
||||||
if (target.isPresent()) {
|
if (target.isPresent()) {
|
||||||
menu.replaceExistingItem(17, CargoUtils.insert(bus.getBlock(), target.get(), menu.getItemInSlot(17)));
|
menu.replaceExistingItem(17, CargoUtils.insert(inventories, bus.getBlock(), target.get(), menu.getItemInSlot(17)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +234,10 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
|
|
||||||
for (int slot : slots) {
|
for (int slot : slots) {
|
||||||
ItemStack template = menu.getItemInSlot(slot);
|
ItemStack template = menu.getItemInSlot(slot);
|
||||||
if (template != null) items.add(new CustomItem(template, 1));
|
|
||||||
|
if (template != null) {
|
||||||
|
items.add(new CustomItem(template, 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!items.isEmpty()) {
|
if (!items.isEmpty()) {
|
||||||
@ -339,7 +345,7 @@ abstract class ChestTerminalNetwork extends Network {
|
|||||||
List<ItemStackAndInteger> items = new LinkedList<>();
|
List<ItemStackAndInteger> items = new LinkedList<>();
|
||||||
|
|
||||||
for (Location l : providers) {
|
for (Location l : providers) {
|
||||||
Optional<Block> block = getAttachedBlock(l.getBlock());
|
Optional<Block> block = getAttachedBlock(l);
|
||||||
|
|
||||||
if (block.isPresent()) {
|
if (block.isPresent()) {
|
||||||
Block target = block.get();
|
Block target = block.get();
|
||||||
|
@ -13,6 +13,7 @@ import org.apache.commons.lang.Validate;
|
|||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.data.ComputedOptional;
|
import io.github.thebusybiscuit.cscorelib2.data.ComputedOptional;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
|
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,7 +133,8 @@ public class Contributor {
|
|||||||
*/
|
*/
|
||||||
public String getTexture() {
|
public String getTexture() {
|
||||||
if (!headTexture.isComputed() || !headTexture.isPresent()) {
|
if (!headTexture.isComputed() || !headTexture.isPresent()) {
|
||||||
return HeadTexture.UNKNOWN.getTexture();
|
String cached = SlimefunPlugin.getGitHubService().getCachedTexture(githubUsername);
|
||||||
|
return cached != null ? cached : HeadTexture.UNKNOWN.getTexture();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return headTexture.get();
|
return headTexture.get();
|
||||||
|
@ -15,6 +15,7 @@ import com.google.gson.JsonObject;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.config.Config;
|
import io.github.thebusybiscuit.cscorelib2.config.Config;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.services.localization.Translators;
|
import io.github.thebusybiscuit.slimefun4.core.services.localization.Translators;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +31,9 @@ public class GitHubService {
|
|||||||
private final String repository;
|
private final String repository;
|
||||||
private final Set<GitHubConnector> connectors;
|
private final Set<GitHubConnector> connectors;
|
||||||
private final ConcurrentMap<String, Contributor> contributors;
|
private final ConcurrentMap<String, Contributor> contributors;
|
||||||
|
|
||||||
private final Config uuidCache = new Config("plugins/Slimefun/cache/github/uuids.yml");
|
private final Config uuidCache = new Config("plugins/Slimefun/cache/github/uuids.yml");
|
||||||
|
private final Config texturesCache = new Config("plugins/Slimefun/cache/github/skins.yml");
|
||||||
|
|
||||||
private boolean logging = false;
|
private boolean logging = false;
|
||||||
|
|
||||||
@ -196,18 +199,31 @@ public class GitHubService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This will store the {@link UUID} of all {@link Contributor Contributors} in memory
|
* This will store the {@link UUID} and texture of all {@link Contributor Contributors}
|
||||||
* in a {@link File} to save requests the next time we iterate over them.
|
* in memory in a {@link File} to save requests the next time we iterate over them.
|
||||||
*/
|
*/
|
||||||
protected void saveUUIDCache() {
|
protected void saveCache() {
|
||||||
for (Contributor contributor : contributors.values()) {
|
for (Contributor contributor : contributors.values()) {
|
||||||
Optional<UUID> uuid = contributor.getUniqueId();
|
Optional<UUID> uuid = contributor.getUniqueId();
|
||||||
|
|
||||||
if (uuid.isPresent()) {
|
if (uuid.isPresent()) {
|
||||||
uuidCache.setValue(contributor.getName(), uuid.get());
|
uuidCache.setValue(contributor.getName(), uuid.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (contributor.hasTexture()) {
|
||||||
|
String texture = contributor.getTexture();
|
||||||
|
|
||||||
|
if (!texture.equals(HeadTexture.UNKNOWN.getTexture())) {
|
||||||
|
texturesCache.setValue(contributor.getName(), texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uuidCache.save();
|
uuidCache.save();
|
||||||
|
texturesCache.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getCachedTexture(String name) {
|
||||||
|
return texturesCache.getString(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,9 +56,9 @@ class GitHubTask implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requests >= MAX_REQUESTS_PER_MINUTE && SlimefunPlugin.instance != null && SlimefunPlugin.instance.isEnabled()) {
|
if (requests >= MAX_REQUESTS_PER_MINUTE && SlimefunPlugin.instance() != null && SlimefunPlugin.instance().isEnabled()) {
|
||||||
// Slow down API requests and wait a minute after more than x requests were made
|
// Slow down API requests and wait a minute after more than x requests were made
|
||||||
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance, this::grabTextures, 2 * 60 * 20L);
|
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance(), this::grabTextures, 2 * 60 * 20L);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (GitHubConnector connector : gitHubService.getConnectors()) {
|
for (GitHubConnector connector : gitHubService.getConnectors()) {
|
||||||
@ -69,7 +69,7 @@ class GitHubTask implements Runnable {
|
|||||||
|
|
||||||
// We only wanna save this if all Connectors finished already
|
// We only wanna save this if all Connectors finished already
|
||||||
// This will run multiple times but thats okay, this way we get as much data as possible stored
|
// This will run multiple times but thats okay, this way we get as much data as possible stored
|
||||||
gitHubService.saveUUIDCache();
|
gitHubService.saveCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int requestTexture(Contributor contributor, Map<String, String> skins) {
|
private int requestTexture(Contributor contributor, Map<String, String> skins) {
|
||||||
@ -94,14 +94,14 @@ class GitHubTask implements Runnable {
|
|||||||
|
|
||||||
// Retry after 5 minutes if it was rate-limiting
|
// Retry after 5 minutes if it was rate-limiting
|
||||||
if (x.getMessage().contains("429")) {
|
if (x.getMessage().contains("429")) {
|
||||||
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance, this::grabTextures, 5 * 60 * 20L);
|
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance(), this::grabTextures, 5 * 60 * 20L);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
catch (TooManyRequestsException x) {
|
catch (TooManyRequestsException x) {
|
||||||
Slimefun.getLogger().log(Level.WARNING, "Received a rate-limit from mojang.com, retrying in 4 minutes");
|
Slimefun.getLogger().log(Level.WARNING, "Received a rate-limit from mojang.com, retrying in 4 minutes");
|
||||||
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance, this::grabTextures, 4 * 60 * 20L);
|
Bukkit.getScheduler().runTaskLaterAsynchronously(SlimefunPlugin.instance(), this::grabTextures, 4 * 60 * 20L);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -39,11 +39,11 @@ enum SupportedLanguage {
|
|||||||
GREEK("el", false, "1514de6dd2b7682b1d3ebcd10291ae1f021e3012b5c8beffeb75b1819eb4259d"),
|
GREEK("el", false, "1514de6dd2b7682b1d3ebcd10291ae1f021e3012b5c8beffeb75b1819eb4259d"),
|
||||||
SLOVAK("sk", true, "6c72a8c115a1fb669a25715c4d15f22136ac4c2452784e4894b3d56bc5b0b9"),
|
SLOVAK("sk", true, "6c72a8c115a1fb669a25715c4d15f22136ac4c2452784e4894b3d56bc5b0b9"),
|
||||||
VIETNAMESE("vi", true, "8a57b9d7dd04169478cfdb8d0b6fd0b8c82b6566bb28371ee9a7c7c1671ad0bb"),
|
VIETNAMESE("vi", true, "8a57b9d7dd04169478cfdb8d0b6fd0b8c82b6566bb28371ee9a7c7c1671ad0bb"),
|
||||||
INDONESIAN("id", false, "5db2678ccaba7934412cb97ee16d416463a392574c5906352f18dea42895ee"),
|
INDONESIAN("id", true, "5db2678ccaba7934412cb97ee16d416463a392574c5906352f18dea42895ee"),
|
||||||
CHINESE_CHINA("zh-CN", true, "7f9bc035cdc80f1ab5e1198f29f3ad3fdd2b42d9a69aeb64de990681800b98dc"),
|
CHINESE_CHINA("zh-CN", true, "7f9bc035cdc80f1ab5e1198f29f3ad3fdd2b42d9a69aeb64de990681800b98dc"),
|
||||||
CHINESE_TAIWAN("zh-TW", true, "702a4afb2e1e2e3a1894a8b74272f95cfa994ce53907f9ac140bd3c932f9f"),
|
CHINESE_TAIWAN("zh-TW", true, "702a4afb2e1e2e3a1894a8b74272f95cfa994ce53907f9ac140bd3c932f9f"),
|
||||||
JAPANESE("ja", true, "d640ae466162a47d3ee33c4076df1cab96f11860f07edb1f0832c525a9e33323"),
|
JAPANESE("ja", true, "d640ae466162a47d3ee33c4076df1cab96f11860f07edb1f0832c525a9e33323"),
|
||||||
KOREAN("kr", false, "fc1be5f12f45e413eda56f3de94e08d90ede8e339c7b1e8f32797390e9a5f"),
|
KOREAN("ko", false, "fc1be5f12f45e413eda56f3de94e08d90ede8e339c7b1e8f32797390e9a5f"),
|
||||||
HEBREW("he", false, "1ba086a2cc7272cf5ba49c80248546c22e5ef1bab54120e8a8e5d9e75b6a"),
|
HEBREW("he", false, "1ba086a2cc7272cf5ba49c80248546c22e5ef1bab54120e8a8e5d9e75b6a"),
|
||||||
ARABIC("ar", true, "a4be759a9cf7f0a19a7e8e62f23789ad1d21cebae38af9d9541676a3db001572"),
|
ARABIC("ar", true, "a4be759a9cf7f0a19a7e8e62f23789ad1d21cebae38af9d9541676a3db001572"),
|
||||||
TURKISH("tr", true, "9852b9aba3482348514c1034d0affe73545c9de679ae4647f99562b5e5f47d09"),
|
TURKISH("tr", true, "9852b9aba3482348514c1034d0affe73545c9de679ae4647f99562b5e5f47d09"),
|
||||||
|
@ -130,6 +130,10 @@ public class Translators {
|
|||||||
|
|
||||||
// Translators - Indonesian
|
// Translators - Indonesian
|
||||||
addTranslator("diradho", SupportedLanguage.INDONESIAN, false);
|
addTranslator("diradho", SupportedLanguage.INDONESIAN, false);
|
||||||
|
addTranslator("Frozenkamui", SupportedLanguage.INDONESIAN, false);
|
||||||
|
addTranslator("aril3721", SupportedLanguage.INDONESIAN, false);
|
||||||
|
addTranslator("JunederZ", SupportedLanguage.INDONESIAN, false);
|
||||||
|
addTranslator("EnderWingZ", SupportedLanguage.INDONESIAN, false);
|
||||||
|
|
||||||
// Translators - Thai
|
// Translators - Thai
|
||||||
addTranslator("phoomin2012", SupportedLanguage.THAI, false);
|
addTranslator("phoomin2012", SupportedLanguage.THAI, false);
|
||||||
|
@ -16,7 +16,7 @@ class PlaceholderAPIHook extends PlaceholderExpansion {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAuthor() {
|
public String getAuthor() {
|
||||||
return SlimefunPlugin.instance.getDescription().getAuthors().toString();
|
return SlimefunPlugin.instance().getDescription().getAuthors().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -26,7 +26,7 @@ class PlaceholderAPIHook extends PlaceholderExpansion {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getVersion() {
|
public String getVersion() {
|
||||||
return SlimefunPlugin.instance.getDescription().getVersion();
|
return SlimefunPlugin.instance().getDescription().getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,10 +25,6 @@ class PerformanceSummary {
|
|||||||
private static final int MIN_ITEMS = 3;
|
private static final int MIN_ITEMS = 3;
|
||||||
private static final int MAX_ITEMS = 10;
|
private static final int MAX_ITEMS = 10;
|
||||||
|
|
||||||
// A minecraft server tick is 50ms and Slimefun ticks are stretched across
|
|
||||||
// two ticks (sync and async blocks), so we use 100ms as a reference here
|
|
||||||
static final int MAX_TICK_DURATION = 100;
|
|
||||||
|
|
||||||
private final SlimefunProfiler profiler;
|
private final SlimefunProfiler profiler;
|
||||||
private final PerformanceRating rating;
|
private final PerformanceRating rating;
|
||||||
private final long totalElapsedTime;
|
private final long totalElapsedTime;
|
||||||
|
@ -10,7 +10,6 @@ import java.util.concurrent.ExecutorService;
|
|||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
@ -25,7 +24,6 @@ import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
|||||||
import io.github.thebusybiscuit.slimefun4.implementation.tasks.TickerTask;
|
import io.github.thebusybiscuit.slimefun4.implementation.tasks.TickerTask;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link SlimefunProfiler} works closely to the {@link TickerTask} and is
|
* The {@link SlimefunProfiler} works closely to the {@link TickerTask} and is
|
||||||
@ -41,7 +39,11 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
|
|||||||
*/
|
*/
|
||||||
public class SlimefunProfiler {
|
public class SlimefunProfiler {
|
||||||
|
|
||||||
private final ExecutorService executor = Executors.newFixedThreadPool(3);
|
// A minecraft server tick is 50ms and Slimefun ticks are stretched across
|
||||||
|
// two ticks (sync and async blocks), so we use 100ms as a reference here
|
||||||
|
private static final int MAX_TICK_DURATION = 100;
|
||||||
|
|
||||||
|
private final ExecutorService executor = Executors.newFixedThreadPool(4);
|
||||||
private final AtomicBoolean running = new AtomicBoolean(false);
|
private final AtomicBoolean running = new AtomicBoolean(false);
|
||||||
private final AtomicInteger queued = new AtomicInteger(0);
|
private final AtomicInteger queued = new AtomicInteger(0);
|
||||||
|
|
||||||
@ -125,7 +127,7 @@ public class SlimefunProfiler {
|
|||||||
public void stop() {
|
public void stop() {
|
||||||
running.set(false);
|
running.set(false);
|
||||||
|
|
||||||
if (SlimefunPlugin.instance == null || !SlimefunPlugin.instance.isEnabled()) {
|
if (SlimefunPlugin.instance() == null || !SlimefunPlugin.instance().isEnabled()) {
|
||||||
// Slimefun has been disabled
|
// Slimefun has been disabled
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -135,13 +137,9 @@ public class SlimefunProfiler {
|
|||||||
|
|
||||||
// Wait for all timing results to come in
|
// Wait for all timing results to come in
|
||||||
while (queued.get() > 0 && !running.get()) {
|
while (queued.get() > 0 && !running.get()) {
|
||||||
try {
|
// Ideally we would wait some time here but the ticker task may be faster
|
||||||
Thread.sleep(1);
|
// than 1ms, so it would halt this summary for up to 7 minutes
|
||||||
}
|
// Not perfect performance-wise but this is a seperate Thread anyway
|
||||||
catch (InterruptedException e) {
|
|
||||||
Slimefun.getLogger().log(Level.SEVERE, "A waiting Thread was interrupted", e);
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (running.get()) {
|
if (running.get()) {
|
||||||
@ -253,7 +251,7 @@ public class SlimefunProfiler {
|
|||||||
|
|
||||||
protected float getPercentageOfTick() {
|
protected float getPercentageOfTick() {
|
||||||
float millis = totalElapsedTime / 1000000.0F;
|
float millis = totalElapsedTime / 1000000.0F;
|
||||||
float fraction = (millis * 100.0F) / PerformanceSummary.MAX_TICK_DURATION;
|
float fraction = (millis * 100.0F) / MAX_TICK_DURATION;
|
||||||
return Math.round((fraction * 100.0F) / 100.0F);
|
return Math.round((fraction * 100.0F) / 100.0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ import io.github.thebusybiscuit.slimefun4.core.services.plugins.ThirdPartyPlugin
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SlimefunProfiler;
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SlimefunProfiler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.backpacks.Cooler;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.backpacks.Cooler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.BasicCircuitBoard;
|
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.tools.GrapplingHook;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.tools.GrapplingHook;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SeismicAxe;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.weapons.SeismicAxe;
|
||||||
@ -107,7 +106,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu;
|
|||||||
*/
|
*/
|
||||||
public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
||||||
|
|
||||||
public static SlimefunPlugin instance;
|
private static SlimefunPlugin instance;
|
||||||
|
|
||||||
private MinecraftVersion minecraftVersion = MinecraftVersion.UNKNOWN;
|
private MinecraftVersion minecraftVersion = MinecraftVersion.UNKNOWN;
|
||||||
|
|
||||||
@ -331,7 +330,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
|||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
// Slimefun never loaded successfully, so we don't even bother doing stuff here
|
// Slimefun never loaded successfully, so we don't even bother doing stuff here
|
||||||
if (instance == null || minecraftVersion == MinecraftVersion.UNIT_TEST) {
|
if (instance() == null || minecraftVersion == MinecraftVersion.UNIT_TEST) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,7 +431,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
|||||||
new BeeListener(this);
|
new BeeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
new MobDropListener(this, (BasicCircuitBoard) SlimefunItems.BASIC_CIRCUIT_BOARD.getItem());
|
new MobDropListener(this);
|
||||||
|
|
||||||
// Item-specific Listeners
|
// Item-specific Listeners
|
||||||
new VampireBladeListener(this, (VampireBlade) SlimefunItems.BLADE_OF_VAMPIRES.getItem());
|
new VampireBladeListener(this, (VampireBlade) SlimefunItems.BLADE_OF_VAMPIRES.getItem());
|
||||||
@ -484,6 +483,10 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static SlimefunPlugin instance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
public static Config getCfg() {
|
public static Config getCfg() {
|
||||||
return instance.config;
|
return instance.config;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
|
|||||||
|
|
||||||
public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
||||||
|
|
||||||
private final NamespacedKey guideSearch = new NamespacedKey(SlimefunPlugin.instance, "search");
|
private final NamespacedKey guideSearch = new NamespacedKey(SlimefunPlugin.instance(), "search");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SlimefunGuideLayout getLayout() {
|
public SlimefunGuideLayout getLayout() {
|
||||||
@ -53,7 +53,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void openBook(Player p, PlayerProfile profile, List<ChatComponent> lines, boolean backButton) {
|
private void openBook(Player p, PlayerProfile profile, List<ChatComponent> lines, boolean backButton) {
|
||||||
CustomBookInterface book = new CustomBookInterface(SlimefunPlugin.instance);
|
CustomBookInterface book = new CustomBookInterface(SlimefunPlugin.instance());
|
||||||
book.setTitle(SlimefunPlugin.getLocalization().getMessage(p, "guide.title.main"));
|
book.setTitle(SlimefunPlugin.getLocalization().getMessage(p, "guide.title.main"));
|
||||||
|
|
||||||
for (int i = 0; i < lines.size(); i = i + 10) {
|
for (int i = 0; i < lines.size(); i = i + 10) {
|
||||||
@ -63,7 +63,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
|||||||
|
|
||||||
header.setClickEvent(new ClickEvent(guideSearch, player -> Slimefun.runSync(() -> {
|
header.setClickEvent(new ClickEvent(guideSearch, player -> Slimefun.runSync(() -> {
|
||||||
SlimefunPlugin.getLocalization().sendMessage(player, "guide.search.message");
|
SlimefunPlugin.getLocalization().sendMessage(player, "guide.search.message");
|
||||||
ChatInput.waitForPlayer(SlimefunPlugin.instance, player, msg -> SlimefunGuide.openSearch(profile, msg, true, true));
|
ChatInput.waitForPlayer(SlimefunPlugin.instance(), player, msg -> SlimefunGuide.openSearch(profile, msg, true, true));
|
||||||
}, 1)));
|
}, 1)));
|
||||||
|
|
||||||
page.append(header);
|
page.append(header);
|
||||||
@ -77,7 +77,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
|||||||
if (backButton) {
|
if (backButton) {
|
||||||
ChatComponent button = new ChatComponent(ChatColor.DARK_BLUE + "\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"));
|
ChatComponent button = new ChatComponent(ChatColor.DARK_BLUE + "\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"));
|
||||||
button.setHoverEvent(new HoverEvent(ChatColor.DARK_BLUE + "\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"), "", ChatColor.GRAY + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.guide")));
|
button.setHoverEvent(new HoverEvent(ChatColor.DARK_BLUE + "\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"), "", ChatColor.GRAY + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.guide")));
|
||||||
button.setClickEvent(new ClickEvent(new NamespacedKey(SlimefunPlugin.instance, "slimefun_guide"), pl -> openMainMenu(profile, 1)));
|
button.setClickEvent(new ClickEvent(new NamespacedKey(SlimefunPlugin.instance(), "slimefun_guide"), pl -> openMainMenu(profile, 1)));
|
||||||
page.append(button);
|
page.append(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void appendSlimefunItem(Category category, int page, Player p, PlayerProfile profile, SlimefunItem item, List<ChatComponent> items) {
|
private void appendSlimefunItem(Category category, int page, Player p, PlayerProfile profile, SlimefunItem item, List<ChatComponent> items) {
|
||||||
NamespacedKey key = new NamespacedKey(SlimefunPlugin.instance, item.getID().toLowerCase(Locale.ROOT));
|
NamespacedKey key = new NamespacedKey(SlimefunPlugin.instance(), item.getID().toLowerCase(Locale.ROOT));
|
||||||
|
|
||||||
if (!Slimefun.hasUnlocked(p, item, false) && item.getResearch() != null) {
|
if (!Slimefun.hasUnlocked(p, item, false) && item.getResearch() != null) {
|
||||||
Research research = item.getResearch();
|
Research research = item.getResearch();
|
||||||
|
@ -561,7 +561,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation {
|
|||||||
pl.closeInventory();
|
pl.closeInventory();
|
||||||
|
|
||||||
SlimefunPlugin.getLocalization().sendMessage(pl, "guide.search.message");
|
SlimefunPlugin.getLocalization().sendMessage(pl, "guide.search.message");
|
||||||
ChatInput.waitForPlayer(SlimefunPlugin.instance, pl, msg -> SlimefunGuide.openSearch(profile, msg, isSurvivalMode(), isSurvivalMode()));
|
ChatInput.waitForPlayer(SlimefunPlugin.instance(), pl, msg -> SlimefunGuide.openSearch(profile, msg, isSurvivalMode(), isSurvivalMode()));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
@ -42,7 +42,7 @@ class RecipeChoiceTask implements Runnable {
|
|||||||
public void start(Inventory inv) {
|
public void start(Inventory inv) {
|
||||||
Validate.notNull(inv, "Inventory must not be null");
|
Validate.notNull(inv, "Inventory must not be null");
|
||||||
inventory = inv;
|
inventory = inv;
|
||||||
id = Bukkit.getScheduler().runTaskTimerAsynchronously(SlimefunPlugin.instance, this, 0, UPDATE_INTERVAL).getTaskId();
|
id = Bukkit.getScheduler().runTaskTimerAsynchronously(SlimefunPlugin.instance(), this, 0, UPDATE_INTERVAL).getTaskId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(int slot, MaterialChoice choice) {
|
public void add(int slot, MaterialChoice choice) {
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.implementation.items;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is basically a quickstart class for your very first {@link SlimefunItem}.
|
||||||
|
* This class easily allows you to add one {@link ItemHandler} to your {@link SlimefunItem}.
|
||||||
|
*
|
||||||
|
* You could use an {@link ItemUseHandler} for example to give your {@link SlimefunItem}
|
||||||
|
* very basic right-click functionalities.
|
||||||
|
*
|
||||||
|
* @author TheBusyBiscuit
|
||||||
|
*
|
||||||
|
* @see ItemHandler
|
||||||
|
* @see ItemUseHandler
|
||||||
|
* @see SlimefunItem
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
* The Type of {@link ItemHandler} to add to this {@link SlimefunItem}
|
||||||
|
*/
|
||||||
|
public abstract class SimpleSlimefunItem<T extends ItemHandler> extends SlimefunItem {
|
||||||
|
|
||||||
|
public SimpleSlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
|
super(category, item, recipeType, recipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleSlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
|
||||||
|
super(category, item, recipeType, recipe, recipeOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void preRegister() {
|
||||||
|
addItemHandler(getItemHandler());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This returns the {@link ItemHandler} that will be added to this {@link SlimefunItem}.
|
||||||
|
*
|
||||||
|
* @return The {@link ItemHandler} that should be added to this {@link SlimefunItem}
|
||||||
|
*/
|
||||||
|
public abstract T getItemHandler();
|
||||||
|
|
||||||
|
}
|
@ -20,7 +20,7 @@ public class AncientPedestal extends SlimefunItem {
|
|||||||
Item stack = listener.findItem(b);
|
Item stack = listener.findItem(b);
|
||||||
|
|
||||||
if (stack != null) {
|
if (stack != null) {
|
||||||
stack.removeMetadata("no_pickup", SlimefunPlugin.instance);
|
stack.removeMetadata("no_pickup", SlimefunPlugin.instance());
|
||||||
b.getWorld().dropItem(b.getLocation(), listener.fixItemStack(stack.getItemStack(), stack.getCustomName()));
|
b.getWorld().dropItem(b.getLocation(), listener.fixItemStack(stack.getItemStack(), stack.getCustomName()));
|
||||||
stack.remove();
|
stack.remove();
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ import org.bukkit.metadata.FixedMetadataValue;
|
|||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public abstract class ButcherAndroid extends ProgrammableAndroid {
|
public abstract class ButcherAndroid extends ProgrammableAndroid {
|
||||||
@ -31,14 +30,14 @@ public abstract class ButcherAndroid extends ProgrammableAndroid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void attack(Block b, Predicate<LivingEntity> predicate) {
|
protected void attack(Block b, BlockFace face, Predicate<LivingEntity> predicate) {
|
||||||
double damage = getTier() >= 3 ? 20D : 4D * getTier();
|
double damage = getTier() >= 3 ? 20D : 4D * getTier();
|
||||||
double radius = 4.0 + getTier();
|
double radius = 4.0 + getTier();
|
||||||
|
|
||||||
for (Entity n : b.getWorld().getNearbyEntities(b.getLocation(), radius, radius, radius, n -> n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.isValid() && predicate.test((LivingEntity) n))) {
|
for (Entity n : b.getWorld().getNearbyEntities(b.getLocation(), radius, radius, radius, n -> n instanceof LivingEntity && !(n instanceof ArmorStand) && !(n instanceof Player) && n.isValid() && predicate.test((LivingEntity) n))) {
|
||||||
boolean attack = false;
|
boolean attack = false;
|
||||||
|
|
||||||
switch (BlockFace.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "rotation"))) {
|
switch (face) {
|
||||||
case NORTH:
|
case NORTH:
|
||||||
attack = n.getLocation().getZ() < b.getZ();
|
attack = n.getLocation().getZ() < b.getZ();
|
||||||
break;
|
break;
|
||||||
@ -57,10 +56,10 @@ public abstract class ButcherAndroid extends ProgrammableAndroid {
|
|||||||
|
|
||||||
if (attack) {
|
if (attack) {
|
||||||
if (n.hasMetadata(METADATA_KEY)) {
|
if (n.hasMetadata(METADATA_KEY)) {
|
||||||
n.removeMetadata(METADATA_KEY, SlimefunPlugin.instance);
|
n.removeMetadata(METADATA_KEY, SlimefunPlugin.instance());
|
||||||
}
|
}
|
||||||
|
|
||||||
n.setMetadata(METADATA_KEY, new FixedMetadataValue(SlimefunPlugin.instance, new AndroidInstance(this, b)));
|
n.setMetadata(METADATA_KEY, new FixedMetadataValue(SlimefunPlugin.instance(), new AndroidInstance(this, b)));
|
||||||
|
|
||||||
((LivingEntity) n).damage(damage);
|
((LivingEntity) n).damage(damage);
|
||||||
break;
|
break;
|
||||||
|
@ -83,22 +83,22 @@ enum Instruction {
|
|||||||
// Action - Sword
|
// Action - Sword
|
||||||
ATTACK_MOBS_ANIMALS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
ATTACK_MOBS_ANIMALS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
||||||
Predicate<LivingEntity> predicate = e -> true;
|
Predicate<LivingEntity> predicate = e -> true;
|
||||||
android.attack(b, predicate);
|
android.attack(b, face, predicate);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
ATTACK_MOBS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
ATTACK_MOBS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
||||||
Predicate<LivingEntity> predicate = e -> e instanceof Monster;
|
Predicate<LivingEntity> predicate = e -> e instanceof Monster;
|
||||||
android.attack(b, predicate);
|
android.attack(b, face, predicate);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
ATTACK_ANIMALS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
ATTACK_ANIMALS(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
||||||
Predicate<LivingEntity> predicate = e -> e instanceof Animals;
|
Predicate<LivingEntity> predicate = e -> e instanceof Animals;
|
||||||
android.attack(b, predicate);
|
android.attack(b, face, predicate);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
ATTACK_ANIMALS_ADULT(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
ATTACK_ANIMALS_ADULT(AndroidType.FIGHTER, HeadTexture.SCRIPT_ATTACK, (android, b, inv, face) -> {
|
||||||
Predicate<LivingEntity> predicate = e -> e instanceof Animals && e instanceof Ageable && ((Ageable) e).isAdult();
|
Predicate<LivingEntity> predicate = e -> e instanceof Animals && e instanceof Ageable && ((Ageable) e).isAdult();
|
||||||
android.attack(b, predicate);
|
android.attack(b, face, predicate);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// Action - Axe
|
// Action - Axe
|
||||||
|
@ -441,7 +441,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem implements Invent
|
|||||||
SlimefunPlugin.getLocalization().sendMessages(p, "android.scripts.enter-name");
|
SlimefunPlugin.getLocalization().sendMessages(p, "android.scripts.enter-name");
|
||||||
int id = nextId;
|
int id = nextId;
|
||||||
|
|
||||||
ChatInput.waitForPlayer(SlimefunPlugin.instance, p, msg -> {
|
ChatInput.waitForPlayer(SlimefunPlugin.instance(), p, msg -> {
|
||||||
Script.upload(p, getAndroidType(), id, msg, code);
|
Script.upload(p, getAndroidType(), id, msg, code);
|
||||||
SlimefunPlugin.getLocalization().sendMessages(p, "android.scripts.uploaded");
|
SlimefunPlugin.getLocalization().sendMessages(p, "android.scripts.uploaded");
|
||||||
openScriptDownloader(p, b, page);
|
openScriptDownloader(p, b, page);
|
||||||
@ -814,7 +814,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem implements Invent
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void attack(Block b, Predicate<LivingEntity> predicate) {
|
protected void attack(Block b, BlockFace face, Predicate<LivingEntity> predicate) {
|
||||||
throw new UnsupportedOperationException("Non-butcher Android tried to butcher!");
|
throw new UnsupportedOperationException("Non-butcher Android tried to butcher!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,9 +6,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class EnderBackpack extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
public class EnderBackpack extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
||||||
|
@ -7,10 +7,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.api.player.PlayerBackpack;
|
import io.github.thebusybiscuit.slimefun4.api.player.PlayerBackpack;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener;
|
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -21,9 +21,9 @@ import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockDispenseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockDispenseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
|
@ -22,10 +22,10 @@ import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ public class Composter extends SimpleSlimefunItem<BlockUseHandler> implements Re
|
|||||||
pushItem(b, output.clone());
|
pushItem(b, output.clone());
|
||||||
});
|
});
|
||||||
|
|
||||||
tasks.execute(SlimefunPlugin.instance);
|
tasks.execute(SlimefunPlugin.instance());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SlimefunPlugin.getLocalization().sendMessage(p, "machines.wrong-item", true);
|
SlimefunPlugin.getLocalization().sendMessage(p, "machines.wrong-item", true);
|
||||||
|
@ -19,10 +19,10 @@ import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
@ -7,10 +7,10 @@ import org.bukkit.block.Block;
|
|||||||
import org.bukkit.block.Furnace;
|
import org.bukkit.block.Furnace;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
|
@ -13,13 +13,13 @@ import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler;
|
import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram;
|
import io.github.thebusybiscuit.slimefun4.utils.holograms.SimpleHologram;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
|
@ -10,11 +10,11 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
|
@ -3,9 +3,9 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.blocks;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.RainbowTickHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.RainbowTickHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class RainbowBlock extends SimpleSlimefunItem<RainbowTickHandler> {
|
public class RainbowBlock extends SimpleSlimefunItem<RainbowTickHandler> {
|
||||||
|
@ -10,10 +10,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class RepairedSpawner extends SimpleSlimefunItem<BlockPlaceHandler> {
|
public class RepairedSpawner extends SimpleSlimefunItem<BlockPlaceHandler> {
|
||||||
|
@ -5,9 +5,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class UnplaceableBlock extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
public class UnplaceableBlock extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
||||||
@ -16,6 +16,10 @@ public class UnplaceableBlock extends SimpleSlimefunItem<ItemUseHandler> impleme
|
|||||||
super(category, item, recipeType, recipe);
|
super(category, item, recipeType, recipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UnplaceableBlock(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
|
||||||
|
super(category, item, recipeType, recipe, recipeOutput);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemUseHandler getItemHandler() {
|
public ItemUseHandler getItemHandler() {
|
||||||
return PlayerRightClickEvent::cancel;
|
return PlayerRightClickEvent::cancel;
|
||||||
|
@ -7,9 +7,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
|
import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet;
|
import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class CargoConnectorNode extends SimpleSlimefunItem<BlockUseHandler> {
|
public class CargoConnectorNode extends SimpleSlimefunItem<BlockUseHandler> {
|
||||||
|
@ -11,8 +11,8 @@ import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
|||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.misc.CoolantCell;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
@ -74,18 +74,27 @@ public class ReactorAccessPort extends SlimefunItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
||||||
if (flow == ItemTransportFlow.INSERT) return getInputSlots();
|
if (flow == ItemTransportFlow.INSERT) {
|
||||||
else return getOutputSlots();
|
return getInputSlots();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return getOutputSlots();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getSlotsAccessedByItemTransport(DirtyChestMenu menu, ItemTransportFlow flow, ItemStack item) {
|
public int[] getSlotsAccessedByItemTransport(DirtyChestMenu menu, ItemTransportFlow flow, ItemStack item) {
|
||||||
if (flow == ItemTransportFlow.INSERT) {
|
if (flow == ItemTransportFlow.INSERT) {
|
||||||
if (SlimefunUtils.isItemSimilar(item, SlimefunItems.REACTOR_COOLANT_CELL, true)) return getCoolantSlots();
|
if (SlimefunItem.getByItem(item) instanceof CoolantCell) {
|
||||||
else if (SlimefunUtils.isItemSimilar(item, SlimefunItems.NETHER_ICE_COOLANT_CELL, true)) return getCoolantSlots();
|
return getCoolantSlots();
|
||||||
else return getFuelSlots();
|
}
|
||||||
|
else {
|
||||||
|
return getFuelSlots();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return getOutputSlots();
|
||||||
}
|
}
|
||||||
else return getOutputSlots();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -157,12 +166,11 @@ public class ReactorAccessPort extends SlimefunItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private BlockMenu getReactor(Location l) {
|
private BlockMenu getReactor(Location l) {
|
||||||
Location reactorL = new Location(l.getWorld(), l.getX(), l.getY() - 3, l.getZ());
|
Location location = new Location(l.getWorld(), l.getX(), l.getY() - 3, l.getZ());
|
||||||
|
SlimefunItem item = BlockStorage.check(location.getBlock());
|
||||||
SlimefunItem item = BlockStorage.check(reactorL.getBlock());
|
|
||||||
|
|
||||||
if (item instanceof Reactor) {
|
if (item instanceof Reactor) {
|
||||||
return BlockStorage.getInventory(reactorL);
|
return BlockStorage.getInventory(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -9,9 +9,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler;
|
import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
|
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
|
||||||
|
|
||||||
|
@ -9,10 +9,10 @@ import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.GeneratorTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.GeneratorTicker;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
@ -14,6 +14,7 @@ import io.github.thebusybiscuit.cscorelib2.blocks.Vein;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
@ -21,7 +22,6 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenu
|
|||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||||
|
@ -14,13 +14,13 @@ import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||||
@ -63,7 +63,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
@Override
|
@Override
|
||||||
public void newInstance(BlockMenu menu, Block b) {
|
public void newInstance(BlockMenu menu, Block b) {
|
||||||
if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "enabled") == null || BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals(String.valueOf(false))) {
|
if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "enabled") == null || BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals(String.valueOf(false))) {
|
||||||
menu.replaceExistingItem(22, new CustomItem(new ItemStack(Material.GUNPOWDER), "&7Enabled: &4\u2718", "", "&e> Click to enable this Machine"));
|
menu.replaceExistingItem(22, new CustomItem(Material.GUNPOWDER, "&7Enabled: &4\u2718", "", "&e> Click to enable this Machine"));
|
||||||
menu.addMenuClickHandler(22, (p, slot, item, action) -> {
|
menu.addMenuClickHandler(22, (p, slot, item, action) -> {
|
||||||
BlockStorage.addBlockInfo(b, "enabled", String.valueOf(true));
|
BlockStorage.addBlockInfo(b, "enabled", String.valueOf(true));
|
||||||
newInstance(menu, b);
|
newInstance(menu, b);
|
||||||
@ -71,7 +71,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
menu.replaceExistingItem(22, new CustomItem(new ItemStack(Material.REDSTONE), "&7Enabled: &2\u2714", "", "&e> Click to disable this Machine"));
|
menu.replaceExistingItem(22, new CustomItem(Material.REDSTONE, "&7Enabled: &2\u2714", "", "&e> Click to disable this Machine"));
|
||||||
menu.addMenuClickHandler(22, (p, slot, item, action) -> {
|
menu.addMenuClickHandler(22, (p, slot, item, action) -> {
|
||||||
BlockStorage.addBlockInfo(b, "enabled", String.valueOf(false));
|
BlockStorage.addBlockInfo(b, "enabled", String.valueOf(false));
|
||||||
newInstance(menu, b);
|
newInstance(menu, b);
|
||||||
@ -81,7 +81,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
|
|
||||||
double offset = (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "offset") == null) ? 3.0F : Double.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "offset"));
|
double offset = (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "offset") == null) ? 3.0F : Double.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "offset"));
|
||||||
|
|
||||||
menu.replaceExistingItem(31, new CustomItem(new ItemStack(Material.PISTON), "&7Offset: &3" + offset + " Block(s)", "", "&rLeft Click: &7+0.1", "&rRight Click: &7-0.1"));
|
menu.replaceExistingItem(31, new CustomItem(Material.PISTON, "&7Offset: &3" + offset + " Block(s)", "", "&rLeft Click: &7+0.1", "&rRight Click: &7-0.1"));
|
||||||
menu.addMenuClickHandler(31, (p, slot, item, action) -> {
|
menu.addMenuClickHandler(31, (p, slot, item, action) -> {
|
||||||
double offsetv = DoubleHandler.fixDouble(Double.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "offset")) + (action.isRightClicked() ? -0.1F : 0.1F));
|
double offsetv = DoubleHandler.fixDouble(Double.valueOf(BlockStorage.getLocationInfo(b.getLocation(), "offset")) + (action.isRightClicked() ? -0.1F : 0.1F));
|
||||||
BlockStorage.addBlockInfo(b, "offset", String.valueOf(offsetv));
|
BlockStorage.addBlockInfo(b, "offset", String.valueOf(offsetv));
|
||||||
@ -97,17 +97,27 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
||||||
if (flow == ItemTransportFlow.INSERT) return getInputSlots();
|
if (flow == ItemTransportFlow.INSERT) {
|
||||||
else return new int[0];
|
return getInputSlots();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new int[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getSlotsAccessedByItemTransport(DirtyChestMenu menu, ItemTransportFlow flow, ItemStack item) {
|
public int[] getSlotsAccessedByItemTransport(DirtyChestMenu menu, ItemTransportFlow flow, ItemStack item) {
|
||||||
if (flow == ItemTransportFlow.INSERT) {
|
if (flow == ItemTransportFlow.INSERT && item != null) {
|
||||||
if (SlimefunUtils.isItemSimilar(item, new ItemStack(Material.SOUL_SAND), true)) return getSoulSandSlots();
|
if (item.getType() == Material.SOUL_SAND) {
|
||||||
else return getWitherSkullSlots();
|
return getSoulSandSlots();
|
||||||
}
|
}
|
||||||
else return new int[0];
|
|
||||||
|
if (item.getType() == Material.WITHER_SKELETON_SKULL) {
|
||||||
|
return getWitherSkullSlots();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new int[0];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -121,7 +131,10 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
|
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
|
||||||
if (reason == UnregisterReason.EXPLODE) return false;
|
if (reason == UnregisterReason.EXPLODE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
BlockMenu inv = BlockStorage.getInventory(b);
|
BlockMenu inv = BlockStorage.getInventory(b);
|
||||||
|
|
||||||
if (inv != null) {
|
if (inv != null) {
|
||||||
@ -139,6 +152,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -227,7 +241,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
for (int slot : slots) {
|
for (int slot : slots) {
|
||||||
if (SlimefunUtils.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(resource), true)) {
|
if (SlimefunUtils.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(resource), true, false)) {
|
||||||
found += menu.getItemInSlot(slot).getAmount();
|
found += menu.getItemInSlot(slot).getAmount();
|
||||||
|
|
||||||
if (found > required) {
|
if (found > required) {
|
||||||
@ -244,7 +258,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
int skulls = 3;
|
int skulls = 3;
|
||||||
|
|
||||||
for (int slot : getSoulSandSlots()) {
|
for (int slot : getSoulSandSlots()) {
|
||||||
if (SlimefunUtils.isItemSimilar(inv.getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true)) {
|
if (SlimefunUtils.isItemSimilar(inv.getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, false)) {
|
||||||
int amount = inv.getItemInSlot(slot).getAmount();
|
int amount = inv.getItemInSlot(slot).getAmount();
|
||||||
|
|
||||||
if (amount >= soulsand) {
|
if (amount >= soulsand) {
|
||||||
@ -259,7 +273,7 @@ public class WitherAssembler extends SimpleSlimefunItem<BlockTicker> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int slot : getWitherSkullSlots()) {
|
for (int slot : getWitherSkullSlots()) {
|
||||||
if (SlimefunUtils.isItemSimilar(inv.getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true)) {
|
if (SlimefunUtils.isItemSimilar(inv.getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, false)) {
|
||||||
int amount = inv.getItemInSlot(slot).getAmount();
|
int amount = inv.getItemInSlot(slot).getAmount();
|
||||||
|
|
||||||
if (amount >= skulls) {
|
if (amount >= skulls) {
|
||||||
|
@ -7,9 +7,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -10,9 +10,9 @@ import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.services.LocalizationService;
|
import io.github.thebusybiscuit.slimefun4.core.services.LocalizationService;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -10,9 +10,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class MagicSugar extends SimpleSlimefunItem<ItemUseHandler> {
|
public class MagicSugar extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5,9 +5,9 @@ import org.bukkit.potion.PotionEffect;
|
|||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class GEOScanner extends SimpleSlimefunItem<BlockUseHandler> {
|
public class GEOScanner extends SimpleSlimefunItem<BlockUseHandler> {
|
||||||
|
@ -36,7 +36,7 @@ public abstract class OilPump extends AContainer implements RecipeDisplayItem {
|
|||||||
public OilPump(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
public OilPump(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
super(category, item, recipeType, recipe);
|
super(category, item, recipeType, recipe);
|
||||||
|
|
||||||
oil = SlimefunPlugin.getRegistry().getGEOResources().get(new NamespacedKey(SlimefunPlugin.instance, "oil")).orElse(null);
|
oil = SlimefunPlugin.getRegistry().getGEOResources().get(new NamespacedKey(SlimefunPlugin.instance(), "oil")).orElse(null);
|
||||||
|
|
||||||
new BlockMenuPreset(getID(), getInventoryTitle()) {
|
new BlockMenuPreset(getID(), getInventoryTitle()) {
|
||||||
|
|
||||||
|
@ -7,9 +7,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class PortableGEOScanner extends SimpleSlimefunItem<ItemUseHandler> {
|
public class PortableGEOScanner extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -22,12 +22,12 @@ import io.github.thebusybiscuit.cscorelib2.chat.json.HoverEvent;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
@ -96,7 +96,7 @@ public class ElevatorPlate extends SimpleSlimefunItem<BlockUseHandler> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomBookInterface book = new CustomBookInterface(SlimefunPlugin.instance);
|
CustomBookInterface book = new CustomBookInterface(SlimefunPlugin.instance());
|
||||||
ChatComponent page = null;
|
ChatComponent page = null;
|
||||||
|
|
||||||
List<Block> floors = getFloors(b);
|
List<Block> floors = getFloors(b);
|
||||||
@ -125,7 +125,7 @@ public class ElevatorPlate extends SimpleSlimefunItem<BlockUseHandler> {
|
|||||||
else {
|
else {
|
||||||
line = new ChatComponent("\n" + ChatColor.GRAY.toString() + (floors.size() - i) + ". " + ChatColor.RESET + floor);
|
line = new ChatComponent("\n" + ChatColor.GRAY.toString() + (floors.size() - i) + ". " + ChatColor.RESET + floor);
|
||||||
line.setHoverEvent(new HoverEvent(ChatColors.color(SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.click-to-teleport")), "", ChatColor.RESET + floor, ""));
|
line.setHoverEvent(new HoverEvent(ChatColors.color(SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.click-to-teleport")), "", ChatColor.RESET + floor, ""));
|
||||||
line.setClickEvent(new ClickEvent(new NamespacedKey(SlimefunPlugin.instance, DATA_KEY + i), player -> Slimefun.runSync(() -> {
|
line.setClickEvent(new ClickEvent(new NamespacedKey(SlimefunPlugin.instance(), DATA_KEY + i), player -> Slimefun.runSync(() -> {
|
||||||
users.add(player.getUniqueId());
|
users.add(player.getUniqueId());
|
||||||
|
|
||||||
float yaw = player.getEyeLocation().getYaw() + 180;
|
float yaw = player.getEyeLocation().getYaw() + 180;
|
||||||
|
@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class GPSControlPanel extends SimpleSlimefunItem<BlockUseHandler> {
|
public class GPSControlPanel extends SimpleSlimefunItem<BlockUseHandler> {
|
||||||
|
@ -6,9 +6,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class GPSMarkerTool extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
public class GPSMarkerTool extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
||||||
|
@ -9,11 +9,11 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
import io.github.thebusybiscuit.slimefun4.core.networks.energy.EnergyNetComponentType;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||||
|
@ -12,9 +12,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class InfernalBonemeal extends SimpleSlimefunItem<ItemUseHandler> {
|
public class InfernalBonemeal extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -7,9 +7,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -17,9 +17,9 @@ import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
|
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class KnowledgeTome extends SimpleSlimefunItem<ItemUseHandler> {
|
public class KnowledgeTome extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -8,10 +8,10 @@ import org.bukkit.inventory.PlayerInventory;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class MagicEyeOfEnder extends SimpleSlimefunItem<ItemUseHandler> {
|
public class MagicEyeOfEnder extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -10,9 +10,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.EntityInteractHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.EntityInteractHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -14,10 +14,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.Soulbound;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.Soulbound;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemDropHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemDropHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
@ -20,9 +20,9 @@ import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
|||||||
*/
|
*/
|
||||||
public class StormStaff extends SimpleSlimefunItem<ItemUseHandler> {
|
public class StormStaff extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
|
||||||
private static final NamespacedKey usageKey = new NamespacedKey(SlimefunPlugin.instance, "stormstaff_usage");
|
private static final NamespacedKey usageKey = new NamespacedKey(SlimefunPlugin.instance(), "stormstaff_usage");
|
||||||
public static final int MAX_USES = 8;
|
public static final int MAX_USES = 8;
|
||||||
|
|
||||||
public StormStaff(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
public StormStaff(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
|
@ -8,9 +8,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -11,9 +11,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class WindStaff extends SimpleSlimefunItem<ItemUseHandler> {
|
public class WindStaff extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -19,7 +19,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
|||||||
*/
|
*/
|
||||||
class EnderTalisman extends Talisman {
|
class EnderTalisman extends Talisman {
|
||||||
|
|
||||||
private static final LockedCategory ENDER_TALISMANS_CATEGORY = new LockedCategory(new NamespacedKey(SlimefunPlugin.instance, "ender_talismans"), new CustomItem(SlimefunItems.ENDER_TALISMAN, "&7Talismans - &aTier II"), 3, Talisman.TALISMANS_CATEGORY.getKey());
|
private static final LockedCategory ENDER_TALISMANS_CATEGORY = new LockedCategory(new NamespacedKey(SlimefunPlugin.instance(), "ender_talismans"), new CustomItem(SlimefunItems.ENDER_TALISMAN, "&7Talismans - &aTier II"), 3, Talisman.TALISMANS_CATEGORY.getKey());
|
||||||
|
|
||||||
public EnderTalisman(Talisman parent, SlimefunItemStack item) {
|
public EnderTalisman(Talisman parent, SlimefunItemStack item) {
|
||||||
super(ENDER_TALISMANS_CATEGORY, item, new ItemStack[] { SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, null, parent.getItem(), null, SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3 }, parent.isConsumable(), parent.isEventCancelled(), parent.getMessageSuffix(), parent.getChance(), parent.getEffects());
|
super(ENDER_TALISMANS_CATEGORY, item, new ItemStack[] { SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, null, parent.getItem(), null, SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3 }, parent.isConsumable(), parent.isEventCancelled(), parent.getMessageSuffix(), parent.getChance(), parent.getEffects());
|
||||||
|
@ -31,7 +31,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
|||||||
|
|
||||||
public class Talisman extends SlimefunItem {
|
public class Talisman extends SlimefunItem {
|
||||||
|
|
||||||
protected static final Category TALISMANS_CATEGORY = new Category(new NamespacedKey(SlimefunPlugin.instance, "talismans"), new CustomItem(SlimefunItems.COMMON_TALISMAN, "&7Talismans - &aTier I"), 2);
|
protected static final Category TALISMANS_CATEGORY = new Category(new NamespacedKey(SlimefunPlugin.instance(), "talismans"), new CustomItem(SlimefunItems.COMMON_TALISMAN, "&7Talismans - &aTier I"), 2);
|
||||||
|
|
||||||
private final SlimefunItemStack enderTalisman;
|
private final SlimefunItemStack enderTalisman;
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ public class Talisman extends SlimefunItem {
|
|||||||
|
|
||||||
protected void createEnderTalisman() {
|
protected void createEnderTalisman() {
|
||||||
EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(getEnderVariant());
|
EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(getEnderVariant());
|
||||||
Optional<Research> research = Research.getResearch(new NamespacedKey(SlimefunPlugin.instance, "ender_talismans"));
|
Optional<Research> research = Research.getResearch(new NamespacedKey(SlimefunPlugin.instance(), "ender_talismans"));
|
||||||
|
|
||||||
if (talisman != null && research.isPresent()) {
|
if (talisman != null && research.isPresent()) {
|
||||||
talisman.setResearch(research.get());
|
talisman.setResearch(research.get());
|
||||||
|
@ -11,9 +11,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class Bandage extends SimpleSlimefunItem<ItemUseHandler> {
|
public class Bandage extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemConsumptionHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class Medicine extends SimpleSlimefunItem<ItemConsumptionHandler> {
|
public class Medicine extends SimpleSlimefunItem<ItemConsumptionHandler> {
|
||||||
|
@ -11,9 +11,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class Rag extends SimpleSlimefunItem<ItemUseHandler> {
|
public class Rag extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -10,9 +10,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class Splint extends SimpleSlimefunItem<ItemUseHandler> {
|
public class Splint extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -9,9 +9,9 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class Vitamins extends SimpleSlimefunItem<ItemUseHandler> {
|
public class Vitamins extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -1,24 +1,32 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.electric;
|
package io.github.thebusybiscuit.slimefun4.implementation.items.misc;
|
||||||
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.attributes.RandomMobDrop;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class BasicCircuitBoard extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable {
|
public class BasicCircuitBoard extends SimpleSlimefunItem<ItemUseHandler> implements NotPlaceable, RandomMobDrop {
|
||||||
|
|
||||||
private final ItemSetting<Boolean> dropSetting = new ItemSetting<>("drop-from-golems", true);
|
private final ItemSetting<Boolean> dropSetting = new ItemSetting<>("drop-from-golems", true);
|
||||||
|
private final ItemSetting<Integer> chance = new ItemSetting<>("golem-drop-chance", 75);
|
||||||
|
|
||||||
public BasicCircuitBoard(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
public BasicCircuitBoard(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
super(category, item, recipeType, recipe);
|
super(category, item, recipeType, recipe);
|
||||||
|
|
||||||
addItemSetting(dropSetting);
|
addItemSetting(dropSetting);
|
||||||
|
addItemSetting(chance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMobDropChance() {
|
||||||
|
return chance.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDroppedFromGolems() {
|
public boolean isDroppedFromGolems() {
|
@ -0,0 +1,35 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.implementation.items.misc;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.UnplaceableBlock;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.cargo.ReactorAccessPort;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.NetherStarReactor;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.NuclearReactor;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.reactors.Reactor;
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link CoolantCell} is an {@link ItemStack} that is used to cool a {@link Reactor}.
|
||||||
|
*
|
||||||
|
* @author TheBusyBiscuit
|
||||||
|
*
|
||||||
|
* @see Reactor
|
||||||
|
* @see ReactorAccessPort
|
||||||
|
* @see NuclearReactor
|
||||||
|
* @see NetherStarReactor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CoolantCell extends UnplaceableBlock {
|
||||||
|
|
||||||
|
public CoolantCell(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
|
super(category, item, recipeType, recipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoolantCell(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
|
||||||
|
super(category, item, recipeType, recipe, recipeOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -76,7 +76,7 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
queue.execute(SlimefunPlugin.instance);
|
queue.execute(SlimefunPlugin.instance());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SlimefunPlugin.getLocalization().sendMessage(p, "machines.wrong-item", true);
|
SlimefunPlugin.getLocalization().sendMessage(p, "machines.wrong-item", true);
|
||||||
|
@ -81,7 +81,7 @@ public class MagicWorkbench extends BackpackCrafter {
|
|||||||
private void startAnimation(Player p, Block b, Inventory inv, ItemStack output) {
|
private void startAnimation(Player p, Block b, Inventory inv, ItemStack output) {
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
int current = j;
|
int current = j;
|
||||||
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> {
|
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance(), () -> {
|
||||||
p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1);
|
p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1);
|
||||||
p.getWorld().playEffect(b.getLocation(), Effect.ENDER_SIGNAL, 1);
|
p.getWorld().playEffect(b.getLocation(), Effect.ENDER_SIGNAL, 1);
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ public class PressureChamber extends MultiBlockMachine {
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
int j = i;
|
int j = i;
|
||||||
|
|
||||||
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> {
|
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance(), () -> {
|
||||||
p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1, 1);
|
p.getWorld().playSound(b.getLocation(), Sound.ENTITY_TNT_PRIMED, 1, 1);
|
||||||
p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4);
|
p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4);
|
||||||
p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4);
|
p.getWorld().playEffect(b.getRelative(BlockFace.UP).getLocation(), Effect.SMOKE, 4);
|
||||||
|
@ -149,7 +149,7 @@ class ActiveMiner implements Runnable {
|
|||||||
queue.thenRun(2, () -> setPistonState(pistons[1], false));
|
queue.thenRun(2, () -> setPistonState(pistons[1], false));
|
||||||
|
|
||||||
queue.thenRun(1, this);
|
queue.thenRun(1, this);
|
||||||
queue.execute(SlimefunPlugin.instance);
|
queue.execute(SlimefunPlugin.instance());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -202,7 +202,7 @@ class ActiveMiner implements Runnable {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
queue.execute(SlimefunPlugin.instance);
|
queue.execute(SlimefunPlugin.instance());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,10 +8,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class ChristmasPresent extends SimpleSlimefunItem<BlockPlaceHandler> implements NotPlaceable {
|
public class ChristmasPresent extends SimpleSlimefunItem<BlockPlaceHandler> implements NotPlaceable {
|
||||||
|
@ -8,10 +8,10 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.FireworkUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ import io.github.thebusybiscuit.slimefun4.core.attributes.DamageableItem;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
@ -38,6 +38,7 @@ class ExplosiveTool extends SimpleSlimefunItem<BlockBreakHandler> implements Not
|
|||||||
|
|
||||||
public ExplosiveTool(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
public ExplosiveTool(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
super(category, item, recipeType, recipe);
|
super(category, item, recipeType, recipe);
|
||||||
|
|
||||||
addItemSetting(damageOnUse, callExplosionEvent);
|
addItemSetting(damageOnUse, callExplosionEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +55,7 @@ class ExplosiveTool extends SimpleSlimefunItem<BlockBreakHandler> implements Not
|
|||||||
public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
|
public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
|
||||||
if (isItem(item)) {
|
if (isItem(item)) {
|
||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
|
|
||||||
if (Slimefun.hasUnlocked(p, ExplosiveTool.this, true)) {
|
if (Slimefun.hasUnlocked(p, ExplosiveTool.this, true)) {
|
||||||
Block b = e.getBlock();
|
Block b = e.getBlock();
|
||||||
|
|
||||||
@ -61,6 +63,19 @@ class ExplosiveTool extends SimpleSlimefunItem<BlockBreakHandler> implements Not
|
|||||||
b.getWorld().playSound(b.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.2F, 1F);
|
b.getWorld().playSound(b.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.2F, 1F);
|
||||||
|
|
||||||
List<Block> blocks = findBlocks(b);
|
List<Block> blocks = findBlocks(b);
|
||||||
|
breakBlocks(p, item, b, blocks, fortune, drops);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void breakBlocks(Player p, ItemStack item, Block b, List<Block> blocks, int fortune, List<ItemStack> drops) {
|
||||||
if (callExplosionEvent.getValue().booleanValue()) {
|
if (callExplosionEvent.getValue().booleanValue()) {
|
||||||
BlockExplodeEvent blockExplodeEvent = new BlockExplodeEvent(b, blocks, 0);
|
BlockExplodeEvent blockExplodeEvent = new BlockExplodeEvent(b, blocks, 0);
|
||||||
Bukkit.getServer().getPluginManager().callEvent(blockExplodeEvent);
|
Bukkit.getServer().getPluginManager().callEvent(blockExplodeEvent);
|
||||||
@ -78,15 +93,6 @@ class ExplosiveTool extends SimpleSlimefunItem<BlockBreakHandler> implements Not
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Block> findBlocks(Block b) {
|
private List<Block> findBlocks(Block b) {
|
||||||
List<Block> blocks = new ArrayList<>(26);
|
List<Block> blocks = new ArrayList<>(26);
|
||||||
|
|
||||||
@ -112,7 +118,7 @@ class ExplosiveTool extends SimpleSlimefunItem<BlockBreakHandler> implements Not
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void breakBlock(Player p, ItemStack item, Block b, int fortune, List<ItemStack> drops) {
|
protected void breakBlock(Player p, ItemStack item, Block b, int fortune, List<ItemStack> drops) {
|
||||||
if (b.getType() != Material.AIR && !b.isLiquid() && !MaterialCollections.getAllUnbreakableBlocks().contains(b.getType()) && SlimefunPlugin.getProtectionManager().hasPermission(p, b.getLocation(), ProtectableAction.BREAK_BLOCK)) {
|
if (!b.isEmpty() && !b.isLiquid() && !MaterialCollections.getAllUnbreakableBlocks().contains(b.getType()) && SlimefunPlugin.getProtectionManager().hasPermission(p, b.getLocation(), ProtectableAction.BREAK_BLOCK)) {
|
||||||
SlimefunPlugin.getProtectionManager().logAction(p, b, ProtectableAction.BREAK_BLOCK);
|
SlimefunPlugin.getProtectionManager().logAction(p, b, ProtectableAction.BREAK_BLOCK);
|
||||||
|
|
||||||
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
|
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
|
||||||
|
@ -18,11 +18,11 @@ import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ElectricGoldPan;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ElectricGoldPan;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks.AutomatedPanningMachine;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks.AutomatedPanningMachine;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -15,9 +15,9 @@ import org.bukkit.util.Vector;
|
|||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class GrapplingHook extends SimpleSlimefunItem<ItemUseHandler> {
|
public class GrapplingHook extends SimpleSlimefunItem<ItemUseHandler> {
|
||||||
|
@ -9,9 +9,9 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -19,9 +19,9 @@ import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
@ -11,12 +11,12 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.BrokenSpawner;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.BrokenSpawner;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.RepairedSpawner;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.RepairedSpawner;
|
||||||
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
@ -10,9 +10,9 @@ import io.github.thebusybiscuit.cscorelib2.materials.MaterialCollections;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.DamageableItem;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.DamageableItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
public class PickaxeOfTheSeeker extends SimpleSlimefunItem<ItemUseHandler> implements DamageableItem {
|
public class PickaxeOfTheSeeker extends SimpleSlimefunItem<ItemUseHandler> implements DamageableItem {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user