diff --git a/config.yml b/config.yml index 62418c3..a83bdf9 100644 --- a/config.yml +++ b/config.yml @@ -25,6 +25,12 @@ enableLoginDisallow: true # Ob der Spieler sich übertrinken kann und dann in Ohnmacht fällt (gekickt wird) und sich für einige Stunden nicht einloggen kann enableKickOnOverdrink: true +# Ob der Spieler sich bei großer Trunkenheit übergibt (unten definiertes Item aus dem Mund fallen lässt, dass nicht aufgesammelt werden kann und bis zum Despawnen liegen bleibt) +enablePuke: true + +# Item das beim Erbrechen mehrfach unaufsammelbar fallen gelassen wird +pukeItem: SOUL_SAND + # Autosave Intervall in Minuten autosave: 3 @@ -145,7 +151,7 @@ recipes: -# cooked: ALLE möglichen Zutaten und die nach dem Gähren daraus entstehenden Tranknamen: (leer für undefiniert) +# cooked: ALLE möglichen Zutaten und die nach dem Gähren daraus entstehenden Tranknamen: cooked: WHEAT: Getreideferment @@ -153,14 +159,14 @@ cooked: APPLE: Apfelmost POTATO_ITEM: Kartoffelmaische LONG_GRASS: Kräuterbrühe - RED_MUSHROOM: + RED_MUSHROOM: Pilzsud # words: Wörter und Buchstaben die bei Chatten während Trunkenheit ersetzt werden sollen. # Diese werden von oben nach unten gelesen und in dieser Reihenfolge wird ein geschriebener Satz dann verändert. -# replace: Zu ersetzendes Wort oder Buchstabe. (Besondere: "-space": ersetzt Leerzeichen, "-random": Einfügen in zufällige Position, "-start": Ganz am Anfang, "-end": Ganz ans Ende.) +# replace: Zu ersetzendes Wort oder Buchstabe. (Besondere: "-space": ersetzt Leerzeichen, "-random": Einfügen in zufällige Position, "-all": Alles, "-start": Ganz am Anfang, "-end": Ganz ans Ende.) # to: In welches Wort es ersetzt werden soll. # pre: Wörter und Buchstaben vor dem gesuchten Wort (durch "," getrennt) # match: true = eines der "pre"-Wörter muss vor dem gesuchten Wort stehen, false = keines der "pre" Wörter darf vor dem gesuchten stehen @@ -378,4 +384,9 @@ words: - replace: -end to: ' *hicks*' percentage: 70 - alcohol: 50 \ No newline at end of file + alcohol: 50 + +- replace: -all + to: '*rülps*' + percentage: 3 + alcohol: 60 diff --git a/readme.md b/readme.md index cd446c0..8d83dfb 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,4 @@ # Brewery -======= **Brewery ist ein Bukkit-Plugin zum brauen auch alkoholischer Getränke.** @@ -116,11 +115,12 @@ Schlägt man den Zapfhahn mit einer Axt ab, so werden alle Getränke herausgesch Der Alkoholgehalt des Trankes wird beim trinken auf den Spieler übertragen. Je nach Qualität hat dies verschiedene Auswirkungen. -* Der Spieler kann nicht mehr richtig laufen, er wird Torkeln und für eine Strecke weit aus länger brauchen +* Der Spieler kann nicht mehr richtig laufen, er wird Torkeln und für eine Strecke weitaus länger brauchen * Es können Effekte wie Blindness, Confusion, Poison usw. auftreten -* Der Chat wird stark verändert, vieles was geschrieben wird ist fast unverständlich, teilweise nur gebrabbel +* Der Chat wird stark verändert, vieles was geschrieben wird ist fast unverständlich, teilweise nur Gebrabbel * Ist der getrunkene Alkohol sehr stark wird er sich leicht vergiften -* Loggt der Spieler sich aus wird er Schwierigkeiten haben sich wieder ein zu loggen +* Hat er sehr viel getrunken, besteht die Wahrscheinlichkeit, dass er sich übergibt +* Loggt der Spieler sich aus wird er Schwierigkeiten haben sich wieder ein zu loggen, da sein Charakter nicht reagiert * Trinkt er zu viel wird er in Ohnmacht fallen (Disconnect) ### Ausnüchtern @@ -129,4 +129,4 @@ Nach dem Trinken dauert es eine Weile, bis der Alkohol wieder verschwunden ist. * Loggt der Spieler sich stark betrunken aus, kann es sein, dass er sich beim nächsten einloggen (wenn etwas Zeit vergangen ist) an einen ihm völlig unbekannten Ort mitten in der Pampa wiederfindet und keine Ahnung hat wie er dort hingkommen ist * Loggt er sich erst nach einigen Stunden oder am nächsten Morgen wieder ein befindet er sich bei seinem home, ebenfalls ohne jede Erinnerung -* War der Alkohol nicht von der guten Qualität sind mit Nacherscheinungen zu rechnen (Slowness und Hunger). \ No newline at end of file +* War der Alkohol nicht von der guten Qualität sind mit Nacherscheinungen zu rechnen (Slowness und Hunger). diff --git a/src/com/dre/brewery/BIngredients.java b/src/com/dre/brewery/BIngredients.java index 73763c1..b40a221 100644 --- a/src/com/dre/brewery/BIngredients.java +++ b/src/com/dre/brewery/BIngredients.java @@ -62,13 +62,13 @@ public class BIngredients { new Brew(uid, quality, cookRecipe, new BIngredients(ingredients, cookedTime)); cookedName = cookRecipe.getName(quality); - potion.setDurability(Brew.PotionColor.valueOf(cookRecipe.getColor()).getColorId(false)); + potion.setDurability(Brew.PotionColor.valueOf(cookRecipe.getColor()).getColorId(true)); } else { // new base potion new Brew(uid, new BIngredients(ingredients, cookedTime)); - if (state == 0) {// TODO sonst 1 + if (state == 1) { cookedName = "Schlammiger Sud"; potion.setDurability(Brew.PotionColor.BLUE.getColorId(false)); } else { diff --git a/src/com/dre/brewery/BPlayer.java b/src/com/dre/brewery/BPlayer.java index e515488..b088ba6 100644 --- a/src/com/dre/brewery/BPlayer.java +++ b/src/com/dre/brewery/BPlayer.java @@ -6,6 +6,8 @@ import java.util.HashMap; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.entity.Player; import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import org.bukkit.Location; import org.bukkit.potion.PotionEffectType; @@ -15,6 +17,9 @@ import com.dre.brewery.Brew; public class BPlayer { public static Map players = new HashMap();// Players name and BPlayer + private static Map pTasks = new HashMap();// Player and count + private static int taskId; + public static int pukeItemId; private int quality = 0;// = quality of drunkeness * drunkeness private int drunkeness = 0;// = amount of drunkeness @@ -92,6 +97,7 @@ public class BPlayer { } else { bPlayer.quality = bPlayer.getQuality() * 100; bPlayer.drunkeness = 100; + addPuke(player, 60 + (int) (Math.random() * 60)); P.p.msg(player, "Du kannst nicht mehr trinken"); } } @@ -253,6 +259,66 @@ public class BPlayer { PotionEffectType.HUNGER.createEffect(duration, amplifier).apply(player); } + // Chance that players puke on big drunkeness + // runs every 6 sec, average chance is 10%, so should puke about every 60 sec + // good quality can decrease the chance by up to 10% + public void drunkPuke(Player player) { + if (drunkeness >= 80) { + if (drunkeness >= 90) { + if (Math.random() < 0.15 - (getQuality() / 100)) { + addPuke(player, 20 + (int) (Math.random() * 40)); + } + } else { + if (Math.random() < 0.08 - (getQuality() / 100)) { + addPuke(player, 10 + (int) (Math.random() * 30)); + } + } + } + } + + // make a Player puke "count" items + public static void addPuke(Player player, int count) { + if (!P.p.getConfig().getBoolean("enablePuke", false)) { + return; + } + + if (pTasks.isEmpty()) { + taskId = P.p.getServer().getScheduler().scheduleSyncRepeatingTask(P.p, new Runnable() { + public void run() { + pukeTask(); + } + }, 1L, 1L); + } + pTasks.put(player, count); + } + + public static void pukeTask() { + for (Player player : pTasks.keySet()) { + puke(player); + int newCount = pTasks.get(player) - 1; + if (newCount == 0) { + pTasks.remove(player); + } else { + pTasks.put(player, newCount); + } + } + if (pTasks.isEmpty()) { + P.p.getServer().getScheduler().cancelTask(taskId); + } + } + + public static void puke(Player player) { + Location loc = player.getLocation(); + Vector direction = loc.getDirection(); + direction.multiply(0.5); + loc.setY(loc.getY() + 1.5); + loc.setPitch(loc.getPitch() + 10); + loc.add(direction); + Item item = player.getWorld().dropItem(loc, new ItemStack(pukeItemId)); + item.setVelocity(direction); + item.setPickupDelay(Integer.MAX_VALUE); + } + public void drunkEffects(Player player) { int duration = 10 - getQuality(); duration += drunkeness / 2; @@ -293,11 +359,18 @@ public class BPlayer { public static void drunkeness() { for (String name : players.keySet()) { BPlayer bplayer = players.get(name); + if (bplayer.drunkeness > 30) { if (bplayer.offlineDrunk == 0) { Player player = getPlayer(name); if (player != null) { + bplayer.drunkEffects(player); + + if (P.p.getConfig().getBoolean("enablePuke", false)) { + bplayer.drunkPuke(player); + } + } } } diff --git a/src/com/dre/brewery/P.java b/src/com/dre/brewery/P.java index 1101f62..101792b 100644 --- a/src/com/dre/brewery/P.java +++ b/src/com/dre/brewery/P.java @@ -99,6 +99,7 @@ public class P extends JavaPlugin { // various Settings autosave = config.getInt("autosave", 3); + BPlayer.pukeItemId = Material.matchMaterial(config.getString("pukeItem", "SOUL_SAND")).getId(); // loading recipes ConfigurationSection configSection = config.getConfigurationSection("recipes"); @@ -112,8 +113,9 @@ public class P extends JavaPlugin { configSection = config.getConfigurationSection("cooked"); if (configSection != null) { for (String ingredient : configSection.getKeys(false)) { - BIngredients.cookedNames.put(Material.matchMaterial(ingredient), (configSection.getString(ingredient))); - BIngredients.possibleIngredients.add(Material.matchMaterial(ingredient)); + Material mat = Material.matchMaterial(ingredient); + BIngredients.cookedNames.put(mat, (configSection.getString(ingredient, null))); + BIngredients.possibleIngredients.add(mat); } } diff --git a/src/com/dre/brewery/Words.java b/src/com/dre/brewery/Words.java index a1b111b..8a22a0b 100644 --- a/src/com/dre/brewery/Words.java +++ b/src/com/dre/brewery/Words.java @@ -91,6 +91,8 @@ public class Words { } else if (from.equalsIgnoreCase("-start")) { from = words; to = to + words; + } else if (from.equalsIgnoreCase("-all")) { + from = words; } else if (from.equalsIgnoreCase("-space")) { from = " "; } else if (from.equalsIgnoreCase("-random")) {