Compare commits

..

19 commits

Author SHA1 Message Date
d46adfd957
Fix custom charts
Probably
2021-02-21 02:15:10 +01:00
12a8ccf3ce
Use bStats for metrics and remove Piwik integration
#4
2021-02-21 01:39:51 +01:00
dcd3ff31db
Fix WorldEdit integration stopping edits
It's been only more than a year, it's fine
2021-02-21 00:04:56 +01:00
e4548069dc
Update dependencies 2020-07-27 16:24:42 +02:00
3f9c2b99f9
Version update 2019-09-21 16:28:47 +02:00
6d5f42b2a5
Added ReflectionStorage (mostly version-independent)
(Started on 2019.08.29.)
This means it supports 1.14.4
It automatically falls back to the previous storage if the newer version is not found
2019-09-21 16:14:58 +02:00
14bdf0ebe0
Updated WorldEdit and WorldGuard to 7.0.0
It doesn't work without them atm because it tries to load a class from them
2019-08-28 23:29:40 +02:00
24ed3393d3
Giving 30 seconds max for the thread
The plugin will wait 30 seconds and if the thread is still alive then it interrupts the thread which should instantly end the loop.
Also other fixes
Also notifying all threads that could wait on the queue, though it should be the only 1 BS thread
2018-10-04 00:34:00 +02:00
cd7b7a550d
Might have fixed the stop delay
The theory is the following: multiple BS threads were created, one for each chunk, which caused long locks. If this isn't the case, I don't know what is.
#2
2018-08-31 17:08:06 +02:00
b84ecf8545
Added conversion in DB 2018-06-30 16:28:32 +02:00
ecaecd4136
Added name to UUID conversion 2018-06-27 21:59:12 +02:00
362d1d823c
Small fixes, ready to go 2018-06-27 17:53:04 +02:00
b8d21657ce
Merge remote-tracking branch 'remotes/origin/spigot-1.9'
# Conflicts:
#	pom.xml
#	src/main/java/de/jaschastarke/minecraft/limitedcreative/FeatureMetrics.java
#	src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/worldedit/LCEditSession_LogBlock.java
#	src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/PlayerListener.java
2018-06-27 13:42:29 +02:00
d7e4eafc4d
Fixed thread stop & metrics fix
The thread will be restarted automatically after an error
2018-06-27 00:14:09 +02:00
f2af77b9b7
Resolved compile errors, LB removed
LogBlock support removed
2018-06-26 21:28:36 +02:00
pickernickel
8c1240cc24 Use UUID instead of player name. 2016-05-23 22:42:52 -05:00
pickernickel
05d37326e0 Circumvented some deprecated API usage. 2016-05-22 04:35:52 -05:00
pickernickel
b2e154be45 Slime block compatibility. 2016-05-18 03:34:19 -05:00
Jascha Starke
8cfc3b7f01 Spigot 1.9 Update 2016-03-02 22:47:46 +01:00
31 changed files with 1691 additions and 1420 deletions

View file

@ -18,3 +18,11 @@ Dependencies for optional integrations
* [Vault](http://dev.bukkit.org/bukkit-plugins/vault/) * [Vault](http://dev.bukkit.org/bukkit-plugins/vault/)
* [Multiworld](http://dev.bukkit.org/bukkit-plugins/multiworld-v-2-0/) * [Multiworld](http://dev.bukkit.org/bukkit-plugins/multiworld-v-2-0/)
* [LogBlock](http://dev.bukkit.org/bukkit-plugins/logblock/) * [LogBlock](http://dev.bukkit.org/bukkit-plugins/logblock/)
Building
--------
Download and install xAuth and Multiworld into the local `repo` repository with a command like so:
```bash
mvn install:install-file -Dfile=xAuth-2.0.26.jar -Dpackaging=jar -DlocalRepositoryPath=repo -DgroupId=de.luricos.bukkit -DartifactId=xAuth -Dversion=2.0.26
```

120
pom.xml
View file

@ -1,15 +1,16 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.jaschastarke</groupId> <groupId>de.jaschastarke</groupId>
<artifactId>LimitedCreative</artifactId> <artifactId>LimitedCreative</artifactId>
<name>LimitedCreative</name> <name>LimitedCreative</name>
<version>2.3-SNAPSHOT</version> <version>2.5</version>
<url>https://github.com/possi/LimitedCreative</url> <url>https://github.com/possi/LimitedCreative</url>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<plib.version>1.4-SNAPSHOT</plib.version> <plib.version>1.4-SNAPSHOT</plib.version>
<bukkit.version>1.8.3-R0.1-SNAPSHOT</bukkit.version> <bukkit.version>1.12.2-R0.1-SNAPSHOT</bukkit.version>
</properties> </properties>
<scm> <scm>
@ -36,20 +37,25 @@
<!-- Possible public Maven Repository, containing LimitedCreative builds and other dependencies without own rep. <!-- Possible public Maven Repository, containing LimitedCreative builds and other dependencies without own rep.
like AuthMe, etc. like AuthMe, etc.
Supports http only --> Supports http only -->
<repository> <!-- <repository> - offline
<id>de-jas-rep</id> <id>de-jas-rep</id>
<url>http://repo.ja-s.de/mvn</url> <url>http://repo.ja-s.de/mvn</url>
</repository> -->
<!-- Local repository for plugins without a repo -->
<repository>
<id>localRepo</id>
<url>file://${project.basedir}/repo</url>
</repository> </repository>
<!-- (Craft-)Bukkit repository --> <!-- Official (Craft-)Bukkit repository -->
<repository> <repository>
<id>spigot-repo</id> <id>spigot-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository> </repository>
<!-- Official WorldGuard and WorldEdit repository --> <!-- Official WorldGuard and WorldEdit repository -->
<repository> <repository>
<id>sk89q-mvn2</id> <id>sk89q-mvn2</id>
<url>http://mvn2.sk89q.com/repo</url> <url>https://maven.enginehub.org/repo/</url>
</repository> </repository>
<!-- Official Multiverse repository --> <!-- Official Multiverse repository -->
<repository> <repository>
@ -59,20 +65,37 @@
<!-- Official xAuth repository; it is no good! we keep our own dep-files of it - -> <!-- Official xAuth repository; it is no good! we keep our own dep-files of it - ->
<repository> <repository>
<id>luricos.de-repo</id> <id>luricos.de-repo</id>
<url>http://repo.luricos.de/bukkit-plugins/</url> <url>http://repo.luricos.de/repository/bukkit-plugins/</url>
</repository><!- - --> </repository><!- - It points to dependencies that don't exist anymore -->
<!-- Official LogBlock repository --> <!-- Official LogBlock repository -->
<repository> <repository>
<id>md5</id> <id>md5</id>
<url>http://repo.md-5.net/content/groups/public/</url> <url>http://repo.md-5.net/content/groups/public/</url>
</repository> </repository>
<!-- https://github.com/Hidendra/Plugin-Metrics/wiki/Usage --> <!-- Official AuthMe Reloaded repository -->
<repository> <repository>
<id>Plugin Metrics</id> <id>codemc-repo</id>
<url>http://repo.mcstats.org/content/repositories/public</url> <url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
<!-- Official CoreProtect repository -->
<repository>
<id>coreprotect-repo</id>
<url>http://maven.playpro.com/</url>
</repository>
<!-- Official PermissionsEx repository -->
<repository>
<id>pex-repo</id>
<url>https://repo.glaremasters.me/repository/permissionsex/</url>
</repository> </repository>
</repositories> </repositories>
<pluginRepositories>
<pluginRepository>
<id>de-jas-rep</id>
<url>http://repo.ja-s.de/mvn</url>
</pluginRepository>
</pluginRepositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>de.jaschastarke</groupId> <groupId>de.jaschastarke</groupId>
@ -85,29 +108,30 @@
<artifactId>bukkit</artifactId> <artifactId>bukkit</artifactId>
<version>${bukkit.version}</version> <version>${bukkit.version}</version>
</dependency> </dependency>
<dependency>
<!-- http://dl.bukkit.org/ -->
<groupId>org.bukkit.</groupId> <!-- Needed for WE integration -->
<artifactId>bukkit</artifactId>
<version>1.14.4-R0.1-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<!-- http://dev.bukkit.org/server-mods/worldguard/ --> <!-- http://dev.bukkit.org/server-mods/worldguard/ -->
<groupId>com.sk89q</groupId> <groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard</artifactId> <artifactId>worldguard-bukkit</artifactId>
<version>6.0.0-SNAPSHOT</version> <version>7.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<!-- http://dev.bukkit.org/server-mods/worldedit/ --> <!-- http://dev.bukkit.org/server-mods/worldguard/ -->
<groupId>com.sk89q</groupId> <groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit</artifactId> <artifactId>worldedit-bukkit</artifactId>
<version>6.0.0-SNAPSHOT</version> <version>7.0.0</version>
</dependency>
<dependency>
<!-- http://dev.bukkit.org/server-mods/authme-reloaded/ -->
<groupId>uk.org.whoami</groupId>
<artifactId>authme</artifactId>
<version>2.9.5</version>
</dependency> </dependency>
<dependency> <dependency>
<!-- http://dev.bukkit.org/server-mods/authme-reloaded/ --> <!-- http://dev.bukkit.org/server-mods/authme-reloaded/ -->
<groupId>fr.xephi</groupId> <groupId>fr.xephi</groupId>
<artifactId>authme</artifactId> <artifactId>authme</artifactId>
<version>3.0</version> <version>5.6.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<!-- http://dev.bukkit.org/server-mods/multiverse-core/ --> <!-- http://dev.bukkit.org/server-mods/multiverse-core/ -->
@ -119,19 +143,30 @@
<!-- http://dev.bukkit.org/bukkit-plugins/multiworld-v-2-0/ --> <!-- http://dev.bukkit.org/bukkit-plugins/multiworld-v-2-0/ -->
<groupId>multiworld</groupId> <groupId>multiworld</groupId>
<artifactId>multiworld</artifactId> <artifactId>multiworld</artifactId>
<version>4.7.2</version> <version>5.2.8</version>
</dependency> </dependency>
<dependency> <dependency>
<!-- http://dev.bukkit.org/server-mods/xauth/ --> <!-- http://dev.bukkit.org/server-mods/xauth/ -->
<groupId>com.cypherx</groupId> <groupId>de.luricos.bukkit</groupId>
<artifactId>xauth</artifactId> <artifactId>xAuth</artifactId>
<version>2.0.26</version> <version>2.0.26</version>
</dependency> </dependency>
<dependency> <dependency>
<!-- https://github.com/Hidendra/Plugin-Metrics/wiki/Usage --> <!-- http://dev.bukkit.org/bukkit-plugins/coreprotect/ -->
<groupId>org.mcstats.bukkit</groupId> <groupId>net.coreprotect</groupId>
<artifactId>metrics</artifactId> <artifactId>coreprotect</artifactId>
<version>R7</version> <version>19.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.avaje/ebean -->
<dependency>
<groupId>org.avaje</groupId>
<artifactId>ebean</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>2.2.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>
@ -144,10 +179,10 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version> <version>3.8.1</version>
<configuration> <configuration>
<source>1.6</source> <source>1.8</source>
<target>1.6</target> <target>1.8</target>
<annotationProcessors> <annotationProcessors>
<!-- Needed to fetch DocComments from Source --> <!-- Needed to fetch DocComments from Source -->
<annotationProcessor>de.jaschastarke.maven.AnnotationProcessor</annotationProcessor> <annotationProcessor>de.jaschastarke.maven.AnnotationProcessor</annotationProcessor>
@ -177,6 +212,7 @@
<param>MultiInv</param> <param>MultiInv</param>
<param>Multiverse-Inventories</param> <param>Multiverse-Inventories</param>
<param>Vault</param> <param>Vault</param>
<param>CoreProtect</param>
</softdepend> </softdepend>
<custom> <custom>
<dev-url>http://dev.bukkit.org/server-mods/limited-creative/</dev-url> <dev-url>http://dev.bukkit.org/server-mods/limited-creative/</dev-url>
@ -188,7 +224,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>2.0</version> <version>3.2.4</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
@ -200,7 +236,7 @@
<artifactSet> <artifactSet>
<includes> <includes>
<include>de.jaschastarke:plib</include> <include>de.jaschastarke:plib</include>
<include>org.mcstats.*:*</include> <include>org.bstats</include>
</includes> </includes>
</artifactSet> </artifactSet>
<filters> <filters>
@ -214,8 +250,8 @@
</filters> </filters>
<relocations> <relocations>
<relocation> <relocation>
<pattern>org.mcstats</pattern> <pattern>org.bstats</pattern>
<shadedPattern>de.jaschastarke.minecraft.limitedcreative.metrics</shadedPattern> <shadedPattern>de.jaschastarke.minecraft.limitedcreative.bstats</shadedPattern>
</relocation> </relocation>
</relocations> </relocations>
</configuration> </configuration>
@ -246,7 +282,7 @@
</goals> </goals>
</pluginExecutionFilter> </pluginExecutionFilter>
<action> <action>
<ignore></ignore> <ignore/>
</action> </action>
</pluginExecution> </pluginExecution>
</pluginExecutions> </pluginExecutions>
@ -260,7 +296,7 @@
<extension> <extension>
<groupId>org.apache.maven.wagon</groupId> <groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId> <artifactId>wagon-ssh</artifactId>
<version>1.0</version> <version>2.1</version>
</extension> </extension>
</extensions> </extensions>
</build> </build>

View file

@ -74,11 +74,11 @@ public class FeatureBlockItemSpawn extends CoreModule<LimitedCreative> implement
} }
public void block(Block block, Player player) { public void block(Block block, Player player) {
if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) { if (player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
block(block.getLocation(), block.getType()); block(block.getLocation(), block.getType());
} else { } else {
// doesn't include silktouch // doesn't include silktouch
for (ItemStack i : block.getDrops(player.getItemInHand())) { for (ItemStack i : block.getDrops(player.getInventory().getItemInMainHand())) {
block(block.getLocation(), i.getType()); block(block.getLocation(), i.getType());
} }
} }

View file

@ -1,70 +1,46 @@
package de.jaschastarke.minecraft.limitedcreative; package de.jaschastarke.minecraft.limitedcreative;
import java.io.IOException;
import org.bukkit.event.Listener;
import org.mcstats.Metrics;
import de.jaschastarke.bukkit.lib.CoreModule; import de.jaschastarke.bukkit.lib.CoreModule;
import de.jaschastarke.bukkit.tools.stats.IStatistics;
import de.jaschastarke.bukkit.tools.stats.PiwikStatistics;
import de.jaschastarke.modularize.IModule; import de.jaschastarke.modularize.IModule;
import de.jaschastarke.modularize.ModuleEntry; import de.jaschastarke.modularize.ModuleEntry;
import de.jaschastarke.modularize.ModuleEntry.ModuleState; import de.jaschastarke.modularize.ModuleEntry.ModuleState;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.AdvancedPie;
import org.bukkit.event.Listener;
import java.util.HashMap;
public class FeatureMetrics extends CoreModule<LimitedCreative> implements Listener { public class FeatureMetrics extends CoreModule<LimitedCreative> implements Listener {
public FeatureMetrics(LimitedCreative plugin) { public FeatureMetrics(LimitedCreative plugin) {
super(plugin); super(plugin);
} }
private IStatistics metric;
private Metrics mcstats = null; private Metrics bstats = null;
@Override @Override
public void onEnable() { public void onEnable() {
super.onEnable(); super.onEnable();
metric = new PiwikStatistics(plugin); if (bstats == null) {
if (mcstats == null) { bstats = new Metrics(plugin, 10413);
try {
mcstats = new Metrics(plugin);
Metrics.Graph moduleGraph = mcstats.createGraph("Module Usage"); bstats.addCustomChart(new AdvancedPie("module_usage", () -> {
for (final ModuleEntry<IModule> mod : plugin.getModules()) { HashMap<String, Integer> ret = new HashMap<>();
if (mod.getModule() instanceof CoreModule<?>) { for (final ModuleEntry<IModule> mod : plugin.getModules())
moduleGraph.addPlotter(new Metrics.Plotter(((CoreModule<?>) mod.getModule()).getName()) { if (mod.getModule() instanceof CoreModule<?>)
@Override ret.put(((CoreModule<?>) mod.getModule()).getName(), mod.getState() == ModuleState.ENABLED ? 1 : 0);
public int getValue() { return ret;
return mod.getState() == ModuleState.ENABLED ? 1 : 0; }));
} bstats.addCustomChart(new AdvancedPie("dependencies", () -> {
}); HashMap<String, Integer> ret = new HashMap<>();
} for (final String dep : plugin.getDescription().getSoftDepend())
} ret.put(dep, plugin.getServer().getPluginManager().isPluginEnabled(dep) ? 1 : 0);
Metrics.Graph depGraph = mcstats.createGraph("Dependencies"); return ret;
for (final String dep : plugin.getDescription().getSoftDepend()) { }));
depGraph.addPlotter(new Metrics.Plotter(dep) {
@Override
public int getValue() {
return plugin.getServer().getPluginManager().isPluginEnabled(dep) ? 1 : 0;
}
});
}
mcstats.start();
} catch (IOException e) {
// Failed to submit the stats :-(
getLog().warn("MCStats-Error: " + e.getMessage());
}
} }
} }
@Override @Override
public void onDisable() { public void onDisable() {
super.onDisable(); super.onDisable();
metric.unregister();
}
public void track(String event) throws IOException {
if (metric == null)
throw new IllegalAccessError("The feature hasn't been enabled");
metric.trackEvent(event);
} }
} }

View file

@ -1,13 +1,12 @@
package de.jaschastarke.minecraft.limitedcreative; package de.jaschastarke.minecraft.limitedcreative;
import org.bukkit.Bukkit;
import de.jaschastarke.hooking.BooleanHooker; import de.jaschastarke.hooking.BooleanHooker;
import de.jaschastarke.hooking.GetHooker; import de.jaschastarke.hooking.GetHooker;
import de.jaschastarke.minecraft.limitedcreative.hooks.MultiVerseHooks; import de.jaschastarke.minecraft.limitedcreative.hooks.MultiVerseHooks;
import de.jaschastarke.minecraft.limitedcreative.hooks.PlayerCheckHooker; import de.jaschastarke.minecraft.limitedcreative.hooks.PlayerCheckHooker;
import de.jaschastarke.minecraft.limitedcreative.hooks.WorldTypeHooker; import de.jaschastarke.minecraft.limitedcreative.hooks.WorldTypeHooker;
import de.jaschastarke.minecraft.limitedcreative.hooks.xAuthHooks; import de.jaschastarke.minecraft.limitedcreative.hooks.xAuthHooks;
import org.bukkit.Bukkit;
public final class Hooks { public final class Hooks {
public static PlayerCheckHooker IsLoggedIn = new PlayerCheckHooker(true); public static PlayerCheckHooker IsLoggedIn = new PlayerCheckHooker(true);
@ -53,7 +52,8 @@ public final class Hooks {
public static boolean isAuthMePresent() { public static boolean isAuthMePresent() {
if (isPluginEnabled("AuthMe")) { if (isPluginEnabled("AuthMe")) {
try { try {
return Class.forName("uk.org.whoami.authme.api.API") != null; Class.forName("uk.org.whoami.authme.api.API");
return true;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
return false; return false;
} }
@ -64,7 +64,8 @@ public final class Hooks {
public static boolean isXAuth20Present() { public static boolean isXAuth20Present() {
if (isPluginEnabled("xAuth")) { if (isPluginEnabled("xAuth")) {
try { try {
return Class.forName("com.cypherx.xauth.xAuth") != null; Class.forName("com.cypherx.xauth.xAuth");
return true;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
return false; return false;
} }

View file

@ -1,23 +1,18 @@
package de.jaschastarke.minecraft.limitedcreative; package de.jaschastarke.minecraft.limitedcreative;
import java.io.File; import de.jaschastarke.bukkit.lib.CoreModule;
import java.util.Map; import de.jaschastarke.minecraft.limitedcreative.inventories.*;
import java.util.WeakHashMap; import de.jaschastarke.minecraft.limitedcreative.inventories.store.PlayerInventoryStorage;
import de.jaschastarke.minecraft.limitedcreative.inventories.store.ReflectionStorage;
import de.jaschastarke.modularize.IModule;
import de.jaschastarke.modularize.ModuleEntry;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import de.jaschastarke.bukkit.lib.CoreModule; import java.io.File;
import de.jaschastarke.minecraft.limitedcreative.inventories.ArmoryConfig; import java.util.Map;
import de.jaschastarke.minecraft.limitedcreative.inventories.Inventory; import java.util.WeakHashMap;
import de.jaschastarke.minecraft.limitedcreative.inventories.InventoryConfig;
import de.jaschastarke.minecraft.limitedcreative.inventories.InventoryPermissions;
import de.jaschastarke.minecraft.limitedcreative.inventories.PlayerListener;
import de.jaschastarke.minecraft.limitedcreative.inventories.store.InvYamlStorage;
import de.jaschastarke.minecraft.limitedcreative.inventories.store.PlayerInventoryStorage;
import de.jaschastarke.modularize.IModule;
import de.jaschastarke.modularize.ModuleEntry;
public class ModInventories extends CoreModule<LimitedCreative> { public class ModInventories extends CoreModule<LimitedCreative> {
protected PlayerInventoryStorage storage; protected PlayerInventoryStorage storage;
@ -33,7 +28,6 @@ public class ModInventories extends CoreModule<LimitedCreative> {
return "Inventory"; return "Inventory";
} }
@SuppressWarnings("deprecation")
@Override @Override
public void initialize(ModuleEntry<IModule> entry) { public void initialize(ModuleEntry<IModule> entry) {
super.initialize(entry); super.initialize(entry);
@ -57,7 +51,8 @@ public class ModInventories extends CoreModule<LimitedCreative> {
throw new IllegalAccessError(plugin.getLocale().trans("inventory.warning.conflict", incomp, this.getName())); throw new IllegalAccessError(plugin.getLocale().trans("inventory.warning.conflict", incomp, this.getName()));
} }
super.onEnable(); super.onEnable();
storage = new InvYamlStorage(this, new File(plugin.getDataFolder(), config.getFolder())); //storage = new InvYamlStorage(this, new File(plugin.getDataFolder(), config.getFolder()));
storage = new ReflectionStorage(this, new File(plugin.getDataFolder(), config.getFolder()));
inventories = new WeakHashMap<Player, Inventory>(); inventories = new WeakHashMap<Player, Inventory>();
getLog().info(plugin.getLocale().trans("basic.loaded.module")); getLog().info(plugin.getLocale().trans("basic.loaded.module"));
} }

View file

@ -1,6 +1,5 @@
package de.jaschastarke.minecraft.limitedcreative.blockstate; package de.jaschastarke.minecraft.limitedcreative.blockstate;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -144,19 +143,15 @@ public class BlockListener implements Listener {
return; return;
event.getBlock().setMetadata("LCBS_pistonIsAlreadyExtended", blockAlreadExtended); event.getBlock().setMetadata("LCBS_pistonIsAlreadyExtended", blockAlreadExtended);
Block source = event.getBlock().getRelative(event.getDirection());
/*if (mod.isDebug()) /*if (mod.isDebug())
mod.getLog().debug("PistonExtend "+source.getType()+" "+source.getLocation()+" "+event.getDirection());*/ mod.getLog().debug("PistonExtend "+source.getType()+" "+source.getLocation()+" "+event.getDirection());*/
List<Block> movedBlocks = new ArrayList<Block>(); List<Block> movedBlocks = event.getBlocks();
while (source != null && source.getType() != Material.AIR) {
movedBlocks.add(0, source); // put on top, so iterating the
source = source.getRelative(event.getDirection());
}
if (movedBlocks.size() > 0) { if (movedBlocks.size() > 0) {
DBTransaction update = mod.getModel().groupUpdate(); DBTransaction update = mod.getModel().groupUpdate();
for (Block sblock : movedBlocks) { for(int count = movedBlocks.size()-1; count >= 0; count--){
Block sblock = movedBlocks.get(count);
Block dest = sblock.getRelative(event.getDirection()); Block dest = sblock.getRelative(event.getDirection());
if (mod.isDebug()) if (mod.isDebug())
mod.getLog().debug("PistionExtend moves "+sblock.getType()+"-Block from "+sblock.getLocation()+" to "+dest.getLocation()); mod.getLog().debug("PistionExtend moves "+sblock.getType()+"-Block from "+sblock.getLocation()+" to "+dest.getLocation());
@ -173,12 +168,19 @@ public class BlockListener implements Listener {
return; return;
event.getBlock().removeMetadata("LCBS_pistonIsAlreadyExtended", mod.getPlugin()); event.getBlock().removeMetadata("LCBS_pistonIsAlreadyExtended", mod.getPlugin());
Block dest = event.getBlock().getRelative(event.getDirection()); List<Block> movedBlocks = event.getBlocks();
Block source = dest.getRelative(event.getDirection()); if(movedBlocks.size() > 0)
if (event.isSticky() && source.getType() != Material.AIR) { {
DBTransaction update = mod.getModel().groupUpdate();
for(int count = movedBlocks.size()-1; count >= 0; count--){
Block sblock = movedBlocks.get(count);
Block dest = sblock.getRelative(event.getDirection());
if (mod.isDebug()) if (mod.isDebug())
mod.getLog().debug("PistionRetract moves "+source.getType()+"-Block from "+source.getLocation()+" to "+dest.getLocation()); mod.getLog().debug("PistionRetract moves "+sblock.getType()+"-Block from "+sblock.getLocation()+" to "+dest.getLocation());
mod.getModel().moveState(source, source.getRelative(event.getDirection().getOppositeFace()));
update.moveState(sblock, dest);
}
update.finish();
} }
} }
} }

View file

@ -1,6 +1,7 @@
package de.jaschastarke.minecraft.limitedcreative.blockstate; package de.jaschastarke.minecraft.limitedcreative.blockstate;
import java.util.Date; import java.util.Date;
import java.util.UUID;
import javax.persistence.Column; import javax.persistence.Column;
//import javax.persistence.EmbeddedId; //import javax.persistence.EmbeddedId;
@ -37,7 +38,7 @@ public class BlockState {
private GameMode gameMode; private GameMode gameMode;
@Column(name = "player") @Column(name = "player")
private String playerName; private UUID uuid;
@NotNull @NotNull
@Column(name = "cdate") @Column(name = "cdate")
@ -51,7 +52,7 @@ public class BlockState {
public BlockState(BlockState copy) { public BlockState(BlockState copy) {
this.location = copy.location; this.location = copy.location;
this.gameMode = copy.gameMode; this.gameMode = copy.gameMode;
this.playerName = copy.playerName; this.uuid = copy.uuid;
this.date = copy.date; this.date = copy.date;
this.source = copy.source; this.source = copy.source;
} }
@ -72,24 +73,35 @@ public class BlockState {
this.gameMode = gm; this.gameMode = gm;
} }
public String getPlayerName() { public UUID getPlayerUUID() {
return playerName; return uuid;
} }
public void setPlayerName(String s) { public String getPlayerName() {
playerName = s; return Bukkit.getOfflinePlayer(uuid).getName();
}
//TODO Rename
@SuppressWarnings("deprecation")
public void setPlayerNameOrUUID(String s) {
if(s==null)
uuid=null;
else if(!s.matches("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"))
uuid = Bukkit.getOfflinePlayer(s).getUniqueId(); //If it's a name, get UUID
else
uuid = UUID.fromString(s);
} }
public OfflinePlayer getPlayer() { public OfflinePlayer getPlayer() {
OfflinePlayer p = Bukkit.getPlayerExact(playerName); OfflinePlayer p = Bukkit.getPlayer(uuid);
if (p == null) if (p == null)
p = Bukkit.getOfflinePlayer(playerName); p = Bukkit.getOfflinePlayer(uuid);
return p; return p;
} }
public void setPlayer(OfflinePlayer player) { public void setPlayer(OfflinePlayer player) {
setSource(Source.PLAYER); setSource(Source.PLAYER);
this.playerName = player.getName(); this.uuid = player.getUniqueId();
if (player instanceof Player) { if (player instanceof Player) {
setGameMode(((Player) player).getGameMode()); setGameMode(((Player) player).getGameMode());
} }
@ -109,7 +121,7 @@ public class BlockState {
public void setSource(Source source) { public void setSource(Source source) {
if (source != Source.PLAYER && source != Source.EDIT && source != Source.COMMAND) if (source != Source.PLAYER && source != Source.EDIT && source != Source.COMMAND)
setPlayerName(null); setPlayerNameOrUUID(null);
this.source = source; this.source = source;
} }
@ -119,6 +131,7 @@ public class BlockState {
@Override @Override
public String toString() { public String toString() {
String playerName = Bukkit.getOfflinePlayer(uuid).getName();
//return blockLocation.toString() + " by " + //return blockLocation.toString() + " by " +
return location.toString() + " by " + return location.toString() + " by " +
(source == Source.PLAYER ? playerName : (source.toString() + (playerName != null ? "(" + playerName + ")" : ""))) + (source == Source.PLAYER ? playerName : (source.toString() + (playerName != null ? "(" + playerName + ")" : ""))) +

View file

@ -1,25 +1,14 @@
package de.jaschastarke.minecraft.limitedcreative.blockstate; package de.jaschastarke.minecraft.limitedcreative.blockstate;
import java.util.Date; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import org.bukkit.Bukkit; import com.sk89q.worldedit.bukkit.BukkitPlayer;
import org.bukkit.GameMode; import com.sk89q.worldedit.math.BlockVector3;
import org.bukkit.Location; import com.sk89q.worldedit.regions.Region;
import org.bukkit.Material; import com.sk89q.worldedit.world.World;
import org.bukkit.World;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.bukkit.selections.Selection;
import de.jaschastarke.LocaleString; import de.jaschastarke.LocaleString;
import de.jaschastarke.bukkit.lib.chat.ChatFormattings; import de.jaschastarke.bukkit.lib.chat.ChatFormattings;
import de.jaschastarke.bukkit.lib.commands.BukkitCommand; import de.jaschastarke.bukkit.lib.commands.*;
import de.jaschastarke.bukkit.lib.commands.CommandContext;
import de.jaschastarke.bukkit.lib.commands.CommandException;
import de.jaschastarke.bukkit.lib.commands.HelpCommand;
import de.jaschastarke.bukkit.lib.commands.IHelpDescribed;
import de.jaschastarke.bukkit.lib.commands.MissingPermissionCommandException;
import de.jaschastarke.bukkit.lib.commands.annotations.IsCommand; import de.jaschastarke.bukkit.lib.commands.annotations.IsCommand;
import de.jaschastarke.bukkit.lib.commands.annotations.Usages; import de.jaschastarke.bukkit.lib.commands.annotations.Usages;
import de.jaschastarke.bukkit.lib.commands.parser.DefinedParameterParser; import de.jaschastarke.bukkit.lib.commands.parser.DefinedParameterParser;
@ -34,6 +23,11 @@ import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.Cuboid; import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.Cuboid;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.DBTransaction; import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.DBTransaction;
import de.jaschastarke.modularize.ModuleEntry.ModuleState; import de.jaschastarke.modularize.ModuleEntry.ModuleState;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import java.util.Date;
/** /**
* LimitedCreative-BlockState-Command: modify blockstate database to prevent drops of selected blocks (requires WorldEdit) * LimitedCreative-BlockState-Command: modify blockstate database to prevent drops of selected blocks (requires WorldEdit)
@ -105,7 +99,7 @@ public class BlockStateCommand extends BukkitCommand implements IHelpDescribed {
if (mod.getConfig().getLogSurvival()) { if (mod.getConfig().getLogSurvival()) {
context.responseFormatted(ChatFormattings.INFO, L("command.blockstate.nothing_to_cleanup")); context.responseFormatted(ChatFormattings.INFO, L("command.blockstate.nothing_to_cleanup"));
} else { } else {
mod.getPlugin().getServer().getScheduler().runTaskAsynchronously(mod.getPlugin(), new BukkitRunnable() { mod.getPlugin().getServer().getScheduler().runTaskAsynchronously(mod.getPlugin(), new Runnable() {
@Override @Override
public void run() { public void run() {
int countDeleted = mod.getModel().cleanUp(DBModel.Cleanup.SURVIVAL); int countDeleted = mod.getModel().cleanUp(DBModel.Cleanup.SURVIVAL);
@ -157,29 +151,34 @@ public class BlockStateCommand extends BukkitCommand implements IHelpDescribed {
return false; return false;
} }
WorldEditPlugin we = (WorldEditPlugin) mod.getPlugin().getServer().getPluginManager().getPlugin("WorldEdit"); BukkitPlayer bp = BukkitAdapter.adapt(context.getPlayer());
final Selection selection = we.getSelection(context.getPlayer()); Region region = null;
try {
region = WorldEdit.getInstance().getSessionManager().get(bp).getSelection(bp.getWorld());
} catch (Exception ignored) { //IncompleteRegionException
}
final Region selection = region;
if (selection == null) { if (selection == null) {
context.response(L("command.blockstate.worledit_selection_empty")); context.response(L("command.blockstate.worledit_selection_empty"));
return true; return true;
} }
final Location min = selection.getMinimumPoint(); final BlockVector3 min = selection.getMinimumPoint();
final Location max = selection.getMaximumPoint(); final BlockVector3 max = selection.getMaximumPoint();
mod.getPlugin().getServer().getScheduler().runTaskAsynchronously(mod.getPlugin(), new BukkitRunnable() { mod.getPlugin().getServer().getScheduler().runTaskAsynchronously(mod.getPlugin(), () -> {
@Override
public void run() {
if (mod.isDebug()) if (mod.isDebug())
mod.getLog().debug("Scheduler: Asynchronous Task run"); mod.getLog().debug("Scheduler: Asynchronous Task run");
DBTransaction update = mod.getModel().groupUpdate(); DBTransaction update = mod.getModel().groupUpdate();
int count = 0; int count = 0;
World w = selection.getWorld(); World w = selection.getWorld();
assert w != null;
org.bukkit.World bw = BukkitAdapter.adapt(w);
Cuboid c = new Cuboid(); Cuboid c = new Cuboid();
c.add(min); c.add(new Location(bw, min.getBlockX(), min.getBlockY(), min.getBlockZ()));
c.add(max); c.add(new Location(bw, max.getBlockX(), max.getBlockY(), max.getBlockZ()));
mod.getModel().cacheStates(c); mod.getModel().cacheStates(c);
BlockState seed = new BlockState(); BlockState seed = new BlockState();
@ -190,9 +189,9 @@ public class BlockStateCommand extends BukkitCommand implements IHelpDescribed {
for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { for (int x = min.getBlockX(); x <= max.getBlockX(); x++) {
for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { for (int y = min.getBlockY(); y <= max.getBlockY(); y++) {
for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
Location loc = new Location(w, x, y, z); BlockVector3 loc = BlockVector3.at(x, y, z);
if (w.getBlockAt(loc).getType() != Material.AIR && selection.contains(loc)) { if (!w.getBlock(loc).getBlockType().getMaterial().isAir() && selection.contains(loc)) {
seed.setLocation(loc); seed.setLocation(new Location(bw, x, y, z));
update.setState(new BlockState(seed)); update.setState(new BlockState(seed));
count++; count++;
} }
@ -202,7 +201,6 @@ public class BlockStateCommand extends BukkitCommand implements IHelpDescribed {
update.finish(); update.finish();
context.response(L("command.blockstate.command_updated", count)); context.response(L("command.blockstate.command_updated", count));
}
}); });
return true; return true;
} }

View file

@ -131,7 +131,7 @@ public class CreativeControlImportThread extends DatabaseMigrationThread {
bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z"))); bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z")));
bs.setDate(new Date(rs.getLong("time"))); bs.setDate(new Date(rs.getLong("time")));
bs.setGameMode(GameMode.CREATIVE); bs.setGameMode(GameMode.CREATIVE);
bs.setPlayerName(rs.getString("player")); bs.setPlayerNameOrUUID(rs.getString("player"));
bs.setSource(Source.PLAYER); bs.setSource(Source.PLAYER);
return bs; return bs;
} }

View file

@ -42,7 +42,7 @@ public class DBQueries {
bs.setLocation(loc); bs.setLocation(loc);
bs.setDate(rs.getTimestamp("cdate")); bs.setDate(rs.getTimestamp("cdate"));
bs.setGameMode(getGameMode(rs)); bs.setGameMode(getGameMode(rs));
bs.setPlayerName(rs.getString("player")); bs.setPlayerNameOrUUID(rs.getString("player"));
bs.setSource(getSource(rs)); bs.setSource(getSource(rs));
rs.close(); rs.close();
return bs; return bs;
@ -72,7 +72,7 @@ public class DBQueries {
bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z"))); bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z")));
bs.setDate(rs.getTimestamp("cdate")); bs.setDate(rs.getTimestamp("cdate"));
bs.setGameMode(getGameMode(rs)); bs.setGameMode(getGameMode(rs));
bs.setPlayerName(rs.getString("player")); bs.setPlayerNameOrUUID(rs.getString("player"));
bs.setSource(getSource(rs)); bs.setSource(getSource(rs));
blocks.add(bs); blocks.add(bs);
} }
@ -100,7 +100,7 @@ public class DBQueries {
bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z"))); bs.setLocation(new Location(c.getWorld(), rs.getInt("x"), rs.getInt("y"), rs.getInt("z")));
bs.setDate(rs.getTimestamp("cdate")); bs.setDate(rs.getTimestamp("cdate"));
bs.setGameMode(getGameMode(rs)); bs.setGameMode(getGameMode(rs));
bs.setPlayerName(rs.getString("player")); bs.setPlayerNameOrUUID(rs.getString("player"));
bs.setSource(getSource(rs)); bs.setSource(getSource(rs));
return bs; return bs;
} }
@ -138,7 +138,7 @@ public class DBQueries {
update.setString(1, s.getGameMode().name()); update.setString(1, s.getGameMode().name());
else else
update.setInt(1, s.getGameMode().getValue()); update.setInt(1, s.getGameMode().getValue());
update.setString(2, s.getPlayerName()); update.setString(2, s.getPlayerUUID().toString());
update.setTimestamp(3, new java.sql.Timestamp(s.getDate().getTime())); update.setTimestamp(3, new java.sql.Timestamp(s.getDate().getTime()));
if (db.getType() == Type.MySQL) if (db.getType() == Type.MySQL)
update.setString(4, s.getSource().name()); update.setString(4, s.getSource().name());
@ -207,7 +207,7 @@ public class DBQueries {
insert.setString(5, s.getGameMode().name()); insert.setString(5, s.getGameMode().name());
else else
insert.setInt(5, s.getGameMode().getValue()); insert.setInt(5, s.getGameMode().getValue());
insert.setString(6, s.getPlayerName()); insert.setString(6, s.getPlayerUUID().toString());
insert.setTimestamp(7, new java.sql.Timestamp(s.getDate().getTime())); insert.setTimestamp(7, new java.sql.Timestamp(s.getDate().getTime()));
if (db.getType() == Type.MySQL) if (db.getType() == Type.MySQL)
insert.setString(8, s.getSource().name()); insert.setString(8, s.getSource().name());

View file

@ -11,7 +11,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingBreakEvent;

View file

@ -29,7 +29,7 @@ public class PlayerListener implements Listener {
public void onInteract(PlayerInteractEvent event) { public void onInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
Block b = event.getClickedBlock(); Block b = event.getClickedBlock();
if (b != null && event.getPlayer().getItemInHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { if (b != null && event.getPlayer().getInventory().getItemInMainHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) {
if (mod.getConfig().getIgnoredWorlds().contains(event.getClickedBlock().getWorld().getName())) { if (mod.getConfig().getIgnoredWorlds().contains(event.getClickedBlock().getWorld().getName())) {
event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("command.blockstate.world_ignored", event.getClickedBlock().getWorld().getName())); event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("command.blockstate.world_ignored", event.getClickedBlock().getWorld().getName()));
} else { } else {
@ -41,7 +41,7 @@ public class PlayerListener implements Listener {
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onInteractEntity(PlayerInteractEntityEvent event) { public void onInteractEntity(PlayerInteractEntityEvent event) {
Entity e = event.getRightClicked(); Entity e = event.getRightClicked();
if (e != null && e instanceof ItemFrame && event.getPlayer().getItemInHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { if (e != null && e instanceof ItemFrame && event.getPlayer().getInventory().getItemInMainHand().getType().equals(mod.getConfig().getTool()) && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) {
if (mod.getConfig().getIgnoredWorlds().contains(e.getWorld().getName())) { if (mod.getConfig().getIgnoredWorlds().contains(e.getWorld().getName())) {
event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("command.blockstate.world_ignored", e.getWorld().getName())); event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("command.blockstate.world_ignored", e.getWorld().getName()));
} else { } else {

View file

@ -1,22 +1,21 @@
package de.jaschastarke.minecraft.limitedcreative.blockstate.thread; package de.jaschastarke.minecraft.limitedcreative.blockstate.thread;
import de.jaschastarke.bukkit.lib.ModuleLogger;
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
import de.jaschastarke.minecraft.limitedcreative.blockstate.AbstractModel.HasBlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.Cuboid;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBQueries;
import de.jaschastarke.minecraft.limitedcreative.blockstate.ThreadedModel;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import java.lang.Thread.UncaughtExceptionHandler; import java.lang.Thread.UncaughtExceptionHandler;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import de.jaschastarke.bukkit.lib.ModuleLogger;
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.AbstractModel.HasBlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.Cuboid;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBQueries;
import de.jaschastarke.minecraft.limitedcreative.blockstate.ThreadedModel;
public class ThreadLink { public class ThreadLink {
private static final int BATCH_ACTION_LENGTH = 25; private static final int BATCH_ACTION_LENGTH = 25;
private static final int QUEUE_ACCESS_WARNING_DURATION = 5; // ms private static final int QUEUE_ACCESS_WARNING_DURATION = 5; // ms
@ -24,10 +23,11 @@ public class ThreadLink {
private static final int COUNT_ERROR_QUEUE = 20; private static final int COUNT_ERROR_QUEUE = 20;
private static final int QUEUE_TIMING_DURATION = 500; // ms private static final int QUEUE_TIMING_DURATION = 500; // ms
private static final int STARTUP_TIMING = 30000; // ms private static final int STARTUP_TIMING = 30000; // ms
private static final int THREAD_SHUTDOWN_WAIT_MS = 30000;
private long lastTimeout; private long lastTimeout;
private Stack<Action> updateQueue = new Stack<Action>(); private final Stack<Action> updateQueue = new Stack<Action>();
private boolean shutdown = false; private boolean shutdown;
private ModuleLogger log; private ModuleLogger log;
private ThreadedModel model; private ThreadedModel model;
private Thread thread; private Thread thread;
@ -39,15 +39,8 @@ public class ThreadLink {
/* /*
* In theory we could add multiple threads, e.g. 1 write and 2 read threads. * In theory we could add multiple threads, e.g. 1 write and 2 read threads.
*/ */
thread = new DBThread(queries); createThread(queries);
thread.setName("LC BlockState DB-Thread"); shutdown = true; //Don't allow the thread to run until it's started
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
e.printStackTrace();
log.severe("Thread " + thread.getName() + " encoutered an uncaught Exception: " + e.getMessage());
}
});
} }
private class DBThread extends Thread { private class DBThread extends Thread {
@ -62,6 +55,8 @@ public class ThreadLink {
lastTimeout = System.currentTimeMillis() + STARTUP_TIMING; lastTimeout = System.currentTimeMillis() + STARTUP_TIMING;
while (!shutdown || !updateQueue.isEmpty()) { while (!shutdown || !updateQueue.isEmpty()) {
try { try {
//Thread.sleep(1000);
//throw new RuntimeException("Test exception pls ignore");
List<Action> acts = new LinkedList<Action>(); List<Action> acts = new LinkedList<Action>();
synchronized (updateQueue) { synchronized (updateQueue) {
while (updateQueue.isEmpty() && !shutdown) while (updateQueue.isEmpty() && !shutdown)
@ -91,6 +86,7 @@ public class ThreadLink {
for (Action act : acts) { for (Action act : acts) {
if (!shutdown || !(act instanceof CacheChunkAction)) { if (!shutdown || !(act instanceof CacheChunkAction)) {
if (act instanceof CallableAction) { if (act instanceof CallableAction) {
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (act) { synchronized (act) {
act.process(ThreadLink.this, this.q); act.process(ThreadLink.this, this.q);
act.notify(); act.notify();
@ -104,7 +100,7 @@ public class ThreadLink {
log.debug("DB-Thread '" + Thread.currentThread().getName() + "' execution time: " + (System.currentTimeMillis() - t) + "ms"); log.debug("DB-Thread '" + Thread.currentThread().getName() + "' execution time: " + (System.currentTimeMillis() - t) + "ms");
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
log.severe("DB-Thread '" + Thread.currentThread().getName() + "' was harmfull interupted"); log.severe("DB-Thread '" + Thread.currentThread().getName() + "' was harmfully interupted");
} }
Thread.yield(); Thread.yield();
} }
@ -114,42 +110,47 @@ public class ThreadLink {
} }
public void start() { public void start() {
shutdown = false;
if (!thread.isAlive()) if (!thread.isAlive())
thread.start(); thread.start();
} }
public void queueUpdate(Block block) { public void queueUpdate(Block block) {
restartThreadIfNeeded();
long l = System.currentTimeMillis(); long l = System.currentTimeMillis();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.add(new UpdateBlockStateAction(block)); updateQueue.add(new UpdateBlockStateAction(block));
updateQueue.notify(); updateQueue.notifyAll();
} }
long l2 = System.currentTimeMillis(); long l2 = System.currentTimeMillis();
if (l2 - l > QUEUE_ACCESS_WARNING_DURATION) { if (l2 - l > QUEUE_ACCESS_WARNING_DURATION) {
getLog().warn("queueUpdate-action took to long: " + (l - 2) + "ms"); getLog().warn("queueUpdate-action took too long: " + (l2 - l) + "ms");
} }
} }
public BlockState callUpdate(Block block) { public BlockState callUpdate(Block block) {
restartThreadIfNeeded();
FetchBlockStateAction action = new FetchBlockStateAction(block); FetchBlockStateAction action = new FetchBlockStateAction(block);
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.push(action); updateQueue.push(action);
updateQueue.notify(); updateQueue.notifyAll();
} }
return action.getValue(); return action.getValue();
} }
public void queue(Action act) { public void queue(Action act) {
restartThreadIfNeeded();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.add(act); updateQueue.add(act);
updateQueue.notify(); updateQueue.notifyAll();
} }
} }
public <T> T call(CallableAction<T> act) { public <T> T call(CallableAction<T> act) {
restartThreadIfNeeded();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.push(act); updateQueue.push(act);
updateQueue.notify(); updateQueue.notifyAll();
} }
return act.getValue(); return act.getValue();
} }
@ -158,38 +159,43 @@ public class ThreadLink {
FetchCuboidAction action = new FetchCuboidAction(c); FetchCuboidAction action = new FetchCuboidAction(c);
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.push(action); updateQueue.push(action);
updateQueue.notify(); updateQueue.notifyAll();
} }
return action.getValue(); return action.getValue();
} }
public void queueMetaMove(Location from, Location to) { public void queueMetaMove(Location from, Location to) {
restartThreadIfNeeded();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.add(new MoveBlockStateAction(from, to)); updateQueue.add(new MoveBlockStateAction(from, to));
updateQueue.notify(); updateQueue.notifyAll();
} }
} }
public void queueChunkLoad(Chunk chunk) { public void queueChunkLoad(Chunk chunk) {
restartThreadIfNeeded();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.add(new CacheChunkAction(chunk)); updateQueue.add(new CacheChunkAction(chunk));
updateQueue.notify(); updateQueue.notifyAll();
} }
} }
public void queueTransaction(Transaction transaction) { public void queueTransaction(Transaction transaction) {
restartThreadIfNeeded();
synchronized (updateQueue) { synchronized (updateQueue) {
updateQueue.add(transaction); updateQueue.add(transaction);
updateQueue.notify(); updateQueue.notifyAll();
} }
} }
public void shutdown() throws InterruptedException { public void shutdown() throws InterruptedException {
synchronized (updateQueue) { synchronized (updateQueue) {
shutdown = true; shutdown = true;
updateQueue.notify(); updateQueue.notifyAll();
} }
thread.join(); thread.join(THREAD_SHUTDOWN_WAIT_MS);
if (thread.isAlive())
thread.interrupt(); //Wake it up
} }
public HasBlockState getMetaState(Block block) { public HasBlockState getMetaState(Block block) {
@ -209,4 +215,27 @@ public class ThreadLink {
public ModuleLogger getLog() { public ModuleLogger getLog() {
return log; return log;
} }
private void restartThreadIfNeeded() {
if ((thread != null && thread.isAlive()) || shutdown)
return;
log.warn("Thread is dead, restarting!");
new Exception("Thread-restarting update called").printStackTrace();
createThread(((DBThread) thread).q);
start();
}
private void createThread(DBQueries queries) {
if (shutdown)
return;
thread = new DBThread(queries);
thread.setName("LC BlockState DB-Thread");
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
e.printStackTrace();
log.severe("Thread " + thread.getName() + " encoutered an uncaught Exception: " + e.getMessage());
}
});
}
} }

View file

@ -1,21 +1,20 @@
package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit; package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit;
import java.util.Date; import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.sk89q.worldedit.Vector; import java.util.Date;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.logging.AbstractLoggingExtent;
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates; public class EditSessionExtent extends AbstractDelegateExtent {
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState;
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source;
public class EditSessionExtent extends AbstractLoggingExtent {
private ModBlockStates mod; private ModBlockStates mod;
private Player player = null; private Player player = null;
private World world; private World world;
@ -30,14 +29,15 @@ public class EditSessionExtent extends AbstractLoggingExtent {
/** /**
* Called when a block is being changed. * Called when a block is being changed.
* *
* @param position the position * @param pt the position
* @param newBlock the new block to replace the old one * @param newBlock the new block to replace the old one
*/ */
protected void onBlockChange(Vector pt, BaseBlock newBlock) { @Override
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 pt, T newBlock) throws WorldEditException {
if (mod.isDebug()) if (mod.isDebug())
mod.getLog().debug("WorldEdit-Integration: BlockChange: " + pt.toString() + " BB: " + newBlock.toString()); mod.getLog().debug("WorldEdit-Integration: BlockChange: " + pt.toString() + " BB: " + newBlock.toString());
Location loc = new Location(world, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); Location loc = new Location(world, pt.getBlockX(), pt.getBlockY(), pt.getBlockZ());
if (newBlock.getType() == 0) { if (newBlock.getBlockType().getMaterial().isAir()) {
mod.getModel().removeState(loc.getBlock()); mod.getModel().removeState(loc.getBlock());
} else { } else {
BlockState s = mod.getModel().getState(loc.getBlock()); BlockState s = mod.getModel().getState(loc.getBlock());
@ -46,7 +46,7 @@ public class EditSessionExtent extends AbstractLoggingExtent {
s.setLocation(loc); s.setLocation(loc);
} }
s.setGameMode(null); s.setGameMode(null);
s.setPlayerName(player.getName()); s.setPlayerNameOrUUID(player.getUniqueId().toString());
s.setDate(new Date()); s.setDate(new Date());
s.setSource(Source.EDIT); s.setSource(Source.EDIT);
if (mod.isDebug()) if (mod.isDebug())
@ -54,5 +54,7 @@ public class EditSessionExtent extends AbstractLoggingExtent {
mod.getModel().setState(s); mod.getModel().setState(s);
} }
super.setBlock(pt, newBlock);
return true;
} }
} }

View file

@ -1,18 +1,17 @@
package de.jaschastarke.minecraft.limitedcreative.hooks; package de.jaschastarke.minecraft.limitedcreative.hooks;
import org.bukkit.entity.Player;
import uk.org.whoami.authme.api.API;
import de.jaschastarke.minecraft.limitedcreative.Hooks; import de.jaschastarke.minecraft.limitedcreative.Hooks;
import de.jaschastarke.minecraft.limitedcreative.LimitedCreative; import de.jaschastarke.minecraft.limitedcreative.LimitedCreative;
import fr.xephi.authme.api.v3.AuthMeApi;
import org.bukkit.entity.Player;
@Deprecated // AuthMe 3.0 released. Compatibility for older versions will be removed sometime //@Deprecated // AuthMe 3.0 released. Compatibility for older versions will be removed sometime
public class AuthMeHooks { public class AuthMeHooks {
public AuthMeHooks(final LimitedCreative plugin) { public AuthMeHooks(final LimitedCreative plugin) {
Hooks.IsLoggedIn.register(new PlayerCheckHooker.Check() { Hooks.IsLoggedIn.register(new PlayerCheckHooker.Check() {
@Override @Override
public boolean test(Player player) { public boolean test(Player player) {
boolean li = API.isAuthenticated(player); boolean li = AuthMeApi.getInstance().isAuthenticated(player);
if (plugin.isDebug()) // not nessesary, but so no string concation without debug needed if (plugin.isDebug()) // not nessesary, but so no string concation without debug needed
plugin.getLog().debug("AuthMe: "+player.getName()+": logged in: "+li); plugin.getLog().debug("AuthMe: "+player.getName()+": logged in: "+li);
return li; return li;

View file

@ -1,16 +1,15 @@
package de.jaschastarke.minecraft.limitedcreative.inventories; package de.jaschastarke.minecraft.limitedcreative.inventories;
import de.jaschastarke.bukkit.lib.SimpleModule;
import de.jaschastarke.minecraft.limitedcreative.LimitedCreative;
import de.jaschastarke.minecraft.limitedcreative.ModInventories;
import fr.xephi.authme.events.ProtectInventoryEvent;
import fr.xephi.authme.events.RestoreInventoryEvent;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import uk.org.whoami.authme.events.RestoreInventoryEvent; //@Deprecated // AuthMe 3.0 released. Compatibility for older versions will be removed sometime
import uk.org.whoami.authme.events.StoreInventoryEvent;
import de.jaschastarke.bukkit.lib.SimpleModule;
import de.jaschastarke.minecraft.limitedcreative.LimitedCreative;
import de.jaschastarke.minecraft.limitedcreative.ModInventories;
@Deprecated // AuthMe 3.0 released. Compatibility for older versions will be removed sometime
public class AuthMeInventories extends SimpleModule<LimitedCreative> implements Listener { public class AuthMeInventories extends SimpleModule<LimitedCreative> implements Listener {
ModInventories invmod; ModInventories invmod;
public AuthMeInventories(LimitedCreative plugin, ModInventories modInventories) { public AuthMeInventories(LimitedCreative plugin, ModInventories modInventories) {
@ -19,7 +18,7 @@ public class AuthMeInventories extends SimpleModule<LimitedCreative> implements
} }
@EventHandler @EventHandler
public void onStoreInventory(StoreInventoryEvent event) { public void onStoreInventory(ProtectInventoryEvent event) {
if (isDebug()) if (isDebug())
getLog().debug("AuthMe Store Event: " + event.getPlayer().getName()); getLog().debug("AuthMe Store Event: " + event.getPlayer().getName());

View file

@ -47,7 +47,7 @@ public class Fallback {
@Override @Override
public void store(ConfigurationSection section) { public void store(ConfigurationSection section) {
for (int i = 0; i < inv.getSize(); i++) { for (int i = 0; i < inv.getSize(); i++) {
if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) if (inv.getItem(i) != null && !inv.getItem(i).getType().equals(Material.AIR))
sectionSetItem(section, String.valueOf(i), inv.getItem(i)); sectionSetItem(section, String.valueOf(i), inv.getItem(i));
} }
} }
@ -97,7 +97,7 @@ public class Fallback {
public static Map<Integer, ItemStack> storeInventory(PlayerInventory inv) { public static Map<Integer, ItemStack> storeInventory(PlayerInventory inv) {
Map<Integer, ItemStack> map = new HashMap<Integer, ItemStack>(); Map<Integer, ItemStack> map = new HashMap<Integer, ItemStack>();
for (int i = 0; i < inv.getSize(); i++) { for (int i = 0; i < inv.getSize(); i++) {
if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) { if (inv.getItem(i) != null && !inv.getItem(i).getType().equals(Material.AIR)) {
map.put(i, inv.getItem(i)); map.put(i, inv.getItem(i));
} }
} }
@ -133,13 +133,13 @@ public class Fallback {
@Override @Override
public void store(ConfigurationSection section) { public void store(ConfigurationSection section) {
if (inv.getHelmet() != null && inv.getHelmet().getTypeId() != 0) if (inv.getHelmet() != null && !inv.getHelmet().getType().equals(Material.AIR))
Items.sectionSetItem(section, "helmet", inv.getHelmet()); Items.sectionSetItem(section, "helmet", inv.getHelmet());
if (inv.getChestplate() != null && inv.getChestplate().getTypeId() != 0) if (inv.getChestplate() != null && !inv.getChestplate().getType().equals(Material.AIR))
Items.sectionSetItem(section, "chestplate", inv.getChestplate()); Items.sectionSetItem(section, "chestplate", inv.getChestplate());
if (inv.getLeggings() != null && inv.getLeggings().getTypeId() != 0) if (inv.getLeggings() != null && !inv.getLeggings().getType().equals(Material.AIR))
Items.sectionSetItem(section, "leggins", inv.getLeggings()); Items.sectionSetItem(section, "leggins", inv.getLeggings());
if (inv.getBoots() != null && inv.getBoots().getTypeId() != 0) if (inv.getBoots() != null && !inv.getBoots().getType().equals(Material.AIR))
Items.sectionSetItem(section, "boots", inv.getBoots()); Items.sectionSetItem(section, "boots", inv.getBoots());
} }

View file

@ -43,7 +43,7 @@ public class InvYamlStorage extends InvConfStorage {
@Override @Override
public void load(Inventory pinv, Target target) { public void load(Inventory pinv, Target target) {
load(pinv, YamlConfiguration.loadConfiguration(getFile(pinv, target))); load(pinv, YamlConfiguration.loadConfiguration(getFile(pinv, target, false)));
} }
@Override @Override
@ -52,7 +52,11 @@ public class InvYamlStorage extends InvConfStorage {
yml.options().header("DO NOT MODIFY THIS FILE"); yml.options().header("DO NOT MODIFY THIS FILE");
store(pinv, yml); store(pinv, yml);
try { try {
yml.save(getFile(pinv, target)); File nameFile=getFile(pinv, target, false);
File uuidFile=getFile(pinv, target, true);
if(!nameFile.equals(uuidFile)) //It'd be recreated right after, still, don't remove if the same
nameFile.delete(); //Delete file with name so it doesn't get loaded again
yml.save(uuidFile);
} catch (IOException e) { } catch (IOException e) {
mod.getLog().warn("Failed to save Inventory for Player " + pinv.getPlayer().getName()); mod.getLog().warn("Failed to save Inventory for Player " + pinv.getPlayer().getName());
e.printStackTrace(); e.printStackTrace();
@ -61,19 +65,28 @@ public class InvYamlStorage extends InvConfStorage {
@Override @Override
public void remove(Inventory pinv, Target target) { public void remove(Inventory pinv, Target target) {
getFile(pinv, target).delete(); getFile(pinv, target, true).delete();
} }
@Override @Override
public boolean contains(Inventory pinv, Target target) { public boolean contains(Inventory pinv, Target target) {
return getFile(pinv, target).exists(); return getFile(pinv, target, false).exists();
} }
protected File getFile(Inventory pinv, Target target) { protected File getFile(Inventory pinv, Target target, boolean uuidonly) {
File file;
String player;
do {
player = uuidonly ? pinv.getPlayer().getUniqueId().toString() : pinv.getPlayer().getName();
if (target != default_target) { if (target != default_target) {
return new File(dir, pinv.getPlayer().getName() + "_" + target.toString().toLowerCase() + SUFFIX); file = new File(dir, player + "_" + target.toString().toLowerCase() + SUFFIX);
} else { } else {
return new File(dir, pinv.getPlayer().getName() + SUFFIX); file = new File(dir, player + SUFFIX);
} }
if(uuidonly)
return file; //Use file with UUID, even if doesn't exist
uuidonly = true; //Run again with UUID, then return...
} while(!file.exists()); //...if the file with name is not found
return file; //Found file with player name
} }
} }

View file

@ -0,0 +1,217 @@
package de.jaschastarke.minecraft.limitedcreative.inventories.store;
import de.jaschastarke.bukkit.lib.CoreModule;
import de.jaschastarke.bukkit.lib.ModuleLogger;
import de.jaschastarke.minecraft.limitedcreative.inventories.Inventory;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Base64;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ReflectionStorage extends PlayerInventoryStorage {
private CoreModule<?> mod;
private File dir;
private String nms;
private InvYamlStorage yamlStorage;
public ReflectionStorage(CoreModule<?> mod, File file) {
this.mod = mod;
dir = file;
yamlStorage = new InvYamlStorage(mod, file);
}
@Override
public ModuleLogger getLog() {
return mod.getLog();
}
private File getFile(UUID uuid) {
return new File(dir, uuid.toString() + "_ref.yml");
}
private Object getInventory(Player player) throws Exception {
org.bukkit.inventory.Inventory inv = player.getInventory();
if (getInventory == null)
getInventory = inv.getClass().getMethod("getInventory");
Object handle = getInventory.invoke(inv);
if (nms == null)
nms = handle.getClass().getPackage().getName();
return handle;
}
@Override
public void store(Inventory pinv, Inventory.Target target) {
try {
File f = getFile(pinv.getPlayer().getUniqueId());
YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
config.set(target.name(), serialize(getInventory(pinv.getPlayer())));
config.save(f);
} catch (Exception e) {
e.printStackTrace();
}
}
private Method getInventory;
@Override
public void load(Inventory pinv, Inventory.Target target) {
Player player = pinv.getPlayer();
try {
File f = getFile(player.getUniqueId());
if (!f.exists()) { //If not found use the older file(s)
yamlStorage.load(pinv, target);
return;
}
//String content = new String(Files.readAllBytes(f.toPath()));
Configuration config = YamlConfiguration.loadConfiguration(f);
String content = config.getString(target.name());
if (content == null) {
yamlStorage.load(pinv, target);
return;
}
setFromSerialized(getInventory(player), content);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void remove(Inventory pinv, Inventory.Target target) {
File f = getFile(pinv.getPlayer().getUniqueId());
if (!f.exists()) return;
Configuration config = YamlConfiguration.loadConfiguration(f);
config.set(target.name(), null);
}
@Override
public boolean contains(Inventory pinv, Inventory.Target target) {
File f = getFile(pinv.getPlayer().getUniqueId());
if (!f.exists()) return yamlStorage.contains(pinv, target);
Configuration config = YamlConfiguration.loadConfiguration(f);
return config.contains(target.name()) || yamlStorage.contains(pinv, target);
}
//Based on iie's per-world inventory
//https://github.com/TBMCPlugins/iiePerWorldInventory/blob/master/src/buttondevteam/perworld/serializers/inventory.java
private Method save;
private Class<?> nbtcl;
private Method nbtcsta;
private Class<?> nbtcstcl;
//SERIALIZE ITEMSTACK
private String serializeItemStack(Object itemStack) throws Exception {
if (nbtcl == null)
nbtcl = Class.forName(nms + ".NBTTagCompound");
if (save == null)
save = itemStack.getClass().getMethod("save", nbtcl);
if (nbtcstcl == null)
nbtcstcl = Class.forName(nms + ".NBTCompressedStreamTools");
if (nbtcsta == null)
nbtcsta = nbtcstcl.getMethod("a", nbtcl, OutputStream.class);
Object tag = save.invoke(itemStack, nbtcl.newInstance());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
nbtcsta.invoke(null, tag, outputStream);
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
}
private Method nbtcstaa;
private Function<Object, Object> createStack;
//DESERIALIZE ITEMSTACK
private Object deserializeItemStack(String itemStackString) throws Exception {
if (nbtcstcl == null)
nbtcstcl = Class.forName(nms + ".NBTCompressedStreamTools");
if (nbtcstaa == null)
nbtcstaa = nbtcstcl.getMethod("a", InputStream.class);
if (nbtcl == null)
nbtcl = Class.forName(nms + ".NBTTagCompound");
try {
if (createStack == null) {
final Method a = iscl.getMethod("a", nbtcl);
createStack = nbt -> {
try {
return a.invoke(null, nbt);
} catch (Exception e) {
throw new RuntimeException(e);
}
};
}
} catch (NoSuchMethodException ex) { //It can only get here inside the if
final Constructor<?> constructor = iscl.getConstructor(nbtcl);
createStack = nbt -> {
try {
return constructor.newInstance(nbt);
} catch (Exception e) {
throw new RuntimeException(e);
}
};
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(itemStackString));
Object nbtTagCompound = nbtcstaa.invoke(null, inputStream);
return createStack.apply(nbtTagCompound);
}
private Method getSize;
private Method getItem;
//SERIALIZE INVENTORY
private String serialize(Object invInventory) throws Exception {
if (getSize == null)
getSize = invInventory.getClass().getMethod("getSize");
if (getItem == null)
getItem = invInventory.getClass().getMethod("getItem", int.class);
return IntStream.range(0, (int) getSize.invoke(invInventory))
.mapToObj(s -> {
try {
//nms ItemStack
Object i = getItem.invoke(invInventory, s);
return Objects.isNull(i) ? null : s + "#" + serializeItemStack(i);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.filter(Objects::nonNull)
.collect(Collectors.joining(";"));
}
private Method clear;
private Method setItem;
private Class<?> iscl;
//SET INVENTORY FROM SERIALIZED
private void setFromSerialized(Object invInventory, String invString) throws Exception {
if (clear == null)
clear = invInventory.getClass().getMethod("clear");
if (iscl == null)
iscl = Class.forName(nms + ".ItemStack");
if (setItem == null)
setItem = invInventory.getClass().getMethod("setItem", int.class, iscl);
clear.invoke(invInventory); //clear inventory
if (invString != null && !invString.isEmpty())
Arrays.asList(invString.split(";"))
.parallelStream()
.forEach(s -> {
String[] e = s.split("#");
try {
setItem.invoke(invInventory, Integer.parseInt(e[0]), deserializeItemStack(e[1]));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
}
}

View file

@ -55,7 +55,7 @@ public class BlackList extends ArrayList<BlackList.Blacklisted> implements Confi
} }
public boolean matches(Block block) { public boolean matches(Block block) {
if (hasData) { if (hasData) {
return md.equals(new MaterialData(block.getType(), block.getData())); return md.equals(block.getState().getData());
} else { } else {
return block.getType().equals(md.getItemType()); return block.getType().equals(md.getItemType());
} }

View file

@ -52,7 +52,7 @@ public class BlackListEntity extends ArrayList<BlackListEntity.Blacklisted> impl
type = null; type = null;
} }
if (type == null) if (type == null)
type = EntityType.fromName(rep); type = EntityType.valueOf(rep);
try { try {
if (type == null) if (type == null)
type = EntityType.valueOf(rep); type = EntityType.valueOf(rep);

View file

@ -118,16 +118,16 @@ public class NoLimitPermissions extends SimplePermissionContainerNode {
return new InventoryPermission(CHEST, invtype); return new InventoryPermission(CHEST, invtype);
} }
public static IDynamicPermission INTERACT(Block block) { public static IDynamicPermission INTERACT(Block block) {
return new MaterialPermission(BASE_INTERACT, new MaterialData(block.getType(), block.getData())); return new MaterialPermission(BASE_INTERACT, block.getState().getData());
} }
public static IDynamicPermission USE(Block block) { public static IDynamicPermission USE(Block block) {
return new MaterialPermission(BASE_USE, new MaterialData(block.getType(), block.getData())); return new MaterialPermission(BASE_USE, block.getState().getData());
} }
public static IDynamicPermission USE(MaterialData m) { public static IDynamicPermission USE(MaterialData m) {
return new MaterialPermission(BASE_USE, m); return new MaterialPermission(BASE_USE, m);
} }
public static IDynamicPermission BREAK(Block block) { public static IDynamicPermission BREAK(Block block) {
return new MaterialPermission(BASE_BREAK, new MaterialData(block.getType(), block.getData())); return new MaterialPermission(BASE_BREAK, block.getState().getData());
} }

View file

@ -39,7 +39,6 @@ import org.bukkit.event.player.*;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.material.DirectionalContainer; import org.bukkit.material.DirectionalContainer;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.projectiles.ProjectileSource;
import de.jaschastarke.minecraft.lib.permissions.IAbstractPermission; import de.jaschastarke.minecraft.lib.permissions.IAbstractPermission;
import de.jaschastarke.minecraft.lib.permissions.IDynamicPermission; import de.jaschastarke.minecraft.lib.permissions.IDynamicPermission;
@ -195,8 +194,8 @@ public class PlayerListener implements Listener {
@EventHandler @EventHandler
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (!event.isCancelled() && event.getPlayer().getGameMode() == GameMode.CREATIVE) { if (!event.isCancelled() && event.getPlayer().getGameMode() == GameMode.CREATIVE) {
if (mod.getConfig().getBlockUse().isListed(event.getPlayer().getItemInHand())) { if (mod.getConfig().getBlockUse().isListed(event.getPlayer().getInventory().getItemInMainHand())) {
if (!checkPermission(event, NoLimitPermissions.USE(event.getPlayer().getItemInHand().getData()))) { if (!checkPermission(event, NoLimitPermissions.USE(event.getPlayer().getInventory().getItemInMainHand().getData()))) {
event.setCancelled(true); event.setCancelled(true);
event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("blocked.use")); event.getPlayer().sendMessage(mod.getPlugin().getLocale().trans("blocked.use"));
return; return;
@ -223,11 +222,8 @@ public class PlayerListener implements Listener {
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) rawevent; EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) rawevent;
Entity source = event.getDamager(); Entity source = event.getDamager();
if (source instanceof Projectile) { if (source instanceof Projectile && ((Projectile) source).getShooter() instanceof Entity)
ProjectileSource shooter = ((Projectile) source).getShooter(); source = (Entity) ((Projectile) source).getShooter();
if (shooter instanceof Entity)
source = (Entity) shooter;
}
if (source instanceof Player) { if (source instanceof Player) {
Player player = (Player) source; Player player = (Player) source;

View file

@ -1,12 +1,10 @@
package de.jaschastarke.minecraft.limitedcreative.regions; package de.jaschastarke.minecraft.limitedcreative.regions;
import org.bukkit.GameMode;
import org.bukkit.command.CommandSender;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.FlagContext;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroup; import com.sk89q.worldguard.protection.flags.RegionGroup;
import org.bukkit.GameMode;
/** /**
* Well, that was an interesting idea, but it doesn't work. * Well, that was an interesting idea, but it doesn't work.
@ -17,7 +15,8 @@ public class GameModeFlag extends Flag<GameMode> {
} }
@Override @Override
public GameMode parseInput(WorldGuardPlugin plugin, CommandSender sender, String input) throws InvalidFlagFormat { public GameMode parseInput(FlagContext context) throws InvalidFlagFormat {
String input = context.getUserInput();
input = input.trim(); input = input.trim();
if (input.equalsIgnoreCase("creative")) { if (input.equalsIgnoreCase("creative")) {
return GameMode.CREATIVE; return GameMode.CREATIVE;

View file

@ -1,31 +1,19 @@
package de.jaschastarke.minecraft.limitedcreative.regions; package de.jaschastarke.minecraft.limitedcreative.regions;
import java.util.ArrayList; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import java.util.List; import com.sk89q.worldguard.WorldGuard;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.FlagContext;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.GlobalProtectedRegion; import com.sk89q.worldguard.protection.regions.GlobalProtectedRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import de.jaschastarke.LocaleString; import de.jaschastarke.LocaleString;
import de.jaschastarke.bukkit.lib.chat.ChatFormattings; import de.jaschastarke.bukkit.lib.chat.ChatFormattings;
import de.jaschastarke.bukkit.lib.commands.BukkitCommand; import de.jaschastarke.bukkit.lib.commands.*;
import de.jaschastarke.bukkit.lib.commands.CommandContext;
import de.jaschastarke.bukkit.lib.commands.CommandException;
import de.jaschastarke.bukkit.lib.commands.HelpCommand;
import de.jaschastarke.bukkit.lib.commands.ICommand;
import de.jaschastarke.bukkit.lib.commands.IHelpDescribed;
import de.jaschastarke.bukkit.lib.commands.MethodCommand;
import de.jaschastarke.bukkit.lib.commands.MissingPermissionCommandException;
import de.jaschastarke.bukkit.lib.commands.annotations.IsCommand; import de.jaschastarke.bukkit.lib.commands.annotations.IsCommand;
import de.jaschastarke.bukkit.lib.commands.annotations.Usages; import de.jaschastarke.bukkit.lib.commands.annotations.Usages;
import de.jaschastarke.bukkit.lib.commands.parser.DefinedParameterParser; import de.jaschastarke.bukkit.lib.commands.parser.DefinedParameterParser;
@ -40,6 +28,13 @@ import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.FlagList;
import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.FlagValue; import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.FlagValue;
import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.Region; import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.Region;
import de.jaschastarke.modularize.ModuleEntry.ModuleState; import de.jaschastarke.modularize.ModuleEntry.ModuleState;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import java.util.ArrayList;
import java.util.List;
/** /**
* LimitedCreative-Region-Command: configure creative regions * LimitedCreative-Region-Command: configure creative regions
@ -138,7 +133,8 @@ public class RegionsCommand extends BukkitCommand implements IHelpDescribed {
if (idx > -1 && context.getArgument(idx) != null) if (idx > -1 && context.getArgument(idx) != null)
w = Bukkit.getWorld(context.getArgument(idx)); w = Bukkit.getWorld(context.getArgument(idx));
if (w != null) { if (w != null) {
RegionManager mgr = getWorldGuard().getGlobalRegionManager().get(w); RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionManager mgr = container.get(BukkitAdapter.adapt(w));
if (mgr != null) { if (mgr != null) {
List<String> hints = new ArrayList<String>(); List<String> hints = new ArrayList<String>();
for (String rId : mgr.getRegions().keySet()) { for (String rId : mgr.getRegions().keySet()) {
@ -174,7 +170,8 @@ public class RegionsCommand extends BukkitCommand implements IHelpDescribed {
if (w == null) if (w == null)
throw new CommandException(L("command.worldguard.world_not_found")); throw new CommandException(L("command.worldguard.world_not_found"));
RegionManager mgr = getWorldGuard().getGlobalRegionManager().get(w); RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionManager mgr = container.get(BukkitAdapter.adapt(w));
ProtectedRegion region = mgr.getRegion(params.getArgument(0)); ProtectedRegion region = mgr.getRegion(params.getArgument(0));
if (region == null && params.getArgument(0).equalsIgnoreCase("__global__")) { if (region == null && params.getArgument(0).equalsIgnoreCase("__global__")) {
region = new GlobalProtectedRegion(params.getArgument(0)); region = new GlobalProtectedRegion(params.getArgument(0));
@ -202,7 +199,7 @@ public class RegionsCommand extends BukkitCommand implements IHelpDescribed {
String value = params.getValue(); String value = params.getValue();
try { try {
if (value != null && value.trim().length() > 0) { if (value != null && value.trim().length() > 0) {
reg.setFlag(flag, flag.parseInput(getWorldGuard(), context.getSender(), value)); reg.setFlag(flag, flag.parseInput(FlagContext.create().setInput(value).build()));
} else { } else {
reg.setFlag(flag, null); reg.setFlag(flag, null);
} }
@ -237,17 +234,18 @@ public class RegionsCommand extends BukkitCommand implements IHelpDescribed {
throw new CommandException(L("command.worldguard.world_not_found")); throw new CommandException(L("command.worldguard.world_not_found"));
ProtectedRegion region = null; ProtectedRegion region = null;
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
if (params.getArgumentCount() == 0 && context.isPlayer()) { if (params.getArgumentCount() == 0 && context.isPlayer()) {
RegionManager mgr = getWorldGuard().getGlobalRegionManager().get(context.getPlayer().getWorld()); RegionManager mgr = container.get(BukkitAdapter.adapt(context.getPlayer().getWorld()));
ApplicableRegionSet set = mgr.getApplicableRegions(context.getPlayer().getLocation()); ApplicableRegionSet set = mgr.getApplicableRegions(BukkitAdapter.asBlockVector(context.getPlayer().getLocation()));
if (set.size() > 0) { if (set.size() > 0) {
region = set.iterator().next(); region = set.iterator().next();
} else { } else {
region = getWorldGuard().getGlobalRegionManager().get(w).getRegion(GLOBAL_REGION); region = container.get(BukkitAdapter.adapt(w)).getRegion(GLOBAL_REGION);
} }
} else { } else {
int rpc = params.getArgumentCount() > 1 ? 1 : 0; int rpc = params.getArgumentCount() > 1 ? 1 : 0;
RegionManager mgr = getWorldGuard().getGlobalRegionManager().get(w); RegionManager mgr = container.get(BukkitAdapter.adapt(w));
region = mgr.getRegion(params.getArgument(rpc)); region = mgr.getRegion(params.getArgument(rpc));
if (region == null && params.getArgument(rpc).equalsIgnoreCase(GLOBAL_REGION)) { if (region == null && params.getArgument(rpc).equalsIgnoreCase(GLOBAL_REGION)) {
region = new GlobalProtectedRegion(params.getArgument(rpc)); region = new GlobalProtectedRegion(params.getArgument(rpc));

View file

@ -22,6 +22,7 @@ import org.bukkit.entity.Player;
import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.StateFlag;
import com.sk89q.worldguard.protection.flags.StateFlag.State;
import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class ApplicableRegions { public class ApplicableRegions {
@ -36,28 +37,28 @@ public class ApplicableRegions {
public boolean allows(StateFlag flag) { public boolean allows(StateFlag flag) {
extendRegionFlags(); extendRegionFlags();
boolean r = regions.allows(flag); boolean r = regions.queryState(null, flag).equals(State.ALLOW);
contractRegionFlags(); contractRegionFlags();
return r; return r;
} }
public boolean allows(StateFlag flag, Player player) { public boolean allows(StateFlag flag, Player player) {
extendRegionFlags(); extendRegionFlags();
boolean r = regions.allows(flag, mgr.getWorldGuard().wrapPlayer(player)); boolean r = regions.queryState(mgr.getWorldGuard().wrapPlayer(player), flag).equals(State.ALLOW);
contractRegionFlags(); contractRegionFlags();
return r; return r;
} }
public <T extends Flag<V>, V> V getFlag(T flag) { public <T extends Flag<V>, V> V getFlag(T flag) {
extendRegionFlags(); extendRegionFlags();
V r = regions.getFlag(flag); V r = regions.queryValue(null, flag);
contractRegionFlags(); contractRegionFlags();
return r; return r;
} }
public <T extends Flag<V>, V> V getFlag(T flag, Player player) { public <T extends Flag<V>, V> V getFlag(T flag, Player player) {
extendRegionFlags(); extendRegionFlags();
V r = regions.getFlag(flag, mgr.getWorldGuard().wrapPlayer(player)); V r = regions.queryValue(mgr.getWorldGuard().wrapPlayer(player), flag);
contractRegionFlags(); contractRegionFlags();
return r; return r;
} }

View file

@ -17,14 +17,16 @@
*/ */
package de.jaschastarke.minecraft.limitedcreative.regions.worldguard; package de.jaschastarke.minecraft.limitedcreative.regions.worldguard;
import java.io.File; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import java.io.IOException; import com.sk89q.worldguard.WorldGuard;
import java.util.ArrayList; import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import java.util.Arrays; import com.sk89q.worldguard.protection.flags.Flag;
import java.util.HashMap; import com.sk89q.worldguard.protection.managers.RegionManager;
import java.util.List; import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import java.util.Map; import com.sk89q.worldguard.protection.regions.RegionContainer;
import de.jaschastarke.minecraft.limitedcreative.ModRegions;
import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration;
import de.jaschastarke.utils.StringUtil;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -32,16 +34,9 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.sk89q.worldguard.bukkit.BukkitUtil; import java.io.File;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import java.io.IOException;
import com.sk89q.worldguard.protection.GlobalRegionManager; import java.util.*;
import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import de.jaschastarke.minecraft.limitedcreative.ModRegions;
import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration;
import de.jaschastarke.utils.StringUtil;
public class CustomRegionManager { public class CustomRegionManager {
protected YamlConfiguration c; protected YamlConfiguration c;
@ -161,16 +156,14 @@ public class CustomRegionManager {
return ((WorldGuardPlugin) mod.getPlugin().getServer().getPluginManager().getPlugin(WorldGuardIntegration.PLUGIN_NAME)); return ((WorldGuardPlugin) mod.getPlugin().getServer().getPluginManager().getPlugin(WorldGuardIntegration.PLUGIN_NAME));
} }
public GlobalRegionManager getWGGlobalManager() {
return getWorldGuard().getGlobalRegionManager();
}
public RegionManager getWGManager(World world) { public RegionManager getWGManager(World world) {
return getWorldGuard().getRegionManager(world); RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
return container.get(BukkitAdapter.adapt(world));
} }
public String getRegionsHash(Location loc) { public String getRegionsHash(Location loc) {
StringBuilder hash = new StringBuilder(loc.getWorld().getName()); StringBuilder hash = new StringBuilder(loc.getWorld().getName());
List<String> idlist = getWGManager(loc.getWorld()).getApplicableRegionsIDs(BukkitUtil.toVector(loc)); List<String> idlist = getWGManager(loc.getWorld()).getApplicableRegionsIDs(BukkitAdapter.asBlockVector(loc));
if (idlist.size() > 0) { if (idlist.size() > 0) {
hash.append("#"); hash.append("#");
String[] ids = idlist.toArray(new String[idlist.size()]); String[] ids = idlist.toArray(new String[idlist.size()]);
@ -183,7 +176,7 @@ public class CustomRegionManager {
} }
public ApplicableRegions getRegionSet(Location loc) { public ApplicableRegions getRegionSet(Location loc) {
return new ApplicableRegions(getWGManager(loc.getWorld()).getApplicableRegions(loc), this.world(loc.getWorld())); return new ApplicableRegions(getWGManager(loc.getWorld()).getApplicableRegions(BukkitAdapter.asBlockVector(loc)), this.world(loc.getWorld()));
} }
public ApplicableRegions getRegionSet(Block block) { public ApplicableRegions getRegionSet(Block block) {

View file

@ -17,7 +17,6 @@
*/ */
package de.jaschastarke.minecraft.limitedcreative.regions.worldguard.events; package de.jaschastarke.minecraft.limitedcreative.regions.worldguard.events;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@ -25,11 +24,11 @@ import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.ApplicableRe
import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.CustomRegionManager; import de.jaschastarke.minecraft.limitedcreative.regions.worldguard.CustomRegionManager;
public class PlayerUpdateAreaEvent extends PlayerAreaEvent { public class PlayerUpdateAreaEvent extends PlayerAreaEvent {
private String player; private Player player;
private String hash; private String hash;
protected CustomRegionManager mgr; protected CustomRegionManager mgr;
public PlayerUpdateAreaEvent(CustomRegionManager mgr, String player, String hash) { public PlayerUpdateAreaEvent(CustomRegionManager mgr, Player player, String hash) {
this.mgr = mgr; this.mgr = mgr;
this.player = player; this.player = player;
this.hash = hash; this.hash = hash;
@ -46,7 +45,7 @@ public class PlayerUpdateAreaEvent extends PlayerAreaEvent {
@Override @Override
public Player getPlayer() { public Player getPlayer() {
return Bukkit.getServer().getPlayerExact(player); return player;
} }
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();

View file

@ -1,2 +0,0 @@
piwik_url = http://stats.ja-s.de/piwikProxy.php
piwik_site_id = 2