From 2894985e717bb4f49824d9963fe60f12c9232869 Mon Sep 17 00:00:00 2001 From: Sn0wStorm Date: Tue, 30 Apr 2013 01:23:29 +0200 Subject: [PATCH] Added basic drunkenness --- src/com/dre/brewery/BIngredients.java | 3 +- src/com/dre/brewery/BPlayer.java | 109 ++++++++++++++++++ src/com/dre/brewery/BRecipe.java | 11 ++ src/com/dre/brewery/Brew.java | 72 +++++++----- .../dre/brewery/listeners/PlayerListener.java | 26 +++-- 5 files changed, 183 insertions(+), 38 deletions(-) create mode 100644 src/com/dre/brewery/BPlayer.java diff --git a/src/com/dre/brewery/BIngredients.java b/src/com/dre/brewery/BIngredients.java index 6c2c1a0..2dcf4a8 100644 --- a/src/com/dre/brewery/BIngredients.java +++ b/src/com/dre/brewery/BIngredients.java @@ -9,7 +9,6 @@ import org.bukkit.Material; import org.bukkit.potion.PotionEffectType; import org.bukkit.inventory.meta.PotionMeta; -import com.dre.brewery.P; import com.dre.brewery.BRecipe; import com.dre.brewery.Brew; @@ -61,7 +60,7 @@ public class BIngredients { //Potion is best with cooking only, can still be destilled, etc. int quality =(int) Math.round((getIngredientQuality(cookRecipe) + getCookingQuality(cookRecipe)) / 2.0); P.p.log("cooked potion has Quality: "+quality); - new Brew(uid,quality,new BIngredients(ingredients,cookedTime)); + new Brew(uid,quality,cookRecipe.getAlcohol(),new BIngredients(ingredients,cookedTime)); cookedName = cookRecipe.getName(quality); potion.setDurability(Brew.PotionColor.valueOf(cookRecipe.getColor()).getColorId(false)); diff --git a/src/com/dre/brewery/BPlayer.java b/src/com/dre/brewery/BPlayer.java new file mode 100644 index 0000000..f2f17bb --- /dev/null +++ b/src/com/dre/brewery/BPlayer.java @@ -0,0 +1,109 @@ +package com.dre.brewery; + +import java.util.Map; +import java.util.HashMap; + +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.entity.Player; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.util.Vector; + +import com.dre.brewery.Brew; + +public class BPlayer { + public static Map players=new HashMap(); + + private int quality = 0;// = quality of drunkeness * drunkeness + private int drunkeness = 0;// = amount of drunkeness + private Vector push = new Vector(0,0,0); + private int time = 20; + + public BPlayer(){ + } + + + public static BPlayer get(Player player){ + if(!players.isEmpty()){ + if(players.containsKey(player)){ + return players.get(player); + } + } + return null; + } + + /*public void remove(BPlayer player){ + players.remove(player); + }*/ + + //returns true if drinking was successful + public static boolean drink(PotionMeta meta,Player player){ + Brew brew = Brew.get(meta); + if(brew != null){ + BPlayer bPlayer = get(player); + if(bPlayer == null){ + bPlayer = new BPlayer(); + players.put(player,bPlayer); + } + bPlayer.drunkeness += brew.getAlcohol(); + bPlayer.quality += brew.getQuality() * brew.getAlcohol(); + P.p.msg(player,"Du bist nun "+bPlayer.drunkeness+"% betrunken, mit einer Qualität von "+bPlayer.getQuality()); + return true; + } + return false; + } + + //push the player around if he moves + public static void playerMove(PlayerMoveEvent event){ + BPlayer bPlayer = get(event.getPlayer()); + if(bPlayer != null){ + bPlayer.move(event); + } + } + + //player is drunk + public void move(PlayerMoveEvent event){ + //has player more alc than 10 + if(drunkeness >= 10){ + if(drunkeness <= 100){ + if(time > 1){ + time--; + } else { + //Is he moving + if(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ()){ + Player player = event.getPlayer(); + Entity entity = (Entity) player; + //not in midair + if(entity.isOnGround()){ + time--; + if(time == 0){ + //push him only to the side? or any direction like now + push.setX(Math.random() - 0.5); + push.setZ(Math.random() - 0.5); + player.setVelocity(push); + } else if (time < 0 && time > -10){ + //push him some more in the same direction + player.setVelocity(push); + } else { + //when more alc, push him more often + time = (int)(Math.random() * (201.0 - (drunkeness * 2))); + } + } + } + } + } + } + } + + + //getter + public int getDrunkeness(){ + return drunkeness; + } + + public int getQuality(){ + return Math.round(quality / drunkeness); + } + + +} \ No newline at end of file diff --git a/src/com/dre/brewery/BRecipe.java b/src/com/dre/brewery/BRecipe.java index 73c458f..fc334f9 100644 --- a/src/com/dre/brewery/BRecipe.java +++ b/src/com/dre/brewery/BRecipe.java @@ -90,6 +90,13 @@ public class BRecipe { return false; } + public boolean needsDistilling(){ + if(distillruns == 0){ + return true; + } + return false; + } + public boolean needsToAge(){ if(age == 0){ return false; @@ -171,5 +178,9 @@ public class BRecipe { return difficulty; } + public int getAlcohol(){ + return alcohol; + } + } \ No newline at end of file diff --git a/src/com/dre/brewery/Brew.java b/src/com/dre/brewery/Brew.java index 5623400..5b1875f 100644 --- a/src/com/dre/brewery/Brew.java +++ b/src/com/dre/brewery/Brew.java @@ -12,8 +12,6 @@ import org.bukkit.inventory.BrewerInventory; import com.dre.brewery.BIngredients; -import com.dre.brewery.P; - public class Brew { public static Map potions=new HashMap(); @@ -24,6 +22,7 @@ public class Brew { private int quality; private int distillRuns; private float ageTime; + private int alcohol; public Brew(int uid,BIngredients ingredients){ this.ingredients = ingredients; @@ -31,9 +30,10 @@ public class Brew { } //quality already set - public Brew(int uid,int quality,BIngredients ingredients){ + public Brew(int uid,int quality,int alcohol,BIngredients ingredients){ this.ingredients = ingredients; this.quality = quality; + this.alcohol = calcAlcohol(alcohol); potions.put(uid,this); } @@ -91,6 +91,39 @@ public class Brew { return null; }*/ + //calculate alcohol from recipe + public int calcAlcohol(int alc){ + if(distillRuns == 0){ + distillRuns = 1; + } + alc /= distillRuns; + alc *= distillRuns * ((float)quality / 10.0); + return alc; + } + + //calculating quality + public int calcQuality(BRecipe recipe,byte wood){ + //calculate quality from all of the factors + float quality =( + + ingredients.getIngredientQuality(recipe) + + ingredients.getCookingQuality(recipe) + + ingredients.getWoodQuality(recipe,wood) + + ingredients.getAgeQuality(recipe,ageTime)); + + quality /= 4; + return (int)Math.round(quality); + } + + public int getQuality(){ + return quality; + } + + //return prev calculated alcohol + public int getAlcohol(){ + return alcohol; + } + @@ -116,15 +149,7 @@ public class Brew { BRecipe recipe = brew.ingredients.getdistillRecipe(); if(recipe != null){ - //calculate quality of ingredients and cookingtime - float quality = brew.ingredients.getIngredientQuality(recipe) + brew.ingredients.getCookingQuality(recipe); - quality /= 2; - - /*if(recipe.getDistillRuns() > 1){ - quality -= Math.abs(recipe.getDistillRuns() - (brew.distillRuns + 1)) * 2; - }*/ - - brew.quality = (int)Math.round(quality); + brew.quality = brew.calcQuality(recipe,(byte)0); P.p.log("destilled "+recipe.getName(5)+" has Quality: "+brew.quality); brew.distillRuns += 1; //distillRuns will have an effect on the amount of alcohol, not the quality @@ -133,6 +158,7 @@ public class Brew { lore.add(brew.distillRuns+" fach Destilliert"); potionMeta.setLore(lore); } + brew.alcohol = brew.calcAlcohol(recipe.getAlcohol()); potionMeta.setDisplayName(recipe.getName(brew.quality)); @@ -165,22 +191,16 @@ public class Brew { if(brew.ageTime > 0.5){ BRecipe recipe = brew.ingredients.getAgeRecipe(wood,brew.ageTime); if(recipe != null){ + if(!recipe.needsDistilling() || brew.distillRuns > 0){ - //calculate quality from all of the factors - float quality =( + brew.quality = brew.calcQuality(recipe,wood); + brew.alcohol = brew.calcAlcohol(recipe.getAlcohol()); + P.p.log("Final "+recipe.getName(5)+" has Quality: "+brew.quality); - brew.ingredients.getIngredientQuality(recipe) + - brew.ingredients.getCookingQuality(recipe) + - brew.ingredients.getWoodQuality(recipe,wood) + - brew.ingredients.getAgeQuality(recipe,brew.ageTime)); - - quality /= 4; - brew.quality = (int)Math.round(quality); - P.p.log("Final "+recipe.getName(5)+" has Quality: "+brew.quality); - - potionMeta.setDisplayName(recipe.getName(brew.quality)); - item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(false)); - item.setItemMeta(potionMeta); + potionMeta.setDisplayName(recipe.getName(brew.quality)); + item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(false)); + item.setItemMeta(potionMeta); + } } } } diff --git a/src/com/dre/brewery/listeners/PlayerListener.java b/src/com/dre/brewery/listeners/PlayerListener.java index 0765b2a..ab37f06 100644 --- a/src/com/dre/brewery/listeners/PlayerListener.java +++ b/src/com/dre/brewery/listeners/PlayerListener.java @@ -3,6 +3,7 @@ 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.PlayerMoveEvent; import org.bukkit.event.inventory.BrewEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -22,8 +23,7 @@ import com.dre.brewery.BCauldron; import com.dre.brewery.BIngredients; import com.dre.brewery.Brew; import com.dre.brewery.Barrel; - -import com.dre.brewery.P; +import com.dre.brewery.BPlayer; public class PlayerListener implements Listener{ @EventHandler(priority = EventPriority.HIGH) @@ -130,23 +130,29 @@ public class PlayerListener implements Listener{ //player drinks a custom potion @EventHandler(priority = EventPriority.NORMAL) public void onPlayerItemConsume(PlayerItemConsumeEvent event){ - if(event.getItem() != null){ - if(event.getItem().getType() == Material.POTION){ - if(event.getItem().hasItemMeta()){ - PotionMeta potionMeta = ((PotionMeta) event.getItem().getItemMeta()); + ItemStack item = event.getItem(); + if(item != null){ + if(item.getType() == Material.POTION){ + if(item.hasItemMeta()){ + PotionMeta potionMeta = ((PotionMeta) item.getItemMeta()); if(potionMeta.hasCustomEffect(PotionEffectType.REGENERATION)){ for(PotionEffect effect:potionMeta.getCustomEffects()){ if(effect.getType().getId() == 10){ - //tell him the ID for testing - P.p.msg(event.getPlayer(),"ID: "+effect.getDuration()); + if(BPlayer.drink(potionMeta,event.getPlayer())){ + Brew.remove(item); + item.setType(Material.POTION); + } } } } } } } - - } + //player walks while drunk, push him around! + @EventHandler(priority = EventPriority.LOW) + public void onPlayerMove(PlayerMoveEvent event){ + BPlayer.playerMove(event); + } } \ No newline at end of file