Implemented puke item despawn time, defaults to 1 min

This commit is contained in:
Sn0wStorm 2016-05-27 21:38:15 +02:00
parent 581dd69f38
commit 41c6782635
6 changed files with 128 additions and 17 deletions

View File

@ -35,6 +35,10 @@ enablePuke: true
# Item das beim Erbrechen mehrfach unaufsammelbar fallen gelassen wird [SOUL_SAND]
pukeItem: SOUL_SAND
# Zeit in Sekunden bis die pukeitems despawnen, (mc standard wäre 300 = 5 min) [60]
# Wurde die item Despawnzeit in der spigot.yml verändert, verändert sich auch die pukeDespawnzeit in Abhängigkeit.
pukeDespawntime: 60
# Konsumierbares Item/Stärke. Senkt den Alkoholpegel um <Stärke> wenn konsumiert.
drainItems:
- BREAD/4

View File

@ -35,6 +35,10 @@ enablePuke: true
# Item that is dropped multiple times uncollectable when puking [SOUL_SAND]
pukeItem: SOUL_SAND
# Time in seconds until the pukeitems despawn, (mc default is 300 = 5 min) [60]
# If the item despawn time was changed in the spigot.yml, the pukeDespawntime changes as well.
pukeDespawntime: 60
# Consumable Item/strength. Decreases the alcohol level by <strength> when consumed. (list)
drainItems:
- BREAD/4

View File

@ -35,6 +35,10 @@ enablePuke: true
# L'objet utilisé pour représenter le vomit [SOUL_SAND]
pukeItem: SOUL_SAND
# Time in seconds until the pukeitems despawn, (mc default is 300 = 5 min) [60]
# If the item despawn time was changed in the spigot.yml, the pukeDespawntime changes as well.
pukeDespawntime: 60
# Consommables Objet/Force. Réduit le montant d'alcool par <Force> lors de la consommation. (list)
drainItems:
- BREAD/4

View File

@ -1,10 +1,6 @@
package com.dre.brewery;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.lang.mutable.MutableInt;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
@ -17,14 +13,24 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
public class BPlayer {
private static Map<String, BPlayer> players = new HashMap<>();// Players name/uuid and BPlayer
private static Map<Player, Integer> pTasks = new HashMap<>();// Player and count
private static Map<Player, MutableInt> pTasks = new HashMap<>();// Player and count
private static int taskId;
private static boolean modAge = true;
private static Random pukeRand;
private static Method gh;
private static Field age;
// Settings
public static Map<Material, Integer> drainItems = new HashMap<>();// DrainItem Material and Strength
public static Material pukeItem;
public static int pukeDespawntime;
public static int hangoverTime;
public static boolean overdrinkKick;
public static boolean enableHome;
@ -379,17 +385,21 @@ public class BPlayer {
}
}, 1L, 1L);
}
pTasks.put(player, count);
pTasks.put(player, new MutableInt(count));
}
public static void pukeTask() {
for (Player player : pTasks.keySet()) {
for (Iterator<Map.Entry<Player, MutableInt>> iter = pTasks.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry<Player, MutableInt> entry = iter.next();
Player player = entry.getKey();
MutableInt count = entry.getValue();
if (!player.isValid() || !player.isOnline()) {
iter.remove();
}
puke(player);
int newCount = pTasks.get(player) - 1;
if (newCount == 0) {
pTasks.remove(player);
} else {
pTasks.put(player, newCount);
count.decrement();
if (count.intValue() <= 0) {
iter.remove();
}
}
if (pTasks.isEmpty()) {
@ -398,15 +408,55 @@ public class BPlayer {
}
public static void puke(Player player) {
if (pukeRand == null) {
pukeRand = new Random();
}
if (pukeItem == null || pukeItem == Material.AIR) {
pukeItem = Material.SOUL_SAND;
}
Location loc = player.getLocation();
loc.setY(loc.getY() + 1.1);
loc.setPitch(loc.getPitch() - 10 + pukeRand.nextInt(20));
loc.setYaw(loc.getYaw() - 10 + pukeRand.nextInt(20));
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(pukeItem));
item.setVelocity(direction);
item.setPickupDelay(32767); // Item can never be picked up when pickup delay is 32767
//item.setTicksLived(6000 - pukeDespawntime); // Well this does not work...
if (modAge) {
if (pukeDespawntime >= 5800) {
return;
}
try {
if (gh == null) {
gh = Class.forName(P.p.getServer().getClass().getPackage().getName() + ".entity.CraftItem").getMethod("getHandle", (Class<?>[]) null);
}
Object entityItem = gh.invoke(item, (Object[]) null);
if (age == null) {
age = entityItem.getClass().getDeclaredField("age");
age.setAccessible(true);
}
// Setting the age determines when an item is despawned. At age 6000 it is removed.
if (pukeDespawntime <= 0) {
// Just show the item for a tick
age.setInt(entityItem, 5999);
} else if (pukeDespawntime <= 120) {
// it should despawn in less than 6 sec. Add up to half of that randomly
age.setInt(entityItem, 6000 - pukeDespawntime + pukeRand.nextInt((int) (pukeDespawntime / 2F)));
} else {
// Add up to 5 sec randomly
age.setInt(entityItem, 6000 - pukeDespawntime + pukeRand.nextInt(100));
}
return;
} catch (InvocationTargetException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
e.printStackTrace();
}
modAge = false;
P.p.errorLog("Failed to set Despawn Time on item " + pukeItem.name());
}
}

View File

@ -287,6 +287,7 @@ public class P extends JavaPlugin {
BPlayer.enableHome = config.getBoolean("enableHome", false);
BPlayer.enableLoginDisallow = config.getBoolean("enableLoginDisallow", false);
BPlayer.enablePuke = config.getBoolean("enablePuke", false);
BPlayer.pukeDespawntime = config.getInt("pukeDespawntime", 60) * 20;
BPlayer.homeType = config.getString("homeType", null);
Brew.colorInBarrels = config.getBoolean("colorInBarrels", false);
Brew.colorInBrewer = config.getBoolean("colorInBrewer", false);

View File

@ -683,6 +683,30 @@ public class ConfigUpdater {
setLine(index, "# Das Item kann nicht aufgesammelt werden und bleibt bis zum Despawnen liegen.");
}
String[] lines = new String[] { "",
"# Zeit in Sekunden bis die pukeitems despawnen, (mc standard wäre 300 = 5 min) [60]",
"# Wurde die item Despawnzeit in der spigot.yml verändert, verändert sich auch die pukeDespawnzeit in Abhängigkeit.",
"pukeDespawntime: 60" };
index = indexOfStart("pukeItem:");
if (index == -1) {
index = indexOfStart("enablePuke:");
if (index == -1) {
index = indexOfStart("# Konsumierbares Item") - 1;
if (index == -2) {
index = indexOfStart("enableKickOnOverdrink:");
if (index == -1) {
index = indexOfStart("language:");
}
}
}
}
if (index == -1) {
appendLines(lines);
} else {
addLines(index + 1, lines);
}
index = indexOfStart("# Färben der Iteminformationen je nach Qualität während sie sich 1. im Fass und/oder 2. im Braustand befinden [true, false]");
if (index != -1) {
setLine(index, "# Färben der Iteminformationen je nach Qualität während sie sich 1. im Fass und/oder 2. im Braustand befinden [true, true]");
@ -698,7 +722,7 @@ public class ConfigUpdater {
setLine(index, "# Eine Liste von allen Materialien kann hier gefunden werden: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html");
}
String[] lines = new String[] { "# Wenn Vault installiert ist können normale englische Item Namen verwendet werden, anstatt Material, ID und Data!",
lines = new String[] { "# Wenn Vault installiert ist können normale englische Item Namen verwendet werden, anstatt Material, ID und Data!",
"# Vault erkennt Namen wie \"Jungle Leaves\" anstatt \"LEAVES,3\". Dies macht es viel einfacher!" };
index = indexOfStart("# Es kann ein Data-Wert angegeben werden, weglassen");
@ -781,6 +805,30 @@ public class ConfigUpdater {
setLine(index, "# The item can not be collected and stays on the ground until it despawns.");
}
String[] lines = new String[] { "",
"# Time in seconds until the pukeitems despawn, (mc default is 300 = 5 min) [60]",
"# If the item despawn time was changed in the spigot.yml, the pukeDespawntime changes as well.",
"pukeDespawntime: 60" };
index = indexOfStart("pukeItem:");
if (index == -1) {
index = indexOfStart("enablePuke:");
if (index == -1) {
index = indexOfStart("# Consumable Item") - 1;
if (index == -2) {
index = indexOfStart("enableKickOnOverdrink:");
if (index == -1) {
index = indexOfStart("language:");
}
}
}
}
if (index == -1) {
appendLines(lines);
} else {
addLines(index + 1, lines);
}
index = indexOfStart("# Color the Item information (lore) depending on quality while it is 1. in a barrel and/or 2. in a brewing stand [true, false]");
if (index != -1) {
setLine(index, "# Color the Item information (lore) depending on quality while it is 1. in a barrel and/or 2. in a brewing stand [true, true]");
@ -796,7 +844,7 @@ public class ConfigUpdater {
setLine(index, "# A list of materials can be found here: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html");
}
String[] lines = new String[] { "# If Vault is installed normal names can be used instead of material or id, so using Vault is highly recommended.",
lines = new String[] { "# If Vault is installed normal names can be used instead of material or id, so using Vault is highly recommended.",
"# Vault will recognize things like \"Jungle Leaves\" instead of \"LEAVES,3\"" };
index = indexOfStart("# You can specify a data value, omitting");