Effects, Hangover, Fixes

This commit is contained in:
Sn0wStorm
2013-05-28 16:25:06 +02:00
parent 5c82b08028
commit 84e37ec676
11 changed files with 553 additions and 235 deletions
+186 -15
View File
@@ -7,6 +7,8 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.entity.Player;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
import org.bukkit.Location;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.configuration.ConfigurationSection;
import com.dre.brewery.Brew;
@@ -16,6 +18,8 @@ public class BPlayer {
private int quality = 0;// = quality of drunkeness * drunkeness
private int drunkeness = 0;// = amount of drunkeness
private boolean passedOut = false;// if kicked because of drunkeness
private int offlineDrunk = 0;// drunkeness when gone offline
private Vector push = new Vector(0, 0, 0);
private int time = 20;
@@ -23,9 +27,11 @@ public class BPlayer {
}
// reading from file
public BPlayer(String name, int quality, int drunkeness) {
public BPlayer(String name, int quality, int drunkeness, int offlineDrunk, Boolean passedOut) {
this.quality = quality;
this.drunkeness = drunkeness;
this.offlineDrunk = offlineDrunk;
this.passedOut = passedOut;
players.put(name, this);
}
@@ -38,18 +44,54 @@ public class BPlayer {
return null;
}
public String getPlayerName() {
for (Map.Entry<String,BPlayer> entry : players.entrySet()) {
if (entry.getValue() == this) {
return entry.getKey();
}
}
return null;
}
public Player getPlayer() {
return org.bukkit.Bukkit.getPlayer(getPlayerName());
}
public static Player getPlayer(String name) {
return org.bukkit.Bukkit.getPlayer(name);
}
// returns true if drinking was successful
public static boolean drink(int uid, String name) {
public static boolean drink(int uid, Player player) {
Brew brew = Brew.get(uid);
if (brew != null) {
BPlayer bPlayer = get(name);
BPlayer bPlayer = get(player.getName());
if (bPlayer == null) {
bPlayer = new BPlayer();
players.put(name, bPlayer);
players.put(player.getName(), bPlayer);
}
bPlayer.drunkeness += brew.getAlcohol();
bPlayer.quality += brew.getQuality() * brew.getAlcohol();
P.p.log(name + " ist nun " + bPlayer.drunkeness + "% betrunken, mit einer Qualität von " + bPlayer.getQuality());
bPlayer.drunkeness += brew.calcAlcohol();
bPlayer.quality += brew.getQuality() * brew.calcAlcohol();
if (bPlayer.drunkeness <= 100) {
if (brew.getEffect() != null) {
int duration = (brew.getEffectDur() / 8) * brew.getQuality() * 20;
int amplifier = brew.getQuality() / 3;
PotionEffectType type = PotionEffectType.getByName(brew.getEffect());
type.createEffect(duration, amplifier).apply(player);
}
} else {
if (P.p.getConfig().getBoolean("enableKickOnOverdrink", false)) {
bPlayer.passOut(player);
} else {
bPlayer.quality = bPlayer.getQuality() * 100;
bPlayer.drunkeness = 100;
P.p.msg(player, "Du kannst einfach nicht mehr trinken und spuckst es wieder aus!");
}
}
P.p.log(player.getName() + " ist nun " + bPlayer.drunkeness + "% betrunken, mit einer Qualität von " + bPlayer.getQuality());
return true;
}
return false;
@@ -98,14 +140,130 @@ public class BPlayer {
}
}
public void passOut(Player player) {
player.kickPlayer("Du hast zu viel getrunken und bist in Ohnmacht gefallen!");
offlineDrunk = drunkeness;
passedOut = true;
}
// can the player login or is he too drunk
public int canJoin() {
if (drunkeness <= 30) {
return 0;
}
if (P.p.getConfig().getBoolean("enableLoginDisallow", false) == false) {
if (drunkeness <= 100) {
return 0;
} else {
return 3;
}
}
if (drunkeness <= 50) {
if ((Math.random() > 0.3 && !passedOut) || Math.random() > 0.5) {
return 0;
} else {
return 1;
}
}
if (drunkeness <= 70) {
if(!passedOut) {
if (Math.random() > 0.5) {
return 0;
} else {
return 1;
}
}
}
if (drunkeness <= 100) {
if (!passedOut) {
if (Math.random() > 0.8) {
return 0;
} else {
return 2;
}
}
}
return 3;
}
// player joins
public void join(final Player player) {
if (offlineDrunk == 0) {
return;
}
// delayed login event as the player is not fully accessible pre login
P.p.getServer().getScheduler().runTaskLater(P.p, new Runnable() {
public void run() {
login(player);
}
}, 1L);
}
// he is having a hangover
public void login(final Player player) {
if (drunkeness < 10) {
if (offlineDrunk > 60) {
if (P.p.getConfig().getBoolean("enableHome", false)) {
goHome(player);
}
}
} else if (offlineDrunk - drunkeness >= 20) {
// do some random teleport later
}
hangoverEffects(player);
// wird der spieler noch gebraucht?
players.remove(player.getName());
offlineDrunk = 0;
}
public void goHome(final Player player) {
String homeType = P.p.getConfig().getString("homeType", null);
if (homeType != null) {
Location home = null;
if (homeType.equalsIgnoreCase("bed")) {
home = player.getBedSpawnLocation();
} else if (homeType.equalsIgnoreCase("ManagerXL")) {
if (com.dre.managerxl.MPlayer.get(player.getName()) != null) {
home = com.dre.managerxl.MPlayer.get(player.getName()).getHome();
}
} else if (homeType.startsWith("cmd: ")) {
player.performCommand(homeType.substring(5));
} else if (homeType.startsWith("cmd:")) {
player.performCommand(homeType.substring(4));
} else {
P.p.errorLog("'homeType: " + homeType + "' unknown!");
}
if (home != null) {
player.teleport(home);
}
}
}
public void hangoverEffects(final Player player) {
int duration = offlineDrunk * 50 * getHangoverQuality();
int amplifier = getHangoverQuality() / 3;
PotionEffectType.getByName("SLOW").createEffect(duration, amplifier).apply(player);
PotionEffectType.getByName("HUNGER").createEffect(duration, amplifier).apply(player);
}
// decreasing drunkeness over time
public static void onUpdate() {
if (!players.isEmpty()) {
int soberPerMin = 2;
for (String name : players.keySet()) {
BPlayer bplayer = players.get(name);
bplayer.quality -= bplayer.getQuality();
bplayer.drunkeness -= 2;
if (bplayer.drunkeness <= 0) {
bplayer.quality -= bplayer.getQuality() * soberPerMin;
bplayer.drunkeness -= soberPerMin;
if (bplayer.drunkeness > 0) {
if (bplayer.offlineDrunk == 0) {
if (getPlayer(name) == null) {// working offline check?
bplayer.offlineDrunk = bplayer.drunkeness;
}
}
} else if (bplayer.drunkeness <= (-1) * bplayer.offlineDrunk) {
players.remove(name);
}
}
@@ -114,11 +272,15 @@ public class BPlayer {
// save all data
public static void save(ConfigurationSection config) {
if (!players.isEmpty()) {
for (String name : players.keySet()) {
ConfigurationSection section = config.createSection(name);
section.set("quality", players.get(name).quality);
section.set("drunk", players.get(name).drunkeness);
for (String name : players.keySet()) {
ConfigurationSection section = config.createSection(name);
section.set("quality", players.get(name).quality);
section.set("drunk", players.get(name).drunkeness);
if (players.get(name).offlineDrunk != 0) {
section.set("offDrunk", players.get(name).offlineDrunk);
}
if (players.get(name).passedOut) {
section.set("passedOut", players.get(name).passedOut);
}
}
}
@@ -132,4 +294,13 @@ public class BPlayer {
return Math.round(quality / drunkeness);
}
// opposite of quality
public int getHangoverQuality() {
return -getQuality() + 10;
}
public int getHangoverProgress() {
return offlineDrunk + drunkeness;
}
}