Merge remote-tracking branch 'refs/remotes/origin/WIP-Brewingchanges'

Conflicts:
	config.yml
	src/com/dre/brewery/BPlayer.java
	src/com/dre/brewery/listeners/CommandListener.java
This commit is contained in:
Frank Baumann 2013-09-11 13:15:03 +02:00
commit f729748ce7
15 changed files with 744 additions and 407 deletions

View File

@ -2,11 +2,13 @@
# Verschiedene Einstellungen
# Standardeinstellungen sind in [] angegeben
# Löschen einzelner Einstellungen deaktiviert sie
# Ob der Spieler beim nächsten Einloggen nach starker Trunkenheit am nächsten morgen Zuhause "aufwacht" (Ein home Plugin muss installiert sein!)
# Ob der Spieler beim nächsten Einloggen nach starker Trunkenheit am nächsten morgen Zuhause "aufwacht" (Ein home Plugin muss installiert sein!) [true]
enableHome: true
# Art des Nachhause-teleports:
# Art des Nachhause-teleports: ['cmd: home']
# bed = Spieler wird zu seinem Spawn Bett teleportiert
# SamplePlugin = installiertes home plugin. Unterstützt: ManagerXL. Wenn dies nicht geht:
# 'cmd: home' = /home wird vom Spieler ausgelöst. Es sollte kein Verzögerungs, etc. plugin installiert sein!
@ -15,20 +17,20 @@ enableHome: true
homeType: 'cmd: home'
# Ob der Spieler nach etwas kürzerem Ausloggen an einem zufälligen Ort "aufwacht" (diese müssen durch '/br Wakeup add' von einem Admin festgelegt werden)
# Der Spieler wacht an dem nähesten zweier zufälliger Orte aus seiner Welt auf.
# Der Spieler wacht an dem nähesten zweier zufälliger Orte aus seiner Welt auf. [true]
enableWake: true
# Ob der Spieler sich bei großer Trunkenheit teilweise nicht einloggen kann und kurz warten muss, da sein Charakter nicht reagiert
# Ob der Spieler sich bei großer Trunkenheit teilweise nicht einloggen kann und kurz warten muss, da sein Charakter nicht reagiert [true]
enableLoginDisallow: true
# Ob der Spieler sich übertrinken kann und dann in Ohnmacht fällt (gekickt wird) und sich für einige Minuten nicht einloggen kann
# Ob der Spieler sich übertrinken kann und dann in Ohnmacht fällt (gekickt wird) und sich für einige Minuten nicht einloggen kann [true]
enableKickOnOverdrink: true
# Ob der Spieler sich bei großer Trunkenheit übergibt (unten definiertes Item aus dem Mund fallen lässt)
# Ob der Spieler sich bei großer Trunkenheit übergibt (unten definiertes Item aus dem Mund fallen lässt) [true]
# Das Item kann nicht aufgesammelt werden und bleibt bis zum Despawnen liegen. (Achtung: Kann nach Serverrestart, oder durch Hopper aufgesammelt werden.)
enablePuke: true
# Item das beim Erbrechen mehrfach unaufsammelbar fallen gelassen wird
# Item das beim Erbrechen mehrfach unaufsammelbar fallen gelassen wird [SOUL_SAND]
pukeItem: SOUL_SAND
# Konsumierbares Item/Stärke. Senkt den Alkoholpegel um <Stärke> wenn konsumiert.
@ -36,28 +38,34 @@ drainItems:
- BREAD/4
- MILK_BUCKET/2
# Färben der Iteminformationen je nach Qualität während sie sich 1. im Fass und/oder 2. im Braustand befinden
colorInBarrels: true
colorInBrewer: true
# Zeit (in Tagen) die Trunkenheitsdaten nach offlinegehen eines Spielers im Speicher verbleiben, um z.B. Kater-Effekte anzuwenden. [7]
hangoverDays: 7
# Autosave Intervall in Minuten
# Färben der Iteminformationen je nach Qualität während sie sich 1. im Fass und/oder 2. im Braustand befinden [true, false]
colorInBarrels: true
colorInBrewer: false
# Autosave Intervall in Minuten [3]
autosave: 3
# Config Version
version: '0.5'
# Rezepte für Getränke
# name: Verschiedene Namen für schlecht/mittel/gut
# name: Verschiedene Namen für schlecht/mittel/gut (Farbcodes möglich: z.b. &6)
# ingredients: Auflistung von material/Anzahl
# cookingtime: Zeit in Echtminuten die die Zutaten kochen müssen
# distillruns: Wie oft destilliert werden muss 0-10 (0=ohne Destillieren)
# wood: Holz des Fasses 0=alle Holzsorten 1=Birch 2=Oak 3=Jungle 4=Pine
# distillruns: Wie oft destilliert werden muss für vollen Alkoholgehalt (0=ohne Destillieren)
# wood: Holz des Fasses 0=alle Holzsorten 1=Birch 2=Oak 3=Jungle 4=Spruce
# age: Zeit in Minecraft-Tagen, die das Getränk im Fass reifen muss 0= kein reifen
# color: Farbe des Getränks nach destillieren/reifen. DARK_RED, RED, BRIGHT_RED, ORANGE, PINK, BLUE, CYAN, WATER, GREEN, BLACK, GREY, BRIGHT_GREY
# difficulty: 1-10 Genauigkeit der Einhaltung der Vorgaben (1 = ungenau/einfach 10 = sehr genau/schwer)
# alcohol: Alkoholgehalt 0-100 in absoluter Menge bei perfektem Getränk (wird dem Spieler hinzugefügt, bei 100 = tot)
# effects: Auflistung Effekt/Dauer Besonderere Trank-Effekte beim Trinken, Dauer in sek. Ein 'X' an den Namen anhängen, um ihn zu verbergen. Bsp: POISONX/10
# (WEAKNESS, INCREASE_DAMAGE, SLOW und SPEED sind immer verborgen.) Mögliche Effekte: http://jd.bukkit.org/rb/apidocs/org/bukkit/potion/PotionEffectType.html
# Bei Effekten mit sofortiger Wirkung (z.B. HEAL) muss anstatt der Dauer das Level angegeben werden.
# (WEAKNESS, INCREASE_DAMAGE, SLOW und SPEED sind immer verborgen.) Mögliche Effekte: http://jd.bukkit.org/rb/apidocs/org/bukkit/potion/PotionEffectType.html
# Bei Effekten mit sofortiger Wirkung (z.B. HEAL) _muss_ anstatt der Dauer das Level angegeben werden.
recipes:
1:
@ -94,7 +102,7 @@ recipes:
difficulty: 2
alcohol: 7
4:
name: Scheußlicher Met/Met/Goldener Met
name: Scheußlicher Met/Met/&6Goldener Met
ingredients:
- SUGAR_CANE/6
cookingtime: 3
@ -105,7 +113,7 @@ recipes:
difficulty: 2
alcohol: 9
5:
name: Apfelmet/Süßer Apfelmet/Goldensüßer Apfelmet
name: Apfelmet/Süßer Apfelmet/&6Goldensüßer Apfelmet
ingredients:
- SUGAR_CANE/6
- APPLE/2
@ -113,13 +121,13 @@ recipes:
distillruns: 0
wood: 2
age: 4
COLOR: ORANGE
color: ORANGE
difficulty: 4
alcohol: 12
effects:
- WATER_BREATHINGX/150
6:
name: Bitterer Rum/Würziger Rum/Goldener Rum
name: Bitterer Rum/Würziger Rum/&6Goldener Rum
ingredients:
- SUGAR_CANE/14
cookingtime: 5

View File

@ -1,5 +1,5 @@
name: Brewery
version: 0.4
version: 0.5.1
main: com.dre.brewery.P
authors: [Milan Albrecht, Frank Baumann]
softdepend: [Vault]

View File

@ -29,7 +29,7 @@ Die Config.yml enthält:
* Rezepte
* Wörter
Sie kann frei editiert werden und nach Belieben angepasst werden. Die meisten Optionen werden allerdings erst bei einem Neustart des Servers übernommen.
Sie kann frei editiert werden und nach Belieben angepasst werden. Die Änderungen werden nach ausführen des Commands Reload oder nach einem Serverrestart übernommen
Alle Teile der Config sind kommentiert. Die Kommentare enthalten Erklärungen und Beispiele.
@ -41,7 +41,7 @@ Hier werden die Rezepte für die verschiedenen Tränke eingetragen. Es können b
Die Rezepte bestimmen alle Eigenschaften der entstehenden Tränke. Ob und wie lange sie reifen müssen, ihre Farbe, Effekte die beim Trinken wirken, den Alkoholgehalt, usw. Optionen die weggelassen werden, werden nicht verwendet, oder verwenden die Standardwerte. Wenn z.B. die Anzahl der Destilliervorgänge weggelassen wird, muss der Trank nicht destilliert werden.
Wichtig: Werdem die Namen der Rezepte verändert werden vorhandene Tränke der geänderten Rezepte nutzlos!
Werden im Nachhinein Rezepte umbenannt, so kann es sein, dass vorhandene Tränke den neuen Namen erst nach erneutem Reifen/Brauen erhalten.
**Wörter**
@ -64,6 +64,9 @@ Auch hier können anhand der Erklärungen und Beispiele bestehende "Wörter" ver
<tr>
<td>/br [Spieler] [Trunkenheit] [Qualität]</td><td>Setzen der Spielerwerte. Trunkenheit in %, Qualität von 1-10.</td>
</tr>
<tr>
<td>/br UnLabel</td><td>Versteckt die genauen Zahlen in der Beschriftung des Trankes in der Hand unwiederbringlich</td>
</tr>
<tr>
<td>/br Copy [Anzahl]</td><td>Kopiert den Trank in der Hand. Optional kann die Anzahl angegeben werden</td>
</tr>
@ -99,6 +102,9 @@ Auch hier können anhand der Erklärungen und Beispiele bestehende "Wörter" ver
<tr>
<th>Permission</th><th>Ermöglichter Befehl</th><th>Beschreibung</th>
</tr>
<tr>
<td>brewery.cmd.unlabel</td><td>UnLabel</td><td>Teile der Trankbeschriftung verstecken</td>
</tr>
<tr>
<td>brewery.cmd.info</td><td>Info</td><td>Informationen über die eigene Trunkenheit</td>
</tr>

View File

@ -15,14 +15,13 @@ import com.dre.brewery.BIngredients;
public class BCauldron {
public static CopyOnWriteArrayList<BCauldron> bcauldrons = new CopyOnWriteArrayList<BCauldron>();
private BIngredients ingredients;
private BIngredients ingredients = new BIngredients();
private Block block;
private int state;
private int state = 1;
private boolean someRemoved = false;
public BCauldron(Block block, Material ingredient) {
this.block = block;
this.state = 1;
this.ingredients = new BIngredients();
add(ingredient);
bcauldrons.add(this);
}
@ -41,11 +40,19 @@ public class BCauldron {
|| block.getRelative(BlockFace.DOWN).getType() == Material.LAVA) {
// add a minute to cooking time
state++;
if (someRemoved) {
ingredients = ingredients.clone();
someRemoved = false;
}
}
}
// add an ingredient to the cauldron
public void add(Material ingredient) {
if (someRemoved) {
ingredients = ingredients.clone();
someRemoved = false;
}
ingredients.add(ingredient);
block.getWorld().playEffect(block.getLocation(), Effect.EXTINGUISH, 0);
if (state > 1) {
@ -98,6 +105,8 @@ public class BCauldron {
if (block.getData() == 0) {
bcauldrons.remove(bcauldron);
} else {
bcauldron.someRemoved = true;
}
return true;
}
@ -154,7 +163,7 @@ public class BCauldron {
if (cauldron.state != 1) {
config.set(prefix + ".state", cauldron.state);
}
cauldron.ingredients.save(config.createSection(prefix + ".ingredients"));
config.set(prefix + ".ingredients", cauldron.ingredients.serializeIngredients());
id++;
}
}

View File

@ -17,29 +17,25 @@ public class BIngredients {
public static ArrayList<Material> possibleIngredients = new ArrayList<Material>();
public static ArrayList<BRecipe> recipes = new ArrayList<BRecipe>();
public static Map<Material, String> cookedNames = new HashMap<Material, String>();
private static int lastId = 0;
private int id;
private Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
private int cookedTime;
// Represents ingredients in Cauldron, Brew
// Init a new BIngredients
public BIngredients() {
this.id = lastId;
lastId++;
}
// Load from File
public BIngredients(Map<Material, Integer> ingredients, int cookedTime) {
this.ingredients = ingredients;
this.cookedTime = cookedTime;
}
//returns the recipe with the given name
public static BRecipe getRecipeByName(String name) {
for (BRecipe recipe : recipes) {
if (recipe.getName(5).equalsIgnoreCase(name)) {
return recipe;
}
}
return null;
this.id = lastId;
lastId++;
}
// Add an ingredient to this
@ -68,8 +64,8 @@ public class BIngredients {
if (cookRecipe != null) {
// Potion is best with cooking only
int quality = (int) Math.round((getIngredientQuality(cookRecipe) + getCookingQuality(cookRecipe, false)) / 2.0);
P.p.log("cooked potion has Quality: " + quality);
Brew brew = new Brew(uid, quality, cookRecipe, clone());
P.p.debugLog("cooked potion has Quality: " + quality);
Brew brew = new Brew(uid, quality, cookRecipe, this);
Brew.addOrReplaceEffects(potionMeta, brew.getEffects());
cookedName = cookRecipe.getName(quality);
@ -77,7 +73,7 @@ public class BIngredients {
} else {
// new base potion
new Brew(uid, clone());
new Brew(uid, this);
if (state <= 1) {
cookedName = "Schlammiger Sud";
@ -123,7 +119,7 @@ public class BIngredients {
// best recipe for current state of potion, STILL not always returns the
// correct one...
public BRecipe getBestRecipe(byte wood, float time, boolean distilled) {
public BRecipe getBestRecipe(float wood, float time, boolean distilled) {
float quality = 0;
int ingredientQuality = 0;
int cookingQuality = 0;
@ -134,13 +130,13 @@ public class BIngredients {
ingredientQuality = getIngredientQuality(recipe);
cookingQuality = getCookingQuality(recipe, distilled);
if (ingredientQuality > -1) {
if (recipe.needsToAge()) {
if (ingredientQuality > -1 && cookingQuality > -1) {
if (recipe.needsToAge() || time > 0.5) {
// needs riping in barrel
ageQuality = getAgeQuality(recipe, time);
woodQuality = getWoodQuality(recipe, wood);
P.p.log("Ingredient Quality: " + ingredientQuality + " Cooking Quality: " + cookingQuality + " Wood Quality: " + getWoodQuality(recipe, wood) +
" age Quality: " + getAgeQuality(recipe, time) + " for " + recipe.getName(5));
P.p.debugLog("Ingredient Quality: " + ingredientQuality + " Cooking Quality: " + cookingQuality +
" Wood Quality: " + woodQuality + " age Quality: " + ageQuality + " for " + recipe.getName(5));
// is this recipe better than the previous best?
if ((((float) ingredientQuality + cookingQuality + woodQuality + ageQuality) / 4) > quality) {
@ -148,7 +144,7 @@ public class BIngredients {
bestRecipe = recipe;
}
} else {
P.p.log("Ingredient Quality: " + ingredientQuality + " Cooking Quality: " + cookingQuality + " for " + recipe.getName(5));
P.p.debugLog("Ingredient Quality: " + ingredientQuality + " Cooking Quality: " + cookingQuality + " for " + recipe.getName(5));
// calculate quality without age and barrel
if ((((float) ingredientQuality + cookingQuality) / 2) > quality) {
quality = ((float) ingredientQuality + cookingQuality) / 2;
@ -158,7 +154,7 @@ public class BIngredients {
}
}
if (bestRecipe != null) {
P.p.log("best recipe: " + bestRecipe.getName(5) + " has Quality= " + quality);
P.p.debugLog("best recipe: " + bestRecipe.getName(5) + " has Quality= " + quality);
}
return bestRecipe;
}
@ -166,7 +162,7 @@ public class BIngredients {
// returns recipe that is cooking only and matches the ingredients and
// cooking time
public BRecipe getCookRecipe() {
BRecipe bestRecipe = getBestRecipe((byte) 0, 0, false);
BRecipe bestRecipe = getBestRecipe(0, 0, false);
// Check if best recipe is cooking only
if (bestRecipe != null) {
@ -179,8 +175,8 @@ public class BIngredients {
// returns the currently best matching recipe for distilling for the
// ingredients and cooking time
public BRecipe getdistillRecipe() {
BRecipe bestRecipe = getBestRecipe((byte) 0, 0, true);
public BRecipe getdistillRecipe(float wood, float time) {
BRecipe bestRecipe = getBestRecipe(wood, time, true);
// Check if best recipe needs to be destilled
if (bestRecipe != null) {
@ -193,7 +189,7 @@ public class BIngredients {
// returns currently best matching recipe for ingredients, cooking- and
// ageingtime
public BRecipe getAgeRecipe(byte wood, float time, boolean distilled) {
public BRecipe getAgeRecipe(float wood, float time, boolean distilled) {
BRecipe bestRecipe = getBestRecipe(wood, time, distilled);
if (bestRecipe != null) {
@ -226,7 +222,7 @@ public class BIngredients {
badStuff++;
if (badStuff < ingredients.size()) {
// when there are other ingredients
quality -= count * 2;
quality -= count * (recipe.getDifficulty() / 2);
continue;
} else {
// ingredients dont fit at all
@ -234,7 +230,7 @@ public class BIngredients {
}
}
// calculate the quality
quality -= (((float) Math.abs(count - recipe.amountOf(ingredient)) / recipe.allowedCountDiff(recipe.amountOf(ingredient))) * 10.0);
quality -= ((float) Math.abs(count - recipe.amountOf(ingredient)) / recipe.allowedCountDiff(recipe.amountOf(ingredient))) * 10.0;
}
if (quality >= 0) {
return Math.round(quality);
@ -245,14 +241,17 @@ public class BIngredients {
// returns the quality regarding the cooking-time conditioning given Recipe
public int getCookingQuality(BRecipe recipe, boolean distilled) {
if (!recipe.needsDistilling() == distilled) {
return 0;
return -1;
}
int quality = 10 - (int) Math.round(((float) Math.abs(cookedTime - recipe.getCookingTime()) / recipe.allowedTimeDiff(recipe.getCookingTime())) * 10.0);
if (quality > 0) {
if (quality >= 0) {
if (cookedTime <= 1) {
return 0;
}
return quality;
}
return 0;
return -1;
}
// returns pseudo quality of distilling. 0 if doesnt match the need of the recipes distilling
@ -264,12 +263,12 @@ public class BIngredients {
}
// returns the quality regarding the barrel wood conditioning given Recipe
public int getWoodQuality(BRecipe recipe, byte wood) {
if (recipe.getWood() == 0x8) {
public int getWoodQuality(BRecipe recipe, float wood) {
if (recipe.getWood() == 0) {
// type of wood doesnt matter
return 10;
}
int quality = 10 - (int) Math.round(recipe.getWoodDiff(wood) * recipe.getDifficulty());
int quality = 10 - Math.round(recipe.getWoodDiff(wood) * recipe.getDifficulty());
if (quality > 0) {
return quality;
@ -295,22 +294,23 @@ public class BIngredients {
return copy;
}
// saves data into ingredient section of Brew/BCauldron
public void save(ConfigurationSection config) {
// saves data into main Ingredient section. Returns the save id
public int save(ConfigurationSection config) {
String path = "Ingredients." + id;
if (cookedTime != 0) {
config.set("cookedTime", cookedTime);
config.set(path + ".cookedTime", cookedTime);
}
config.set(path + ".mats", serializeIngredients());
return id;
}
// convert the ingredient Material to id
// convert the ingredient Material to id
public Map<Integer, Integer> serializeIngredients() {
Map<Integer, Integer> mats = new HashMap<Integer, Integer>();
for (Material mat : ingredients.keySet()) {
mats.put(mat.getId(), ingredients.get(mat));
}
// list all Material ids with their amount
ConfigurationSection matSection = config.createSection("mats");
for (int id : mats.keySet()) {
matSection.set("" + id, mats.get(id));
}
return mats;
}
}

View File

@ -19,12 +19,13 @@ import com.dre.brewery.Brew;
public class BPlayer {
public static Map<String, BPlayer> players = new HashMap<String, BPlayer>();// Players name and BPlayer
public static Map<Material, Integer> drainItems = new HashMap<Material, Integer>();// DrainItem Material and Strength
private static Map<Player, Integer> pTasks = new HashMap<Player, Integer>();// Player and count
private static int taskId;
// Settings
private static int taskId;
public static Map<Material, Integer> drainItems = new HashMap<Material, Integer>();// DrainItem Material and Strength
public static int pukeItemId;
public static int hangoverTime;
public static boolean overdrinkKick;
public static boolean enableHome;
public static boolean enableLoginDisallow;
@ -72,8 +73,9 @@ public class BPlayer {
return org.bukkit.Bukkit.getPlayer(getPlayerName());
}*/
// returns the Player if online
public static Player getPlayer(String name) {
return org.bukkit.Bukkit.getPlayer(name);
return org.bukkit.Bukkit.getPlayerExact(name);
}
// returns true if drinking was successful
@ -92,19 +94,21 @@ public class BPlayer {
players.put(player.getName(), bPlayer);
}
bPlayer.drunkeness += brewAlc;
bPlayer.quality += brew.getQuality() * brewAlc;
if (brew.getQuality() > 0) {
bPlayer.quality += brew.getQuality() * brewAlc;
} else {
bPlayer.quality += brewAlc;
}
if (bPlayer.drunkeness <= 100) {
addBrewEffects(brew, player);
if (brew.getQuality() < 5) {
addQualityEffects(brew.getQuality(), brewAlc, player);
}
addQualityEffects(brew.getQuality(), brewAlc, player);
} else {
bPlayer.drinkCap(player);
}
P.p.msg(player, P.p.languageReader.get("Player_DrunkInfo", "" + bPlayer.getDrunkeness(), "" + bPlayer.getQuality()));
P.p.msg(player, "Du bist nun " + bPlayer.drunkeness + "% betrunken, mit einer Qualität von " + bPlayer.getQuality());
return true;
}
return false;
@ -140,7 +144,9 @@ public class BPlayer {
// drain the drunkeness by amount, returns true when player has to be removed
public boolean drain(String name, int amount) {
quality -= getQuality() * amount;
if (drunkeness > 0) {
quality -= getQuality() * amount;
}
drunkeness -= amount;
if (drunkeness > 0) {
if (offlineDrunk == 0) {
@ -148,8 +154,16 @@ public class BPlayer {
offlineDrunk = drunkeness;
}
}
} else if (drunkeness <= (-1) * offlineDrunk) {
return true;
} else {
if (offlineDrunk == 0) {
return true;
}
quality = getQuality();
if (drunkeness <= -offlineDrunk) {
if (drunkeness <= -hangoverTime) {
return true;
}
}
}
return false;
}
@ -195,6 +209,9 @@ public class BPlayer {
passedOut = true;
}
// #### Login ####
// can the player login or is he too drunk
public int canJoin() {
if (drunkeness <= 70) {
@ -267,6 +284,10 @@ public class BPlayer {
passedOut = false;
}
public void disconnecting() {
offlineDrunk = drunkeness;
}
public void goHome(final Player player) {
if (homeType != null) {
Location home = null;
@ -289,13 +310,8 @@ public class BPlayer {
}
}
public void hangoverEffects(final Player player) {
int duration = offlineDrunk * 50 * getHangoverQuality();
int amplifier = getHangoverQuality() / 3;
PotionEffectType.SLOW.createEffect(duration, amplifier).apply(player);
PotionEffectType.HUNGER.createEffect(duration, amplifier).apply(player);
}
// #### Puking ####
// Chance that players puke on big drunkeness
// runs every 6 sec, average chance is 10%, so should puke about every 60 sec
@ -357,6 +373,9 @@ public class BPlayer {
item.setPickupDelay(Integer.MAX_VALUE);
}
// #### Effects ####
public void drunkEffects(Player player) {
int duration = 10 - getQuality();
duration += drunkeness / 2;
@ -371,17 +390,30 @@ public class BPlayer {
public static void addQualityEffects(int quality, int brewAlc, Player player) {
int duration = 7 - quality;
duration *= 250;
PotionEffectType.BLINDNESS.createEffect(duration, 0).apply(player);
if (brewAlc > 15) {
duration = 10 - quality;
duration += brewAlc;
duration *= 40;
if (quality == 0) {
duration *= 500;
} else if (quality <= 5) {
duration *= 250;
} else {
duration = 200;
duration = 100;
if (brewAlc <= 10) {
duration = 0;
}
}
if (duration > 0) {
PotionEffectType.POISON.createEffect(duration, 0).apply(player);
}
if (brewAlc > 10) {
if (quality <= 5) {
duration = 10 - quality;
duration += brewAlc;
duration *= 60;
} else {
duration = 120;
}
PotionEffectType.BLINDNESS.createEffect(duration, 0).apply(player);
}
PotionEffectType.POISON.createEffect(duration, 0).apply(player);
}
public static void addBrewEffects(Brew brew, Player player) {
@ -394,7 +426,8 @@ public class BPlayer {
if (type.isInstant()) {
type.createEffect(0, duration - 1).apply(player);
} else {
int amplifier = brew.getQuality() / 3;
int amplifier = brew.getQuality() / 4;
duration /= type.getDurationModifier();
type.createEffect(duration * 20, amplifier).apply(player);
}
}
@ -402,9 +435,21 @@ public class BPlayer {
}
}
public void hangoverEffects(final Player player) {
int duration = offlineDrunk * 50 * getHangoverQuality();
int amplifier = getHangoverQuality() / 3;
PotionEffectType.SLOW.createEffect(duration, amplifier).apply(player);
PotionEffectType.HUNGER.createEffect(duration, amplifier).apply(player);
}
// #### Sheduled ####
public static void drunkeness() {
for (String name : players.keySet()) {
BPlayer bplayer = players.get(name);
for (Map.Entry<String, BPlayer> entry : players.entrySet()) {
String name = entry.getKey();
BPlayer bplayer = entry.getValue();
if (bplayer.drunkeness > 30) {
if (bplayer.offlineDrunk == 0) {
@ -427,7 +472,8 @@ public class BPlayer {
public static void onUpdate() {
if (!players.isEmpty()) {
int soberPerMin = 2;
for (Iterator<Map.Entry<String, BPlayer>> iter = players.entrySet().iterator(); iter.hasNext();) {
Iterator<Map.Entry<String, BPlayer>> iter = players.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, BPlayer> entry = iter.next();
String name = entry.getKey();
BPlayer bplayer = entry.getValue();
@ -457,7 +503,9 @@ public class BPlayer {
}
}
// getter
// #### getter/setter ####
public int getDrunkeness() {
return drunkeness;
}
@ -480,16 +528,18 @@ public class BPlayer {
P.p.errorLog("drunkeness should not be 0!");
return quality;
}
if (drunkeness < 0) {
return quality;
}
return Math.round(quality / drunkeness);
}
// opposite of quality
public int getHangoverQuality() {
return -getQuality() + 10;
}
public int getHangoverProgress() {
return offlineDrunk + drunkeness;
if (drunkeness < 0) {
return quality + 11;
}
return -getQuality() + 11;
}
}

View File

@ -13,7 +13,7 @@ public class BRecipe {
private Map<Material, Integer> ingredients = new HashMap<Material, Integer>();// material and amount
private int cookingTime;// time to cook in cauldron
private int distillruns;// runs through the brewer
private int wood;// type of wood the barrel has to consist of
private byte wood;// type of wood the barrel has to consist of
private int age;// time in minecraft days for the potions to age in barrels
private String color;// color of the destilled/finished potion
private int difficulty;// difficulty to brew the potion, how exact the instruction has to be followed
@ -21,22 +21,39 @@ public class BRecipe {
private Map<String, Integer> effects = new HashMap<String, Integer>(); // Special Effect, Duration
public BRecipe(ConfigurationSection configSectionRecipes, String recipeId) {
String[] name = configSectionRecipes.getString(recipeId + ".name").split("/");
if (name.length > 2) {
this.name = name;
String nameList = configSectionRecipes.getString(recipeId + ".name");
if (nameList != null) {
String[] name = nameList.split("/");
if (name.length > 2) {
this.name = name;
} else {
this.name = new String[1];
this.name[0] = name[0];
}
} else {
this.name = new String[1];
this.name[0] = name[0];
return;
}
List<String> ingredientsList = configSectionRecipes.getStringList(recipeId + ".ingredients");
for (String item : ingredientsList) {
String[] ingredParts = item.split("/");
ingredParts[0] = ingredParts[0].toUpperCase();
this.ingredients.put(Material.getMaterial(ingredParts[0]), P.p.parseInt(ingredParts[1]));
if (ingredientsList != null) {
for (String item : ingredientsList) {
String[] ingredParts = item.split("/");
if (ingredParts.length == 2) {
Material mat = Material.matchMaterial(ingredParts[0]);
if (mat != null) {
this.ingredients.put(Material.matchMaterial(ingredParts[0]), P.p.parseInt(ingredParts[1]));
} else {
P.p.errorLog("Unbekanntes Material: " + ingredParts[0]);
this.ingredients = null;
return;
}
} else {
return;
}
}
}
this.cookingTime = configSectionRecipes.getInt(recipeId + ".cookingtime");
this.distillruns = configSectionRecipes.getInt(recipeId + ".distillruns");
this.wood = configSectionRecipes.getInt(recipeId + ".wood");
this.wood = (byte) configSectionRecipes.getInt(recipeId + ".wood");
this.age = configSectionRecipes.getInt(recipeId + ".age");
this.color = configSectionRecipes.getString(recipeId + ".color");
this.difficulty = configSectionRecipes.getInt(recipeId + ".difficulty");
@ -47,7 +64,11 @@ public class BRecipe {
for (String effectString : effectStringList) {
String[] effectSplit = effectString.split("/");
String effect = effectSplit[0];
if (effect.equalsIgnoreCase("WEAKNESS") || effect.equalsIgnoreCase("INCREASE_DAMAGE") || effect.equalsIgnoreCase("SLOW") || effect.equalsIgnoreCase("SPEED") || effect.equalsIgnoreCase("REGERATION")) {
if (effect.equalsIgnoreCase("WEAKNESS") ||
effect.equalsIgnoreCase("INCREASE_DAMAGE") ||
effect.equalsIgnoreCase("SLOW") ||
effect.equalsIgnoreCase("SPEED") ||
effect.equalsIgnoreCase("REGENERATION")) {
// hide these effects as they put crap into lore
effect = effect + "X";
}
@ -62,6 +83,9 @@ public class BRecipe {
// allowed deviation to the recipes count of ingredients at the given difficulty
public int allowedCountDiff(int count) {
if (count < 8) {
count = 8;
}
int allowedCountDiff = Math.round((float) ((11.0 - difficulty) * (count / 10.0)));
if (allowedCountDiff == 0) {
@ -72,11 +96,11 @@ public class BRecipe {
// allowed deviation to the recipes cooking-time at the given difficulty
public int allowedTimeDiff(int time) {
if (time < 8) {
time = 8;
}
int allowedTimeDiff = Math.round((float) ((11.0 - difficulty) * (time / 10.0)));
while (allowedTimeDiff >= time) {
allowedTimeDiff -= 1;
}
if (allowedTimeDiff == 0) {
return 1;
}
@ -84,18 +108,8 @@ public class BRecipe {
}
// difference between given and recipe-wanted woodtype
public float getWoodDiff(byte wood) {
int woodType = 0;
if (wood == 0x0) {
woodType = 2;
} else if (wood == 0x1) {
woodType = 4;
} else if (wood == 0x2) {
woodType = 1;
} else if (wood == 0x3) {
woodType = 3;
}
return Math.abs(woodType - wood);
public float getWoodDiff(float wood) {
return Math.abs(wood - this.wood);
}
public boolean isCookingOnly() {
@ -132,6 +146,11 @@ public class BRecipe {
return false;
}
// true if name and ingredients are correct
public boolean isValid() {
return (name != null && ingredients != null && !ingredients.isEmpty());
}
// Getter
@ -167,21 +186,15 @@ public class BRecipe {
}
public String getColor() {
return color.toUpperCase();
if (color != null) {
return color.toUpperCase();
}
return "BLUE";
}
// get the woodtype in blockData-byte
// get the woodtype
public byte getWood() {
if (wood == 1) {
return 0x2;
} else if (wood == 2) {
return 0x0;
} else if (wood == 3) {
return 0x3;
} else if (wood == 4) {
return 0x1;
}
return 0x8;
return wood;
}
public float getAge() {

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import org.bukkit.block.Block;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.configuration.ConfigurationSection;
public class Barrel {
@ -75,23 +76,25 @@ public class Barrel {
inventory = org.bukkit.Bukkit.createInventory(null, 9, "Fass");
}
} else {
// if nobody has the inventory opened
if (inventory.getViewers().isEmpty()) {
// if inventory contains potions
if (inventory.contains(373)) {
long loadTime = System.nanoTime();
for (ItemStack item : inventory.getContents()) {
if (item != null) {
if (item.getTypeId() == 373) {
if (item.hasItemMeta()) {
Brew.age(item, time, getWood());
if (time > 0) {
// if nobody has the inventory opened
if (inventory.getViewers().isEmpty()) {
// if inventory contains potions
if (inventory.contains(373)) {
byte wood = getWood();
long loadTime = System.nanoTime();
for (ItemStack item : inventory.getContents()) {
if (item != null) {
Brew brew = Brew.get(item);
if (brew != null) {
brew.age(item, time, wood);
}
}
}
loadTime = System.nanoTime() - loadTime;
float ftime = (float) (loadTime / 1000000.0);
P.p.debugLog("opening Barrel with potions (" + ftime + "ms)");
}
loadTime = System.nanoTime() - loadTime;
float ftime = (float) (loadTime / 1000000.0);
P.p.log("opening Barrel with potions (" + ftime + "ms)");
}
}
}
@ -129,9 +132,15 @@ public class Barrel {
ItemStack[] items = inventory.getContents();
for (ItemStack item : items) {
if (item != null) {
if (item.getTypeId() == 373) {
Brew brew = Brew.get(item);
if (brew != null) {
// Brew before throwing
Brew.age(item, time, getWood());
brew.age(item, time, getWood());
PotionMeta meta = (PotionMeta) item.getItemMeta();
if (Brew.hasColorLore(meta)) {
brew.convertLore(meta, false);
item.setItemMeta(meta);
}
}
// "broken" is the block that destroyed, throw them there!
if (broken != null) {
@ -275,19 +284,28 @@ public class Barrel {
wood = this.spigot.getRelative(0, 0, -1);
}
if (wood.getTypeId() == 5) {
return wood.getData();
byte data = wood.getData();
if (data == 0x0) {
return 2;
} else if (data == 0x1) {
return 4;
} else if (data == 0x2) {
return 1;
} else {
return 3;
}
}
if (wood.getTypeId() == 53) {
return 0x0;
return 2;
}
if (wood.getTypeId() == 134) {
return 0x1;
return 4;
}
if (wood.getTypeId() == 135) {
return 0x2;
return 1;
}
if (wood.getTypeId() == 136) {
return 0x3;
return 3;
}
return 0;
}
@ -357,7 +375,6 @@ public class Barrel {
int x = startX;
int y = 0;
int z = startZ;
// P.p.log("startX="+startX+" startZ="+startZ+" endX="+endX+" endZ="+endZ+" direction="+direction);
while (y <= 1) {
while (x <= endX) {
while (z <= endZ) {
@ -423,12 +440,10 @@ public class Barrel {
int x = startX;
int y = 0;
int z = startZ;
// P.p.log("startX="+startX+" startZ="+startZ+" endX="+endX+" endZ="+endZ+" direction="+direction);
while (y <= 2) {
while (x <= endX) {
while (z <= endZ) {
typeId = spigot.getRelative(x, y, z).getTypeId();
// spigot.getRelative(x,y,z).setTypeId(1);
if (direction == 1 || direction == 2) {
if (y == 1 && z == 0) {
if (x == -2 || x == -3 || x == 2 || x == 3) {

View File

@ -22,13 +22,13 @@ public class Brew {
public static Boolean colorInBarrels; // color the Lore while in Barrels
public static Boolean colorInBrewer; // color the Lore while in Brewer
//public static Map<ItemStack, List<String>> oldLore = new HashMap<ItemStack, List<String>>();
private BIngredients ingredients;
private int quality;
private int distillRuns;
private float ageTime;
private float wood;
private BRecipe currentRecipe;
private boolean unlabeled;
public Brew(int uid, BIngredients ingredients) {
this.ingredients = ingredients;
@ -44,13 +44,15 @@ public class Brew {
}
// loading from file
public Brew(int uid, BIngredients ingredients, int quality, int distillRuns, float ageTime, String recipe) {
public Brew(int uid, BIngredients ingredients, int quality, int distillRuns, float ageTime, float wood, String recipe, Boolean unlabeled) {
potions.put(uid, this);
this.ingredients = ingredients;
this.quality = quality;
this.distillRuns = distillRuns;
this.ageTime = ageTime;
this.currentRecipe = BIngredients.getRecipeByName(recipe);
potions.put(uid, this);
this.wood = wood;
this.unlabeled = unlabeled;
setRecipeFromString(recipe);
}
// returns a Brew by its UID
@ -116,6 +118,37 @@ public class Brew {
return uid;
}
//returns the recipe with the given name, recalculates if not found
public boolean setRecipeFromString(String name) {
currentRecipe = null;
if (name != null && !name.equals("")) {
for (BRecipe recipe : BIngredients.recipes) {
if (recipe.getName(5).equalsIgnoreCase(name)) {
currentRecipe = recipe;
return true;
}
}
if (quality > 0) {
currentRecipe = ingredients.getBestRecipe(wood, ageTime, distillRuns > 0);
if (currentRecipe != null) {
this.quality = calcQuality();
P.p.log("Brew was made from Recipe: '" + name + "' which could not be found. '" + currentRecipe.getName(5) + "' used instead!");
return true;
} else {
P.p.errorLog("Brew was made from Recipe: '" + name + "' which could not be found!");
}
}
}
return false;
}
public boolean reloadRecipe() {
if (currentRecipe != null) {
return setRecipeFromString(currentRecipe.getName(5));
}
return true;
}
// Copy a Brew with a new unique ID and return its item
public ItemStack copy(ItemStack item) {
@ -133,36 +166,62 @@ public class Brew {
Brew brew = new Brew(uid, quality, currentRecipe, ingredients);
brew.distillRuns = distillRuns;
brew.ageTime = ageTime;
brew.unlabeled = unlabeled;
return brew;
}
// calculate alcohol from recipe
public int calcAlcohol() {
if (quality == 0) {
// Give bad potions some alc
int badAlc = 0;
if (distillRuns > 1) {
badAlc = distillRuns;
}
if (ageTime > 10) {
badAlc += 5;
} else if (ageTime > 2) {
badAlc += 3;
}
if (currentRecipe != null) {
return badAlc;
} else {
return badAlc / 2;
}
}
if (currentRecipe != null) {
int alc = currentRecipe.getAlcohol();
alc *= ((float) quality / 10.0);
if (currentRecipe.needsDistilling()) {
// distillable Potions should have full alc after 6 distills
float factor = 1.4F / (distillRuns + 1);
factor += 0.8;
alc /= factor;
if (distillRuns == 0) {
return 0;
}
// bad quality can decrease alc by up to 40%
alc *= 1 - ((float) (10 - quality) * 0.04);
// distillable Potions should have half alc after one and full alc after all needed distills
alc /= 2;
alc *= 1.0F + ((float) distillRuns / currentRecipe.getDistillRuns()) ;
} else {
// quality decides 10% - 100%
alc *= ((float) quality / 10.0);
}
if (alc > 0) {
return alc;
}
return alc;
}
return 0;
}
// calculating quality
public int calcQuality(BRecipe recipe, byte wood, boolean distilled) {
public int calcQuality() {
// calculate quality from all of the factors
float quality = (
ingredients.getIngredientQuality(recipe) +
ingredients.getCookingQuality(recipe, distilled) +
ingredients.getWoodQuality(recipe, wood) +
ingredients.getAgeQuality(recipe, ageTime));
quality /= 4;
float quality = ingredients.getIngredientQuality(currentRecipe) + ingredients.getCookingQuality(currentRecipe, distillRuns > 0);
if (currentRecipe.needsToAge() || ageTime > 0.5) {
quality += ingredients.getWoodQuality(currentRecipe, wood) + ingredients.getAgeQuality(currentRecipe, ageTime);
quality /= 4;
} else {
quality /= 2;
}
return (int) Math.round(quality);
}
@ -171,24 +230,37 @@ public class Brew {
}
public boolean canDistill() {
if (distillRuns >= 6) {
if (currentRecipe != null) {
return currentRecipe.getDistillRuns() > distillRuns;
} else if (distillRuns >= 6) {
return false;
} else {
if (currentRecipe != null) {
return currentRecipe.needsDistilling();
}
}
return true;
}
// return special effect
public Map<String, Integer> getEffects() {
if (currentRecipe != null) {
if (currentRecipe != null && quality > 0) {
return currentRecipe.getEffects();
}
return null;
}
// Set unlabeled to true to hide the numbers in Lore
public void unLabel(ItemStack item) {
PotionMeta meta = (PotionMeta) item.getItemMeta();
if (meta.hasLore()) {
if (distillRuns > 0) {
addOrReplaceLore(meta, P.p.color("&7"), "Destilliert");
}
if (ageTime >= 1) {
addOrReplaceLore(meta, P.p.color("&7"), "Fassgereift");
}
item.setItemMeta(meta);
}
unlabeled = true;
}
// Distilling section ---------------
// distill all custom potions in the brewer
@ -196,103 +268,118 @@ public class Brew {
int slot = 0;
while (slot < 3) {
if (contents[slot]) {
distillSlot(inv, slot);
ItemStack slotItem = inv.getItem(slot);
PotionMeta potionMeta = (PotionMeta) slotItem.getItemMeta();
Brew brew = get(potionMeta);
brew.distillSlot(slotItem, potionMeta);
}
slot++;
}
}
// distill custom potion in given slot
public static void distillSlot(BrewerInventory inv, int slot) {
ItemStack slotItem = inv.getItem(slot);
PotionMeta potionMeta = (PotionMeta) slotItem.getItemMeta();
Brew brew = get(potionMeta);
BRecipe recipe = brew.ingredients.getdistillRecipe();
public void distillSlot(ItemStack slotItem, PotionMeta potionMeta) {
distillRuns += 1;
BRecipe recipe = ingredients.getdistillRecipe(wood, ageTime);
if (recipe != null) {
// distillRuns will have an effect on the amount of alcohol, not the quality
brew.quality = brew.calcQuality(recipe, (byte) 0, true);
brew.distillRuns += 1;
brew.currentRecipe = recipe;
currentRecipe = recipe;
quality = calcQuality();
// Distill Lore
if (colorInBrewer != hasColorLore(potionMeta)) {
brew.convertLore(potionMeta, colorInBrewer);
} else {
String prefix = P.p.color("&7");
if (colorInBrewer) {
prefix = getQualityColor(brew.ingredients.getDistillQuality(recipe, brew.distillRuns));
}
brew.updateDistillLore(prefix, potionMeta);
}
addOrReplaceEffects(potionMeta, brew.getEffects());
P.p.log("destilled " + recipe.getName(5) + " has Quality: " + brew.quality + ", alc: " + brew.calcAlcohol());
potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(brew.quality)));
// if the potion should be further distillable
if (recipe.getDistillRuns() > 1 && brew.distillRuns <= 5) {
slotItem.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(true));
} else {
slotItem.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(false));
}
addOrReplaceEffects(potionMeta, getEffects());
potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(quality)));
slotItem.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill()));
} else {
quality = 0;
potionMeta.setDisplayName(P.p.color("&f" + "Undefinierbares Destillat"));
slotItem.setDurability(PotionColor.GREY.getColorId(brew.distillRuns <= 5));
slotItem.setDurability(PotionColor.GREY.getColorId(canDistill()));
}
// Distill Lore
if (currentRecipe != null) {
if (colorInBrewer != hasColorLore(potionMeta)) {
convertLore(potionMeta, colorInBrewer);
}
}
String prefix = P.p.color("&7");
if (colorInBrewer && currentRecipe != null) {
prefix = getQualityColor(ingredients.getDistillQuality(recipe, distillRuns));
}
updateDistillLore(prefix, potionMeta);
slotItem.setItemMeta(potionMeta);
}
// Ageing Section ------------------
public static void age(ItemStack item, float time, byte wood) {
public void age(ItemStack item, float time, byte woodType) {
PotionMeta potionMeta = (PotionMeta) item.getItemMeta();
Brew brew = get(potionMeta);
if (brew != null) {
brew.ageTime += time;
// if younger than half a day, it shouldnt get aged form
if (brew.ageTime > 0.5) {
BRecipe recipe = brew.ingredients.getAgeRecipe(wood, brew.ageTime, brew.distillRuns > 0);
if (recipe != null) {
brew.quality = brew.calcQuality(recipe, wood, brew.distillRuns > 0);
brew.currentRecipe = recipe;
P.p.log("Final " + recipe.getName(5) + " has Quality: " + brew.quality);
potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(brew.quality)));
item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(false));
}
}
// Lore
if (colorInBarrels != hasColorLore(potionMeta)) {
brew.convertLore(potionMeta, colorInBarrels);
ageTime += time;
// if younger than half a day, it shouldnt get aged form
if (ageTime > 0.5) {
if (wood == 0) {
wood = woodType;
} else {
if (brew.ageTime >= 1) {
String prefix = P.p.color("&7");
if (colorInBarrels) {
prefix = getQualityColor(brew.ingredients.getAgeQuality(brew.currentRecipe, brew.ageTime));
}
brew.updateAgeLore(prefix, potionMeta);
addOrReplaceEffects(potionMeta, brew.getEffects());
if (wood != woodType) {
woodShift(time, woodType);
}
}
item.setItemMeta(potionMeta);
BRecipe recipe = ingredients.getAgeRecipe(wood, ageTime, distillRuns > 0);
if (recipe != null) {
currentRecipe = recipe;
quality = calcQuality();
addOrReplaceEffects(potionMeta, getEffects());
potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(quality)));
item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill()));
} else {
quality = 0;
potionMeta.setDisplayName(P.p.color("&f" + "Verdorbenes Getränk"));
item.setDurability(PotionColor.GREY.getColorId(canDistill()));
}
}
// Lore
if (currentRecipe != null) {
if (colorInBarrels != hasColorLore(potionMeta)) {
convertLore(potionMeta, colorInBarrels);
}
}
if (ageTime >= 1) {
String prefix = P.p.color("&7");
if (colorInBarrels && currentRecipe != null) {
prefix = getQualityColor(ingredients.getAgeQuality(currentRecipe, ageTime));
}
updateAgeLore(prefix, potionMeta);
}
if (ageTime > 0.5) {
if (colorInBarrels && !unlabeled && currentRecipe != null) {
updateWoodLore(potionMeta);
}
}
item.setItemMeta(potionMeta);
}
public static void addOrReplaceEffects(PotionMeta meta, Map<String, Integer> effects) {
if (effects != null) {
for (Map.Entry<String, Integer> entry : effects.entrySet()) {
if (!entry.getKey().endsWith("X")) {
PotionEffectType type = PotionEffectType.getByName(entry.getKey());
if (type != null) {
meta.addCustomEffect(type.createEffect(0, 0), true);
}
}
// Slowly shift the wood of the Brew to the new Type
public void woodShift(float time, byte to) {
byte factor = 1;
if (ageTime > 5) {
factor = 2;
} else if (ageTime > 10) {
factor = 2;
factor += Math.round(ageTime / 10);
}
if (wood > to) {
wood -= time / factor;
if (wood < to) {
wood = to;
}
} else {
wood += time / factor;
if (wood > to) {
wood = to;
}
}
}
@ -303,17 +390,13 @@ public class Brew {
if (currentRecipe == null) {
return;
}
if (meta == null) {
P.p.log("has no meta");
return;
}
meta.setLore(null);
// Ingredients
int quality;
String prefix = P.p.color("&7");
String lore;
if (toQuality) {
// Ingredients
if (toQuality && !unlabeled) {
quality = ingredients.getIngredientQuality(currentRecipe);
prefix = getQualityColor(quality);
lore = "Zutaten";
@ -321,7 +404,7 @@ public class Brew {
}
// Cooking
if (toQuality) {
if (toQuality && !unlabeled) {
if (distillRuns > 0 == currentRecipe.needsDistilling()) {
quality = ingredients.getCookingQuality(currentRecipe, distillRuns > 0);
prefix = getQualityColor(quality) + ingredients.getCookedTime() + " minute";
@ -350,26 +433,54 @@ public class Brew {
}
updateAgeLore(prefix, meta);
}
// WoodType
if (toQuality && !unlabeled) {
if (ageTime > 0.5) {
updateWoodLore(meta);
}
}
}
// sets the DistillLore. Prefix is the color to be used
public void updateDistillLore(String prefix, PotionMeta meta) {
if (distillRuns > 1) {
prefix = prefix + distillRuns + "-fach ";
if (!unlabeled) {
if (distillRuns > 1) {
prefix = prefix + distillRuns + "-fach ";
}
}
addOrReplaceLore(meta, prefix, "destilliert");
addOrReplaceLore(meta, prefix, "Destilliert");
}
// sets the AgeLore. Prefix is the color to be used
public void updateAgeLore(String prefix, PotionMeta meta) {
if (ageTime >= 1 && ageTime < 2) {
prefix = prefix + "Ein Jahr";
} else if (ageTime < 201) {
prefix = prefix + (int) Math.floor(ageTime) + " Jahre";
} else {
prefix = prefix + "Hunderte Jahre";
if (!unlabeled) {
if (ageTime >= 1 && ageTime < 2) {
prefix = prefix + "Ein Jahr ";
} else if (ageTime < 201) {
prefix = prefix + (int) Math.floor(ageTime) + " Jahre ";
} else {
prefix = prefix + "Hunderte Jahre ";
}
}
addOrReplaceLore(meta, prefix, "Fassgereift");
}
// updates/sets the color on WoodLore
public void updateWoodLore(PotionMeta meta) {
if (currentRecipe.getWood() > 0) {
int quality = ingredients.getWoodQuality(currentRecipe, wood);
addOrReplaceLore(meta, getQualityColor(quality), "Holzart");
} else {
if (meta.hasLore()) {
List<String> existingLore = meta.getLore();
int index = indexOfSubstring(existingLore, "Holzart");
if (index > -1) {
existingLore.remove(index);
meta.setLore(existingLore);
}
}
}
addOrReplaceLore(meta, prefix, " Fassgereift");
}
// Adds or replaces a line of Lore. Searches for Substring lore and replaces it
@ -391,6 +502,20 @@ public class Brew {
meta.setLore(newLore);
}
// Adds the Effect names to the Items description
public static void addOrReplaceEffects(PotionMeta meta, Map<String, Integer> effects) {
if (effects != null) {
for (Map.Entry<String, Integer> entry : effects.entrySet()) {
if (!entry.getKey().endsWith("X")) {
PotionEffectType type = PotionEffectType.getByName(entry.getKey());
if (type != null) {
meta.addCustomEffect(type.createEffect(0, 0), true);
}
}
}
}
}
// Returns the Index of a String from the list that contains this substring
public static int indexOfSubstring(List<String> list, String substring) {
for (int index = 0; index < list.size(); index++) {
@ -429,9 +554,10 @@ public class Brew {
// Saves all data
public static void save(ConfigurationSection config) {
for (int uid : potions.keySet()) {
for (Map.Entry<Integer, Brew> entry : potions.entrySet()) {
int uid = entry.getKey();
Brew brew = entry.getValue();
ConfigurationSection idConfig = config.createSection("" + uid);
Brew brew = potions.get(uid);
// not saving unneccessary data
if (brew.quality != 0) {
idConfig.set("quality", brew.quality);
@ -442,11 +568,17 @@ public class Brew {
if (brew.ageTime != 0) {
idConfig.set("ageTime", brew.ageTime);
}
if (brew.wood != -1) {
idConfig.set("wood", brew.wood);
}
if (brew.currentRecipe != null) {
idConfig.set("recipe", brew.currentRecipe.getName(5));
}
if (brew.unlabeled) {
idConfig.set("unlabeled", true);
}
// save the ingredients
brew.ingredients.save(idConfig.createSection("ingredients"));
idConfig.set("ingId", brew.ingredients.save(config.getParent()));
}
}

View File

@ -61,6 +61,7 @@ public class LanguageReader {
defaults.put("CMD_Player_Error", "&cDie Qualität muss zwischen 1 und 10 liegen!");
defaults.put("CMD_Info_NotDrunk", "&v1 ist nicht betrunken");
defaults.put("CMD_Info_Drunk", "&v1 ist &6&v2% &fbetrunken, mit einer Qualität von &6&v1");
defaults.put("CMD_UnLabel", "&aDas Label wurde entfernt");
defaults.put("CMD_Copy_Error", "&6&v1 &cTränke haben nicht mehr in das Inventar gepasst");
/* Error */
@ -74,6 +75,7 @@ public class LanguageReader {
defaults.put("Help_Help", "&6/br help <Seite> &9Zeigt eine bestimmte Hilfeseite an");
defaults.put("Help_Player", "&6/br <Spieler> <%Trunkenheit> <Qualität>&9 Setzt Trunkenheit (und Qualität) eines Spielers");
defaults.put("Help_Info", "&6/br Info&9 Zeigt deine aktuelle Trunkenheit und Qualität an");
defaults.put("Help_UnLabel", "&6/br UnLabel &9Entfernt die genaue Beschriftung des Trankes");
defaults.put("Help_Copy", "&6/br Copy <Anzahl>&9 Kopiert den Trank in deiner Hand");
defaults.put("Help_Delete", "&6/br Delete &9Entfernt den Trank in deiner Hand");
defaults.put("Help_InfoOther", "&6/br Info <Spieler>&9 Zeigt die aktuelle Trunkenheit und Qualität von <Spieler> an");

View File

@ -30,6 +30,7 @@ import com.dre.brewery.listeners.*;
public class P extends JavaPlugin {
public static P p;
public static boolean debug;
public static int lastBackup = 0;
public static int lastSave = 1;
public static int autosave = 3;
@ -105,7 +106,7 @@ public class P extends JavaPlugin {
this.log(this.getDescription().getName() + " disabled!");
}
public void reload() {
public void reload(CommandSender sender) {
BIngredients.possibleIngredients.clear();
BIngredients.recipes.clear();
BIngredients.cookedNames.clear();
@ -113,6 +114,16 @@ public class P extends JavaPlugin {
BPlayer.drainItems.clear();
readConfig();
Boolean successful = true;
for (Brew brew : Brew.potions.values()) {
if (!brew.reloadRecipe()) {
successful = false;
}
}
if (!successful) {
msg(sender, "&cEs konnten nicht alle Rezepte wiederhergesellt werden: Siehe Serverlog!");
}
}
public void msg(CommandSender sender, String msg) {
@ -123,6 +134,12 @@ public class P extends JavaPlugin {
this.msg(Bukkit.getConsoleSender(), msg);
}
public void debugLog(String msg) {
if (debug) {
this.msg(Bukkit.getConsoleSender(), "&2[Debug] &f" + msg);
}
}
public void errorLog(String msg) {
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_GREEN + "[Brewery] " + ChatColor.DARK_RED + "ERROR: " + ChatColor.RED + msg);
}
@ -144,7 +161,9 @@ public class P extends JavaPlugin {
// various Settings
autosave = config.getInt("autosave", 3);
debug = config.getBoolean("debug", false);
BPlayer.pukeItemId = Material.matchMaterial(config.getString("pukeItem", "SOUL_SAND")).getId();
BPlayer.hangoverTime = config.getInt("hangoverDays", 0) * 24 * 60;
BPlayer.overdrinkKick = config.getBoolean("enableKickOnOverdrink", false);
BPlayer.enableHome = config.getBoolean("enableHome", false);
BPlayer.enableLoginDisallow = config.getBoolean("enableLoginDisallow", false);
@ -157,7 +176,12 @@ public class P extends JavaPlugin {
ConfigurationSection configSection = config.getConfigurationSection("recipes");
if (configSection != null) {
for (String recipeId : configSection.getKeys(false)) {
BIngredients.recipes.add(new BRecipe(configSection, recipeId));
BRecipe recipe = new BRecipe(configSection, recipeId);
if (recipe.isValid()) {
BIngredients.recipes.add(recipe);
} else {
errorLog("Laden des Rezeptes mit id: '" + recipeId + "' fehlgeschlagen!");
}
}
}
@ -166,8 +190,12 @@ public class P extends JavaPlugin {
if (configSection != null) {
for (String ingredient : configSection.getKeys(false)) {
Material mat = Material.matchMaterial(ingredient);
BIngredients.cookedNames.put(mat, (configSection.getString(ingredient, null)));
BIngredients.possibleIngredients.add(mat);
if (mat != null) {
BIngredients.cookedNames.put(mat, (configSection.getString(ingredient, null)));
BIngredients.possibleIngredients.add(mat);
} else {
errorLog("Unbekanntes Material: " + ingredient);
}
}
}
@ -197,18 +225,40 @@ public class P extends JavaPlugin {
FileConfiguration data = YamlConfiguration.loadConfiguration(file);
// loading Ingredients into ingMap
Map<String, BIngredients> ingMap = new HashMap<String, BIngredients>();
ConfigurationSection section = data.getConfigurationSection("Ingredients");
if (section != null) {
for (String id : section.getKeys(false)) {
ConfigurationSection matSection = section.getConfigurationSection(id + ".mats");
if (matSection != null) {
// matSection has all the materials + amount as Integers
Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
for (String ingredient : matSection.getKeys(false)) {
// convert to Material
ingredients.put(Material.getMaterial(parseInt(ingredient)), matSection.getInt(ingredient));
}
ingMap.put(id, new BIngredients(ingredients, section.getInt(id + ".cookedTime", 0)));
} else {
errorLog("Ingredient id: '" + id + "' incomplete in data.yml");
}
}
}
// loading Brew
ConfigurationSection section = data.getConfigurationSection("Brew");
section = data.getConfigurationSection("Brew");
if (section != null) {
// All sections have the UID as name
for (String uid : section.getKeys(false)) {
BIngredients ingredients = loadIngredients(section.getConfigurationSection(uid + ".ingredients"));
BIngredients ingredients = getIngredients(ingMap, section.getString(uid + ".ingId"));
int quality = section.getInt(uid + ".quality", 0);
int distillRuns = section.getInt(uid + ".distillRuns", 0);
float ageTime = (float) section.getDouble(uid + ".ageTime", 0.0);
float wood = (float) section.getDouble(uid + ".wood", -1.0);
String recipe = section.getString(uid + ".recipe", null);
Boolean unlabeled = section.getBoolean(uid + ".unlabeled", false);
new Brew(parseInt(uid), ingredients, quality, distillRuns, ageTime, recipe);
new Brew(parseInt(uid), ingredients, quality, distillRuns, ageTime, wood, recipe, unlabeled);
}
}
@ -239,21 +289,30 @@ public class P extends JavaPlugin {
}
}
// loads BIngredients from ingredient section
public BIngredients loadIngredients(ConfigurationSection config) {
if (config != null) {
ConfigurationSection matSection = config.getConfigurationSection("mats");
if (matSection != null) {
// matSection has all the materials + amount in Integer form
Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
for (String ingredient : matSection.getKeys(false)) {
// convert to Material
ingredients.put(Material.getMaterial(parseInt(ingredient)), matSection.getInt(ingredient));
}
return new BIngredients(ingredients, config.getInt("cookedTime", 0));
// returns Ingredients by id from the specified ingMap
public BIngredients getIngredients(Map<String, BIngredients> ingMap, String id) {
if (!ingMap.isEmpty()) {
if (ingMap.containsKey(id)) {
return ingMap.get(id);
}
}
errorLog("Ingredient section not found or incomplete in data.yml");
errorLog("Ingredient id: '" + id + "' not found in data.yml");
return new BIngredients();
}
// loads BIngredients from an ingredient section
public BIngredients loadIngredients(ConfigurationSection section) {
if (section != null) {
// has all the materials + amount as Integers
Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
for (String ingredient : section.getKeys(false)) {
// convert to Material
ingredients.put(Material.getMaterial(parseInt(ingredient)), section.getInt(ingredient));
}
return new BIngredients(ingredients, 0);
} else {
errorLog("Cauldron is missing Ingredient Section");
}
return new BIngredients();
}
@ -367,55 +426,29 @@ public class P extends JavaPlugin {
FileConfiguration configFile = new YamlConfiguration();
time = System.nanoTime() - time;
float ftime = (float) (time / 1000000.0);
p.log("Creating a savefile (" + ftime + "ms)");
time = System.nanoTime();
if (!Brew.potions.isEmpty()) {
Brew.save(configFile.createSection("Brew"));
}
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Saving Brew (" + ftime + "ms)");
time = System.nanoTime();
if (!BCauldron.bcauldrons.isEmpty() || oldData.contains("BCauldron")) {
BCauldron.save(configFile.createSection("BCauldron"), oldData.getConfigurationSection("BCauldron"));
}
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Saving BCauldrons (" + ftime + "ms)");
time = System.nanoTime();
if (!Barrel.barrels.isEmpty() || oldData.contains("Barrel")) {
Barrel.save(configFile.createSection("Barrel"), oldData.getConfigurationSection("Barrel"));
}
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Saving Barrels (" + ftime + "ms)");
time = System.nanoTime();
if (!BPlayer.players.isEmpty()) {
BPlayer.save(configFile.createSection("Player"));
}
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Saving players (" + ftime + "ms)");
time = System.nanoTime();
if (!Wakeup.wakeups.isEmpty() || oldData.contains("Wakeup")) {
Wakeup.save(configFile.createSection("Wakeup"), oldData.getConfigurationSection("Wakeup"));
}
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Saving Wakeups (" + ftime + "ms)");
time = System.nanoTime();
saveWorldNames(configFile, oldData.getConfigurationSection("Worlds"));
configFile.set("Version", "0.5");
try {
configFile.save(datafile);
@ -426,8 +459,24 @@ public class P extends JavaPlugin {
lastSave = 1;
time = System.nanoTime() - time;
ftime = (float) (time / 1000000.0);
p.log("Writing Data to File (" + ftime + "ms)");
float ftime = (float) (time / 1000000.0);
p.debugLog("Writing Data to File (" + ftime + "ms)");
}
public void saveWorldNames(FileConfiguration root, ConfigurationSection old) {
if (old != null) {
root.set("Worlds", old);
}
for (World world : p.getServer().getWorlds()) {
String worldName = world.getName();
if (worldName.startsWith("DXL_")) {
worldName = getDxlName(worldName);
root.set("Worlds." + worldName, 0);
} else {
worldName = world.getUID().toString();
root.set("Worlds." + worldName, world.getName());
}
}
}
// Utility
@ -443,7 +492,7 @@ public class P extends JavaPlugin {
for (File file : dungeonFolder.listFiles()) {
if (!file.isDirectory()) {
if (file.getName().startsWith(".id_")) {
return file.getName().substring(1);
return file.getName().substring(1).toLowerCase();
}
}
}
@ -535,26 +584,18 @@ public class P extends JavaPlugin {
@Override
public void run() {
long time = System.nanoTime();
for (BCauldron cauldron : BCauldron.bcauldrons) {
cauldron.onUpdate();// runs every min to update cooking time
}
Barrel.onUpdate();// runs every min to check and update ageing time
BPlayer.onUpdate();// updates players drunkeness
debugLog("Update");
if (lastSave >= autosave) {
saveData();// save all data
time = System.nanoTime() - time;
float ftime = (float) (time / 1000000.0);
p.log("Update and saving (" + ftime + "ms)");
} else {
lastSave++;
time = System.nanoTime() - time;
float ftime = (float) (time / 1000000.0);
p.log("Update (" + ftime + "ms)");
}
}

View File

@ -7,7 +7,6 @@ import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import com.dre.brewery.BCauldron;
import com.dre.brewery.Barrel;
@ -31,12 +30,9 @@ public class BlockListener implements Listener {
Block block = event.getBlock();
// remove cauldron
if (block.getType() == Material.CAULDRON) {
if (block.getRelative(BlockFace.DOWN).getType() == Material.FIRE || block.getRelative(BlockFace.DOWN).getType() == Material.STATIONARY_LAVA
|| block.getRelative(BlockFace.DOWN).getType() == Material.LAVA) {
if (block.getData() != 0) {
// will only remove when existing
BCauldron.remove(block);
}
if (block.getData() != 0) {
// will only remove when existing
BCauldron.remove(block);
}
// remove barrel and throw potions on the ground
} else if (block.getType() == Material.FENCE || block.getType() == Material.NETHER_FENCE) {

View File

@ -32,7 +32,7 @@ public class CommandListener implements CommandExecutor {
} else if (cmd.equalsIgnoreCase("reload")) {
if (p.permission.has(sender, "brewery.cmd.reload")) {
p.reload();
p.reload(sender);
p.msg(sender, p.languageReader.get("CMD_Reload"));
} else {
p.msg(sender, p.languageReader.get("Error_NoPermissions"));
@ -82,6 +82,14 @@ public class CommandListener implements CommandExecutor {
if (p.permission.has(sender, "brewery.cmd.delete")) {
cmdDelete(sender);
} else {
p.msg(sender, p.languageReader.get("Error_NoPermissions");
}
} else if (cmd.equalsIgnoreCase("unlabel")) {
if (p.permission.has(sender, "brewery.cmd.unlabel")) {
cmdUnlabel(sender);
} else {
p.msg(sender, p.languageReader.get("Error_NoPermissions"));
}
@ -143,6 +151,10 @@ public class CommandListener implements CommandExecutor {
cmds.add (p.languageReader.get("Help_Info"));
}
if (p.permission.has(sender, "brewery.cmd.unlabel")) {
cmds.add (p.languageReader.get("Help_UnLabel");
}
if (p.permission.has(sender, "brewery.cmd.copy")) {
cmds.add (p.languageReader.get("Help_Copy"));
}
@ -230,6 +242,9 @@ public class CommandListener implements CommandExecutor {
public void cmdPlayer(CommandSender sender, String[] args) {
int drunkeness = p.parseInt(args[1]);
if (drunkeness < 0) {
return;
}
int quality = -1;
if (args.length > 2) {
quality = p.parseInt(args[2]);
@ -335,4 +350,24 @@ public class CommandListener implements CommandExecutor {
}
public void cmdUnlabel(CommandSender sender) {
if (sender instanceof Player) {
Player player = (Player) sender;
ItemStack hand = player.getItemInHand();
if (hand != null) {
Brew brew = Brew.get(hand);
if (brew != null) {
brew.unLabel(hand);
p.msg(sender, p.languageReader.get("CMD_UnLabel");
return;
}
}
p.msg(sender, p.languageReader.get("Error_ItemNotPotion");
} else {
p.msg(sender, p.languageReader.get("Error_PlayerCommand");
}
}
}

View File

@ -56,10 +56,12 @@ public class InventoryListener implements Listener {
if (event.getSlot() > 2) {
return;
}
} else if (event.getInventory().getType() != InventoryType.CHEST) {
} else if (event.getInventory().getType() == InventoryType.CHEST) {
if (!event.getInventory().getTitle().equals("Fass")) {
return;
}
} else {
return;
}
ItemStack item = event.getCurrentItem();
@ -69,8 +71,10 @@ public class InventoryListener implements Listener {
PotionMeta meta = (PotionMeta) item.getItemMeta();
Brew brew = Brew.get(meta);
if (brew != null) {
brew.convertLore(meta, false);
item.setItemMeta(meta);
if (Brew.hasColorLore(meta)) {
brew.convertLore(meta, false);
item.setItemMeta(meta);
}
}
}
}

View File

@ -3,9 +3,11 @@ package com.dre.brewery.listeners;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -30,66 +32,68 @@ public class PlayerListener implements Listener {
if (clickedBlock != null) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (clickedBlock.getType() == Material.CAULDRON) {
if (clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.FIRE || clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.STATIONARY_LAVA
|| clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.LAVA) {
Material materialInHand = event.getMaterial();
Player player = event.getPlayer();
ItemStack item = event.getItem();
Player player = event.getPlayer();
if (!player.isSneaking()) {
if (clickedBlock.getType() == Material.CAULDRON) {
if (clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.FIRE || clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.STATIONARY_LAVA
|| clickedBlock.getRelative(BlockFace.DOWN).getType() == Material.LAVA) {
Material materialInHand = event.getMaterial();
ItemStack item = event.getItem();
if (materialInHand == Material.WATCH) {
BCauldron.printTime(player, clickedBlock);
if (materialInHand == Material.WATCH) {
BCauldron.printTime(player, clickedBlock);
// fill a glass bottle with potion
} else if (materialInHand == Material.GLASS_BOTTLE) {
if (player.getInventory().firstEmpty() != -1 || item.getAmount() == 1) {
if (BCauldron.fill(player, clickedBlock)) {
// fill a glass bottle with potion
} else if (materialInHand == Material.GLASS_BOTTLE) {
if (player.getInventory().firstEmpty() != -1 || item.getAmount() == 1) {
if (BCauldron.fill(player, clickedBlock)) {
event.setCancelled(true);
if (item.getAmount() > 1) {
item.setAmount(item.getAmount() - 1);
} else {
player.setItemInHand(new ItemStack(0));
}
}
} else {
event.setCancelled(true);
}
// reset cauldron when refilling to prevent
// unlimited source of potions
} else if (materialInHand == Material.WATER_BUCKET) {
if (clickedBlock.getData() != 0) {
if (clickedBlock.getData() < 3) {
// will only remove when existing
BCauldron.remove(clickedBlock);
}
}
// add ingredient to cauldron that meet the previous
// contitions
} else if (BIngredients.possibleIngredients.contains(materialInHand)) {
if (BCauldron.ingredientAdd(clickedBlock, materialInHand)) {
if (item.getAmount() > 1) {
item.setAmount(item.getAmount() - 1);
} else {
player.setItemInHand(new ItemStack(0));
}
}
} else {
event.setCancelled(true);
}
// reset cauldron when refilling to prevent
// unlimited source of potions
} else if (materialInHand == Material.WATER_BUCKET) {
if (clickedBlock.getData() != 0) {
if (clickedBlock.getData() < 3) {
// will only remove when existing
BCauldron.remove(clickedBlock);
}
}
// add ingredient to cauldron that meet the previous
// contitions
} else if (BIngredients.possibleIngredients.contains(materialInHand)) {
if (BCauldron.ingredientAdd(clickedBlock, materialInHand)) {
if (item.getAmount() > 1) {
item.setAmount(item.getAmount() - 1);
} else {
player.setItemInHand(new ItemStack(0));
}
}
}
}
// access a barrel
} else if (clickedBlock.getType() == Material.FENCE || clickedBlock.getType() == Material.NETHER_FENCE || clickedBlock.getType() == Material.SIGN
|| clickedBlock.getType() == Material.WALL_SIGN) {
Barrel barrel = Barrel.get(clickedBlock);
if (barrel != null) {
event.setCancelled(true);
Block broken = Barrel.getBrokenBlock(clickedBlock);
// barrel is built correctly
if (broken == null) {
barrel.open(event.getPlayer());
} else {
barrel.remove(broken);
// access a barrel
} else if (clickedBlock.getType() == Material.FENCE || clickedBlock.getType() == Material.NETHER_FENCE || clickedBlock.getType() == Material.SIGN
|| clickedBlock.getType() == Material.WALL_SIGN) {
Barrel barrel = Barrel.get(clickedBlock);
if (barrel != null) {
event.setCancelled(true);
Block broken = Barrel.getBrokenBlock(clickedBlock);
// barrel is built correctly
if (broken == null) {
barrel.open(player);
} else {
barrel.remove(broken);
}
}
}
}
@ -131,6 +135,20 @@ public class PlayerListener implements Listener {
}
}
// Player has died! Decrease Drunkeness by 20
@EventHandler
public void onPlayerRespawn(PlayerRespawnEvent event) {
String playerName = event.getPlayer().getName();
BPlayer bPlayer = BPlayer.get(playerName);
if (bPlayer != null) {
if (bPlayer.getDrunkeness() > 20) {
bPlayer.setData(bPlayer.getDrunkeness() - 20, 0);
} else {
BPlayer.players.remove(playerName);
}
}
}
// player walks while drunk, push him around!
@EventHandler(priority = EventPriority.LOW)
public void onPlayerMove(PlayerMoveEvent event) {
@ -165,4 +183,12 @@ public class PlayerListener implements Listener {
}
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
BPlayer bplayer = BPlayer.get(event.getPlayer().getName());
if (bplayer != null) {
bplayer.disconnecting();
}
}
}