Merge branch 'clans/beta' of https://github.com/Mineplex-LLC/Minecraft-PC into clans/beta
This commit is contained in:
commit
7920f2729b
@ -48,13 +48,6 @@ public class PlayerCache
|
||||
try
|
||||
{
|
||||
PlayerInfo playerInfo = _repository.getElement(uuid.toString());
|
||||
if (playerInfo != null)
|
||||
{
|
||||
System.out.println("Got playerInfo: " + playerInfo);
|
||||
System.out.println("account id: " + playerInfo.getAccountId());
|
||||
System.out.println("name: " + playerInfo.getName());
|
||||
}
|
||||
|
||||
return playerInfo;
|
||||
}
|
||||
catch (Exception exception)
|
||||
@ -66,6 +59,17 @@ public class PlayerCache
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to grab a player's account ID from the cache
|
||||
* @param uuid Minecraft Account UUID
|
||||
* @return The account id of the player, or -1 if the player is not in the cache
|
||||
*/
|
||||
public int getAccountId(UUID uuid)
|
||||
{
|
||||
PlayerInfo info = getPlayer(uuid);
|
||||
return info == null ? -1 : info.getAccountId();
|
||||
}
|
||||
|
||||
public void clean()
|
||||
{
|
||||
_repository.clean();
|
||||
|
@ -10,30 +10,52 @@ import org.bukkit.Location;
|
||||
|
||||
public class DataLocationMap
|
||||
{
|
||||
private EnumMap<DyeColor, List<Location>> _dataMap;
|
||||
private EnumMap<DyeColor, List<Location>> _goldDataMap;
|
||||
private EnumMap<DyeColor, List<Location>> _ironDataMap;
|
||||
|
||||
public DataLocationMap()
|
||||
{
|
||||
_dataMap = new EnumMap<>(DyeColor.class);
|
||||
_goldDataMap = new EnumMap<>(DyeColor.class);
|
||||
_ironDataMap = new EnumMap<>(DyeColor.class);
|
||||
}
|
||||
|
||||
public List<Location> getLocations(DyeColor color)
|
||||
public List<Location> getGoldLocations(DyeColor color)
|
||||
{
|
||||
List<Location> list = _dataMap.get(color);
|
||||
List<Location> list = _goldDataMap.get(color);
|
||||
return list == null ? Collections.emptyList() : list;
|
||||
}
|
||||
|
||||
public void addLocation(DyeColor color, Location location)
|
||||
public void addGoldLocation(DyeColor color, Location location)
|
||||
{
|
||||
if (_dataMap.containsKey(color))
|
||||
if (_goldDataMap.containsKey(color))
|
||||
{
|
||||
_dataMap.get(color).add(location);
|
||||
_goldDataMap.get(color).add(location);
|
||||
}
|
||||
else
|
||||
{
|
||||
List<Location> list = new ArrayList<>();
|
||||
list.add(location);
|
||||
_dataMap.put(color, list);
|
||||
_goldDataMap.put(color, list);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Location> getIronLocations(DyeColor color)
|
||||
{
|
||||
List<Location> list = _ironDataMap.get(color);
|
||||
return list == null ? Collections.emptyList() : list;
|
||||
}
|
||||
|
||||
public void addIronLocation(DyeColor color, Location location)
|
||||
{
|
||||
if (_ironDataMap.containsKey(color))
|
||||
{
|
||||
_ironDataMap.get(color).add(location);
|
||||
}
|
||||
else
|
||||
{
|
||||
List<Location> list = new ArrayList<>();
|
||||
list.add(location);
|
||||
_ironDataMap.put(color, list);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,9 @@ package mineplex.core.common.block.schematic;
|
||||
import org.bukkit.DyeColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import mineplex.core.common.block.DataLocationMap;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
|
||||
public class Schematic
|
||||
{
|
||||
@ -24,7 +24,7 @@ public class Schematic
|
||||
_blockData = blockData;
|
||||
}
|
||||
|
||||
public DataLocationMap paste(Location originLocation)
|
||||
public DataLocationMap paste(Location originLocation, boolean ignoreAir)
|
||||
{
|
||||
DataLocationMap locationMap = new DataLocationMap();
|
||||
|
||||
@ -43,31 +43,34 @@ public class Schematic
|
||||
// not sure why but the math.abs is my simple fix
|
||||
int materialId = Math.abs(_blocks[index]);
|
||||
|
||||
Material material = Material.getMaterial(materialId);
|
||||
if (material == null)
|
||||
if (ignoreAir && materialId == 0) // Air
|
||||
{
|
||||
System.err.println("Schematic: Could not find Material [id: " + materialId + " data: " + _blockData[index] + "]");
|
||||
continue;
|
||||
}
|
||||
else if (material == Material.GOLD_PLATE)
|
||||
else if (materialId == 147) // Gold Plate
|
||||
{
|
||||
// Check for data wool at location below the gold plate
|
||||
if (addDataWool(locationMap, originLocation, x, y - 1, z))
|
||||
if (addDataWool(locationMap, true, originLocation, x, y - 1, z))
|
||||
continue;
|
||||
}
|
||||
else if (material == Material.WOOL)
|
||||
else if (materialId == 148) // Iron Plate
|
||||
{
|
||||
// Check for data wool at location below the gold plate
|
||||
if (addDataWool(locationMap, false, originLocation, x, y - 1, z))
|
||||
continue;
|
||||
}
|
||||
else if (materialId == 35)
|
||||
{
|
||||
// Check if this is a dataloc so we can skip setting the block
|
||||
int aboveIndex = getIndex(x, y + 1, z);
|
||||
if (hasIndex(aboveIndex))
|
||||
{
|
||||
if (Math.abs(_blocks[aboveIndex]) == Material.GOLD_PLATE.getId())
|
||||
if (Math.abs(_blocks[aboveIndex]) == Material.GOLD_PLATE.getId() || Math.abs(_blocks[aboveIndex]) == Material.IRON_PLATE.getId())
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Block block = originLocation.getWorld().getBlockAt(startX + x, startY + y, startZ + z);
|
||||
block.setTypeIdAndData(materialId, _blockData[index], false);
|
||||
UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -80,7 +83,7 @@ public class Schematic
|
||||
*
|
||||
* @return true if a location was added to the DataLocationMap
|
||||
*/
|
||||
private boolean addDataWool(DataLocationMap map, Location origin, int x, int y, int z)
|
||||
private boolean addDataWool(DataLocationMap map, boolean gold, Location origin, int x, int y, int z)
|
||||
{
|
||||
int index = getIndex(x, y, z);
|
||||
if (hasIndex(index))
|
||||
@ -92,7 +95,14 @@ public class Schematic
|
||||
DyeColor color = DyeColor.getByWoolData(data);
|
||||
if (color != null)
|
||||
{
|
||||
map.addLocation(color, origin.clone().add(x + 0.5, y + 0.5, z + 0.5));
|
||||
if (gold)
|
||||
{
|
||||
map.addGoldLocation(color, origin.clone().add(x, y, z));
|
||||
}
|
||||
else
|
||||
{
|
||||
map.addIronLocation(color, origin.clone().add(x, y, z));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -24,16 +24,18 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
private JavaPlugin _javaPlugin;
|
||||
private String _name;
|
||||
private String _description;
|
||||
private String _extraDescription;
|
||||
|
||||
private HashMap<UUID, Data> _active;
|
||||
private List<ObjectiveListener> _listeners;
|
||||
|
||||
public Objective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
public Objective(Plugin plugin, JavaPlugin javaPlugin, String name, String description, String extraDescription)
|
||||
{
|
||||
_plugin = plugin;
|
||||
_javaPlugin = javaPlugin;
|
||||
_name = name;
|
||||
_description = description;
|
||||
_extraDescription = extraDescription;
|
||||
|
||||
_active = new HashMap<>();
|
||||
_listeners = new LinkedList<>();
|
||||
@ -41,6 +43,11 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
javaPlugin.getServer().getPluginManager().registerEvents(this, javaPlugin);
|
||||
}
|
||||
|
||||
public Objective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
{
|
||||
this(plugin, javaPlugin, name, description, null);
|
||||
}
|
||||
|
||||
public Plugin getPlugin()
|
||||
{
|
||||
return _plugin;
|
||||
@ -54,7 +61,7 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
/**
|
||||
* Get the name of this Objective
|
||||
*/
|
||||
public String getName()
|
||||
public String getName(Player player)
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
@ -62,11 +69,20 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
/**
|
||||
* Get the description of this Objective
|
||||
*/
|
||||
public String getDescription()
|
||||
public String getDescription(Player player)
|
||||
{
|
||||
return _description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the extra description for this Objective
|
||||
* Extra description should be any additional useful information that isn't required to complete the objective
|
||||
*/
|
||||
public String getExtraDescription(Player player)
|
||||
{
|
||||
return _extraDescription;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an ObjectiveListener to this Objective
|
||||
* @param listener
|
||||
@ -92,7 +108,7 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
*/
|
||||
public void start(Player player)
|
||||
{
|
||||
System.out.println(String.format("Tutorial> [%s] started objective [%s]", player.getName(), getName()));
|
||||
System.out.println(String.format("Tutorial> [%s] started objective [%s]", player.getName(), getName(player)));
|
||||
|
||||
Data data = createDataObject(player);
|
||||
_active.put(player.getUniqueId(), data);
|
||||
@ -138,7 +154,7 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
|
||||
protected final void finish(Player player)
|
||||
{
|
||||
System.out.println(String.format("Tutorial> [%s] finished objective [%s]", player.getName(), getName()));
|
||||
System.out.println(String.format("Tutorial> [%s] finished objective [%s]", player.getName(), getName(player)));
|
||||
|
||||
_active.remove(player.getUniqueId());
|
||||
|
||||
@ -147,6 +163,11 @@ public abstract class Objective<Plugin, Data extends ObjectiveData> implements L
|
||||
_listeners.forEach(listener -> listener.onObjectiveFinish(player, this));
|
||||
}
|
||||
|
||||
protected final void notifyUpdate(Player player)
|
||||
{
|
||||
_listeners.forEach(listener -> listener.onObjectivePlayerUpdate(player, this));
|
||||
}
|
||||
|
||||
protected abstract void customFinish(Player player);
|
||||
|
||||
public boolean contains(Player player)
|
||||
|
@ -7,33 +7,45 @@ import java.util.UUID;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public abstract class ObjectiveGoal implements Listener
|
||||
public abstract class ObjectiveGoal <T extends Objective> implements Listener
|
||||
{
|
||||
private Objective _objective;
|
||||
private T _objective;
|
||||
|
||||
private HashSet<UUID> _active;
|
||||
private String _name;
|
||||
private String _description;
|
||||
private String _extraDescription;
|
||||
|
||||
public ObjectiveGoal(Objective objective, String name, String description)
|
||||
public ObjectiveGoal(T objective, String name, String description)
|
||||
{
|
||||
this(objective, name, description, null);
|
||||
}
|
||||
|
||||
public ObjectiveGoal(T objective, String name, String description, String extraDescription)
|
||||
{
|
||||
_objective = objective;
|
||||
|
||||
_active = new HashSet<>();
|
||||
_name = name;
|
||||
_description = description;
|
||||
_extraDescription = extraDescription;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
public String getName(Player player)
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public String getDescription()
|
||||
public String getDescription(Player player)
|
||||
{
|
||||
return _description;
|
||||
}
|
||||
|
||||
public String getExtraDescription(Player player)
|
||||
{
|
||||
return _extraDescription;
|
||||
}
|
||||
|
||||
public Set<UUID> getActivePlayers()
|
||||
{
|
||||
return _active;
|
||||
@ -51,7 +63,7 @@ public abstract class ObjectiveGoal implements Listener
|
||||
|
||||
public final void start(Player player)
|
||||
{
|
||||
System.out.println(String.format("Tutorial> [%s] started objective goal [%s]", player.getName(), getName()));
|
||||
System.out.println(String.format("Tutorial> [%s] started objective goal [%s]", player.getName(), getName(player)));
|
||||
|
||||
_active.add(player.getUniqueId());
|
||||
customStart(player);
|
||||
@ -65,7 +77,7 @@ public abstract class ObjectiveGoal implements Listener
|
||||
{
|
||||
if (_active.contains(player.getUniqueId()))
|
||||
{
|
||||
System.out.println(String.format("Tutorial> [%s] finished objective goal [%s]", player.getName(), getName()));
|
||||
System.out.println(String.format("Tutorial> [%s] finished objective goal [%s]", player.getName(), getName(player)));
|
||||
|
||||
_active.remove(player.getUniqueId());
|
||||
customFinish(player);
|
||||
@ -74,4 +86,9 @@ public abstract class ObjectiveGoal implements Listener
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public T getObjective()
|
||||
{
|
||||
return _objective;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,20 @@ import org.bukkit.entity.Player;
|
||||
|
||||
public interface ObjectiveListener
|
||||
{
|
||||
/**
|
||||
* Called when a player starts an objective
|
||||
*/
|
||||
public void onObjectiveStart(Player player, Objective objective);
|
||||
|
||||
/**
|
||||
* Called when a player progresses in an objective
|
||||
* For example, in an OrderedObjective this will be called when the player
|
||||
* moves to the next ObjectiveGoal
|
||||
*/
|
||||
public void onObjectivePlayerUpdate(Player player, Objective objective);
|
||||
|
||||
/**
|
||||
* Called when a player finishes an objective
|
||||
*/
|
||||
public void onObjectiveFinish(Player player, Objective objective);
|
||||
}
|
||||
|
@ -13,13 +13,18 @@ public abstract class OrderedObjective<Plugin> extends Objective<Plugin, Ordered
|
||||
{
|
||||
private List<ObjectiveGoal> _goals;
|
||||
|
||||
public OrderedObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
public OrderedObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description, String extraDescription)
|
||||
{
|
||||
super(plugin, javaPlugin, name, description);
|
||||
super(plugin, javaPlugin, name, description, extraDescription);
|
||||
|
||||
_goals = new ArrayList<>();
|
||||
}
|
||||
|
||||
public OrderedObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
{
|
||||
this(plugin, javaPlugin, name, description, null);
|
||||
}
|
||||
|
||||
protected void addGoal(ObjectiveGoal goal)
|
||||
{
|
||||
_goals.add(goal);
|
||||
@ -48,9 +53,34 @@ public abstract class OrderedObjective<Plugin> extends Objective<Plugin, Ordered
|
||||
else
|
||||
{
|
||||
setGoal(player, data.getIndex() + 1);
|
||||
notifyUpdate(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName(Player player)
|
||||
{
|
||||
OrderedObjectiveData data = getData(player);
|
||||
int index = data == null ? 0 : data.getIndex();
|
||||
return _goals.get(index).getName(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription(Player player)
|
||||
{
|
||||
OrderedObjectiveData data = getData(player);
|
||||
int index = data == null ? 0 : data.getIndex();
|
||||
return _goals.get(index).getDescription(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getExtraDescription(Player player)
|
||||
{
|
||||
OrderedObjectiveData data = getData(player);
|
||||
int index = data == null ? 0 : data.getIndex();
|
||||
return _goals.get(index).getExtraDescription(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void customStart(Player player)
|
||||
{
|
||||
@ -77,7 +107,7 @@ public abstract class OrderedObjective<Plugin> extends Objective<Plugin, Ordered
|
||||
if (contains(player))
|
||||
{
|
||||
OrderedObjectiveData data = getData(player);
|
||||
lines.add(" " + getName());
|
||||
// lines.add(" " + getName());
|
||||
|
||||
for (int i = 0; i < _goals.size(); i++)
|
||||
{
|
||||
@ -90,7 +120,7 @@ public abstract class OrderedObjective<Plugin> extends Objective<Plugin, Ordered
|
||||
else
|
||||
prefix = ChatColor.GREEN.toString();
|
||||
|
||||
lines.add(" " + prefix + _goals.get(i).getName());
|
||||
lines.add(" " + prefix + _goals.get(i).getName(player));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,13 +10,18 @@ public abstract class SingleObjective<Plugin> extends Objective<Plugin, Objectiv
|
||||
{
|
||||
private final ObjectiveData _nullData;
|
||||
|
||||
public SingleObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
public SingleObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description, String extraDescription)
|
||||
{
|
||||
super(plugin, javaPlugin, name, description);
|
||||
super(plugin, javaPlugin, name, description, extraDescription);
|
||||
|
||||
_nullData = new ObjectiveData();
|
||||
}
|
||||
|
||||
public SingleObjective(Plugin plugin, JavaPlugin javaPlugin, String name, String description)
|
||||
{
|
||||
this(plugin, javaPlugin, name, description, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ObjectiveData createDataObject(Player player)
|
||||
{
|
||||
@ -40,7 +45,7 @@ public abstract class SingleObjective<Plugin> extends Objective<Plugin, Objectiv
|
||||
{
|
||||
if (contains(player))
|
||||
{
|
||||
lines.add(" " + getName());
|
||||
lines.add(" " + getName(player));
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ package mineplex.core.common.util;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Queue;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -30,6 +31,7 @@ import org.bukkit.material.Bed;
|
||||
import net.minecraft.server.v1_8_R3.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R3.Blocks;
|
||||
import net.minecraft.server.v1_8_R3.EnumDirection;
|
||||
import net.minecraft.server.v1_8_R3.IBlockData;
|
||||
import net.minecraft.server.v1_8_R3.Item;
|
||||
import net.minecraft.server.v1_8_R3.MathHelper;
|
||||
import net.minecraft.server.v1_8_R3.MinecraftKey;
|
||||
@ -1463,4 +1465,19 @@ public class UtilBlock
|
||||
|
||||
return state.update(false, false);
|
||||
}
|
||||
|
||||
public static void setQuick(World world, int x, int y, int z, int type, byte data)
|
||||
{
|
||||
int cx = x >> 4;
|
||||
int cz = z >> 4;
|
||||
if (!world.isChunkLoaded(cx, cz))
|
||||
{
|
||||
world.loadChunk(cx, cz, true);
|
||||
}
|
||||
|
||||
net.minecraft.server.v1_8_R3.Chunk chunk = ((CraftWorld) world).getHandle().getChunkAt(x >> 4, z >> 4);
|
||||
BlockPosition pos = new BlockPosition(x, y, z);
|
||||
IBlockData ibd = net.minecraft.server.v1_8_R3.Block.getById(type).fromLegacyData(data);
|
||||
chunk.a(pos, ibd);
|
||||
}
|
||||
}
|
||||
|
@ -789,4 +789,29 @@ public class UtilPlayer
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isGliding(Player player)
|
||||
{
|
||||
return ((CraftPlayer) player).getHandle().isGliding();
|
||||
}
|
||||
|
||||
public static void setGliding(Player player, boolean gliding)
|
||||
{
|
||||
((CraftPlayer) player).getHandle().setGliding(gliding);
|
||||
}
|
||||
|
||||
public static void setAutoDeploy(Player player, boolean autoDeploy)
|
||||
{
|
||||
((CraftPlayer) player).getHandle().setAutoWingsDeploy(autoDeploy);
|
||||
}
|
||||
|
||||
public static void setGlidableWithoutWings(Player player, boolean glidableWithoutWings)
|
||||
{
|
||||
((CraftPlayer) player).getHandle().setGlidableWithoutWings(glidableWithoutWings);
|
||||
}
|
||||
|
||||
public static void setAutoDeployDistance(Player player, float distance)
|
||||
{
|
||||
((CraftPlayer) player).getHandle().setWingsDeployAt(distance);
|
||||
}
|
||||
}
|
||||
|
@ -11,38 +11,40 @@ public class UtilShapes
|
||||
{
|
||||
private final static BlockFace[] radial =
|
||||
{
|
||||
BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST, BlockFace.NORTH,
|
||||
BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST
|
||||
BlockFace.SOUTH,
|
||||
BlockFace.SOUTH_WEST,
|
||||
BlockFace.WEST,
|
||||
BlockFace.NORTH_WEST,
|
||||
BlockFace.NORTH,
|
||||
BlockFace.NORTH_EAST,
|
||||
BlockFace.EAST,
|
||||
BlockFace.SOUTH_EAST
|
||||
};
|
||||
|
||||
public static ArrayList<Location> getCircle(Location loc, boolean hollow, double radius)
|
||||
{
|
||||
return getCircleBlocks(loc, radius, 0, hollow, false);
|
||||
return getSphereBlocks(loc, radius, 0, hollow);
|
||||
}
|
||||
|
||||
public static ArrayList<Location> getSphereBlocks(Location loc, double radius, double height, boolean hollow)
|
||||
{
|
||||
return getCircleBlocks(loc, radius, height, hollow, true);
|
||||
}
|
||||
|
||||
private static ArrayList<Location> getCircleBlocks(Location loc, double radius, double height, boolean hollow, boolean sphere)
|
||||
public static ArrayList<Location> getSphereBlocks(Location loc, double width, double height, boolean hollow)
|
||||
{
|
||||
ArrayList<Location> circleblocks = new ArrayList<Location>();
|
||||
double cx = loc.getBlockX();
|
||||
double cy = loc.getBlockY();
|
||||
double cz = loc.getBlockZ();
|
||||
|
||||
for (double y = (sphere ? cy - radius : cy); y < (sphere ? cy + radius : cy + height + 1); y++)
|
||||
for (double y = height; y < height + 1; y++)
|
||||
{
|
||||
for (double x = cx - radius; x <= cx + radius; x++)
|
||||
for (double x = -width; x <= width; x++)
|
||||
{
|
||||
for (double z = cz - radius; z <= cz + radius; z++)
|
||||
for (double z = -width; z <= width; z++)
|
||||
{
|
||||
double dist = (cx - x) * (cx - x) + (cz - z) * (cz - z) + (sphere ? (cy - y) * (cy - y) : 0);
|
||||
double dist = (x * x) + (z * z) + (y * y);
|
||||
|
||||
if (dist < radius * radius && !(hollow && dist < (radius - 1) * (radius - 1)))
|
||||
if (dist < width * width
|
||||
&& !(hollow && Math.abs(x) - width < 1 && Math.abs(z) - width < 1 && Math.abs(y) - height < 1))
|
||||
{
|
||||
Location l = new Location(loc.getWorld(), x, y, z);
|
||||
Location l = new Location(loc.getWorld(), x + cx, y + cy, z + cz);
|
||||
circleblocks.add(l);
|
||||
}
|
||||
}
|
||||
@ -75,7 +77,8 @@ public class UtilShapes
|
||||
right = radial[high];
|
||||
return new BlockFace[]
|
||||
{
|
||||
left, right
|
||||
left,
|
||||
right
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -87,13 +90,19 @@ public class UtilShapes
|
||||
BlockFace[] faces = getSideBlockFaces(facing);
|
||||
return new Block[]
|
||||
{
|
||||
b.getRelative(faces[0]), b.getRelative(faces[1])
|
||||
b.getRelative(faces[0]),
|
||||
b.getRelative(faces[1])
|
||||
};
|
||||
}
|
||||
|
||||
public static BlockFace getFacing(float yaw)
|
||||
{
|
||||
return radial[Math.round(yaw / 45f) & 0x7];
|
||||
return radial[Math.round(yaw / 45f) % 8];
|
||||
}
|
||||
|
||||
public static float getFacing(BlockFace face)
|
||||
{
|
||||
return UtilAlg.GetYaw(new Vector(face.getModX(), face.getModY(), face.getModZ()).normalize());
|
||||
}
|
||||
|
||||
public static ArrayList<Location> getLinesDistancedPoints(Location startingPoint, Location endingPoint,
|
||||
@ -133,6 +142,24 @@ public class UtilShapes
|
||||
return locs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotates the blocks around 0,0,0
|
||||
*/
|
||||
public static ArrayList<Location> rotate(ArrayList<Location> locs, double degree)
|
||||
{
|
||||
ArrayList<Location> rotated = new ArrayList<Location>();
|
||||
|
||||
for (Location loc : locs)
|
||||
{
|
||||
double xRot = Math.cos(degree) * (loc.getX()) - Math.sin(degree) * (loc.getZ());
|
||||
double zRot = loc.getZ() + Math.sin(degree) * (loc.getX()) + Math.cos(degree) * (loc.getZ());
|
||||
|
||||
rotated.add(new Location(loc.getWorld(), xRot, loc.getY(), zRot));
|
||||
}
|
||||
|
||||
return rotated;
|
||||
}
|
||||
|
||||
public static ArrayList<Location> getDistancedCircle(Location center, double pointsDistance, double circleRadius)
|
||||
{
|
||||
return getPointsInCircle(center, (int) ((circleRadius * Math.PI * 2) / pointsDistance), circleRadius);
|
||||
@ -157,12 +184,14 @@ public class UtilShapes
|
||||
|
||||
new int[]
|
||||
{
|
||||
allowDiagonal ? facing.getModX() : facing.getModZ(), allowDiagonal ? 0 : -facing.getModX()
|
||||
allowDiagonal ? facing.getModX() : facing.getModZ(),
|
||||
allowDiagonal ? 0 : -facing.getModX()
|
||||
},
|
||||
|
||||
new int[]
|
||||
{
|
||||
allowDiagonal ? 0 : -facing.getModZ(), allowDiagonal ? facing.getModZ() : facing.getModX()
|
||||
allowDiagonal ? 0 : -facing.getModZ(),
|
||||
allowDiagonal ? facing.getModZ() : facing.getModX()
|
||||
}
|
||||
};
|
||||
|
||||
@ -189,7 +218,8 @@ public class UtilShapes
|
||||
{
|
||||
faces = new BlockFace[]
|
||||
{
|
||||
faces[1], faces[0]
|
||||
faces[1],
|
||||
faces[0]
|
||||
};
|
||||
}
|
||||
|
||||
@ -228,7 +258,8 @@ public class UtilShapes
|
||||
|
||||
return new Block[]
|
||||
{
|
||||
b.getRelative(faces[0]), b.getRelative(faces[1])
|
||||
b.getRelative(faces[0]),
|
||||
b.getRelative(faces[1])
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ import net.minecraft.server.v1_8_R3.PacketPlayOutAttachEntity;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutNewAttachEntity;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntity;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
|
||||
|
||||
@ -67,9 +68,9 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
{
|
||||
super("Custom Tag Fix", plugin);
|
||||
|
||||
packetHandler.addPacketHandler(this, true, PacketPlayOutAttachEntity.class, PacketPlayOutEntityDestroy.class,
|
||||
PacketPlayOutEntityMetadata.class, PacketPlayOutSpawnEntity.class, PacketPlayOutSpawnEntityLiving.class,
|
||||
PacketPlayOutNamedEntitySpawn.class, PacketPlayInUseEntity.class, PacketPlayOutAttachEntity.class);
|
||||
packetHandler.addPacketHandler(this, true, PacketPlayOutEntityDestroy.class, PacketPlayOutEntityMetadata.class,
|
||||
PacketPlayOutSpawnEntity.class, PacketPlayOutSpawnEntityLiving.class, PacketPlayOutNamedEntitySpawn.class,
|
||||
PacketPlayInUseEntity.class, PacketPlayOutAttachEntity.class, PacketPlayOutNewAttachEntity.class);
|
||||
|
||||
// NCPHookManager.addHook(CheckType.MOVING_SURVIVALFLY, this);
|
||||
// NCPHookManager.addHook(CheckType.MOVING_PASSABLE, this);
|
||||
@ -121,7 +122,8 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
@EventHandler
|
||||
public void ncpExemptVelocity(final PlayerVelocityEvent event)
|
||||
{
|
||||
long ignoreTime = System.currentTimeMillis() + (long) (event.getVelocity().length() * 2000);
|
||||
long ignoreTime = System.currentTimeMillis() + (long) (event.getVelocity().length() * 1500);
|
||||
|
||||
if (_exemptTimeMap.containsKey(event.getPlayer().getUniqueId()))
|
||||
{
|
||||
_exemptTimeMap.put(event.getPlayer().getUniqueId(),
|
||||
@ -256,15 +258,16 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
return;
|
||||
}
|
||||
|
||||
int newId = UtilEnt.getNewEntityId();
|
||||
Integer[] ids = new Integer[]
|
||||
{
|
||||
UtilEnt.getNewEntityId(),
|
||||
UtilEnt.getNewEntityId()
|
||||
};
|
||||
|
||||
_entityNameMap.get(owner.getName()).put(spawnPacket.a, entityName);
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, new Integer[]
|
||||
{
|
||||
newId
|
||||
});
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, ids);
|
||||
|
||||
sendProtocolPackets(owner, spawnPacket.a, newId, entityName, verifier, true, -1);
|
||||
sendProtocolPackets(owner, spawnPacket.a, entityName, verifier, true, ids);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -301,17 +304,16 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
return;
|
||||
}
|
||||
|
||||
int newId = UtilEnt.getNewEntityId();
|
||||
int newId2 = UtilEnt.getNewEntityId();
|
||||
Integer[] ids = new Integer[]
|
||||
{
|
||||
UtilEnt.getNewEntityId(),
|
||||
UtilEnt.getNewEntityId()
|
||||
};
|
||||
|
||||
_entityNameMap.get(owner.getName()).put(spawnPacket.a, entityName);
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, new Integer[]
|
||||
{
|
||||
newId,
|
||||
newId2
|
||||
});
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, ids);
|
||||
|
||||
sendProtocolPackets(owner, spawnPacket.a, newId2, entityName, verifier, true, newId);
|
||||
sendProtocolPackets(owner, spawnPacket.a, entityName, verifier, true, ids);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -331,13 +333,13 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
|
||||
String newName = currentName;
|
||||
boolean newDisplay = isDisplaying;
|
||||
boolean displayName = isDisplaying;
|
||||
|
||||
for (WatchableObject watchable : (List<WatchableObject>) metaPacket.b)
|
||||
{
|
||||
if (watchable.a() == 3 && watchable.b() instanceof Byte)
|
||||
{
|
||||
newDisplay = ((Byte) watchable.b()) == 1;
|
||||
displayName = ((Byte) watchable.b()) == 1;
|
||||
}
|
||||
|
||||
if (watchable.a() == 2 && watchable.b() instanceof String)
|
||||
@ -347,10 +349,10 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
|
||||
// If the name has changed and the name should be showing, or the name display status has changed.
|
||||
if ((!newName.equals(currentName) && newDisplay) || newDisplay != isDisplaying)
|
||||
if ((!newName.equals(currentName) && displayName) || displayName != isDisplaying)
|
||||
{
|
||||
// If name is still being displayed
|
||||
if (newDisplay)
|
||||
if (displayName)
|
||||
{
|
||||
Integer[] newId;
|
||||
|
||||
@ -363,6 +365,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
{
|
||||
newId = new Integer[]
|
||||
{
|
||||
UtilEnt.getNewEntityId(),
|
||||
UtilEnt.getNewEntityId()
|
||||
};
|
||||
|
||||
@ -370,7 +373,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
|
||||
_entityNameMap.get(owner.getName()).put(metaPacket.a, newName);
|
||||
sendProtocolPackets(owner, metaPacket.a, newId[0], newName, verifier, !isDisplaying, -1);
|
||||
sendProtocolPackets(owner, metaPacket.a, newName, verifier, !isDisplaying, newId);
|
||||
}
|
||||
else
|
||||
{ // Lets delete it
|
||||
@ -451,9 +454,25 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (packet instanceof PacketPlayOutAttachEntity)
|
||||
else if (packet instanceof PacketPlayOutAttachEntity || packet instanceof PacketPlayOutNewAttachEntity)
|
||||
{
|
||||
int vech = -1;
|
||||
int rider = -1;
|
||||
|
||||
if (packet instanceof PacketPlayOutAttachEntity)
|
||||
{
|
||||
PacketPlayOutAttachEntity attachPacket = (PacketPlayOutAttachEntity) packet;
|
||||
vech = attachPacket.b;
|
||||
rider = attachPacket.c;
|
||||
}
|
||||
else if (packet instanceof PacketPlayOutNewAttachEntity)
|
||||
{
|
||||
PacketPlayOutNewAttachEntity attachPacket = (PacketPlayOutNewAttachEntity) packet;
|
||||
vech = attachPacket.a;
|
||||
|
||||
if (attachPacket.b.length > 0)
|
||||
rider = attachPacket.b[0];
|
||||
}
|
||||
|
||||
// c = rider, b = ridden
|
||||
// When detaching, c is sent, b is -1
|
||||
@ -472,27 +491,27 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
|
||||
int vehicleId = -1;
|
||||
|
||||
if (_entityRiding.get(owner.getName()).containsKey(attachPacket.b))
|
||||
if (_entityRiding.get(owner.getName()).containsKey(vech))
|
||||
{
|
||||
vehicleId = _entityRiding.get(owner.getName()).get(attachPacket.b);
|
||||
vehicleId = _entityRiding.get(owner.getName()).get(vech);
|
||||
}
|
||||
|
||||
if (attachPacket.c == -1 && _entityMap.get(owner.getName()).containsKey(vehicleId))
|
||||
if (rider == -1 && _entityMap.get(owner.getName()).containsKey(vehicleId))
|
||||
{
|
||||
Integer[] ids = _entityMap.get(owner.getName()).get(vehicleId);
|
||||
|
||||
_entityRiding.get(owner.getName()).remove(attachPacket.b);
|
||||
_entityRiding.get(owner.getName()).remove(vech);
|
||||
|
||||
sendProtocolPackets(owner, vehicleId, ids[ids.length - 1], _entityNameMap.get(owner.getName()).get(vehicleId),
|
||||
verifier, true, ids.length > 1 ? ids[0] : -1);
|
||||
sendProtocolPackets(owner, vehicleId, _entityNameMap.get(owner.getName()).get(vehicleId), verifier, true,
|
||||
ids);
|
||||
}
|
||||
else
|
||||
{
|
||||
Integer[] ids = _entityMap.get(owner.getName()).get(attachPacket.c);
|
||||
Integer[] ids = _entityMap.get(owner.getName()).get(rider);
|
||||
|
||||
if (ids != null && ids[0] != attachPacket.b)
|
||||
if (ids != null && ids[1] != vech)
|
||||
{
|
||||
_entityRiding.get(owner.getName()).put(attachPacket.b, attachPacket.c);
|
||||
_entityRiding.get(owner.getName()).put(vech, rider);
|
||||
|
||||
int[] newIds = new int[ids.length];
|
||||
|
||||
@ -508,8 +527,8 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
}
|
||||
|
||||
private void sendProtocolPackets(final Player owner, final int entityId, final int newEntityId, String entityName,
|
||||
final PacketVerifier packetList, final boolean newPacket, final int squidId)
|
||||
private void sendProtocolPackets(final Player owner, final int entityId, String entityName, final PacketVerifier packetList,
|
||||
final boolean newPacket, final Integer[] entityIds)
|
||||
{
|
||||
CustomTagEvent event = new CustomTagEvent(owner, entityId, entityName);
|
||||
_plugin.getServer().getPluginManager().callEvent(event);
|
||||
@ -521,31 +540,39 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
{
|
||||
DataWatcher watcher = new DataWatcher(new DummyEntity(((CraftWorld) owner.getWorld()).getHandle()));
|
||||
|
||||
watcher.a(0, (byte) (0 | 1 << 5), Entity.META_ENTITYDATA, (byte) (0 | 1 << 5)); // Invisible
|
||||
watcher.a(0, (byte) 32, Entity.META_ENTITYDATA, (byte) 32); // Invisible
|
||||
watcher.a(1, Short.valueOf((short) 300), Entity.META_AIR, 0);
|
||||
watcher.a(2, finalEntityName, Entity.META_CUSTOMNAME, finalEntityName);
|
||||
watcher.a(3, (byte) 1, Entity.META_CUSTOMNAME_VISIBLE, true);
|
||||
watcher.a(10, (byte) (0 | 0x1), EntityArmorStand.META_ARMOR_OPTION, (byte) (0 | 0x1)); // Small
|
||||
watcher.a(10, (byte) 16, EntityArmorStand.META_ARMOR_OPTION, (byte) 16); // Small
|
||||
|
||||
if (newPacket)
|
||||
{
|
||||
if (squidId >= 0)
|
||||
{
|
||||
watcher.watch(10, (byte) 16, EntityArmorStand.META_ARMOR_OPTION, (byte) 16);
|
||||
|
||||
DataWatcher squidWatcher = new DataWatcher(new DummyEntity(((CraftWorld) owner.getWorld()).getHandle()));
|
||||
squidWatcher.a(0, (byte) (0 | 1 << 5), Entity.META_ENTITYDATA, (byte) (0 | 1 << 5));
|
||||
squidWatcher.a(0, (byte) 32, Entity.META_ENTITYDATA, (byte) 32);
|
||||
|
||||
PacketPlayOutSpawnEntityLiving spawnPacket = new PacketPlayOutSpawnEntityLiving();
|
||||
spawnPacket.a = squidId;
|
||||
spawnPacket.a = entityIds[1];
|
||||
spawnPacket.b = (byte) EntityType.SQUID.getTypeId();
|
||||
spawnPacket.c = 1000000;
|
||||
spawnPacket.c = owner.getLocation().getBlockX() * 32;
|
||||
spawnPacket.d = -150;
|
||||
spawnPacket.e = owner.getLocation().getBlockZ() * 32;
|
||||
|
||||
spawnPacket.l = squidWatcher;
|
||||
spawnPacket.uuid = UUID.randomUUID();
|
||||
|
||||
UtilPlayer.sendPacket(owner, spawnPacket);
|
||||
|
||||
if (UtilPlayer.is1_9(owner))
|
||||
{
|
||||
UtilPlayer.sendPacket(owner, new PacketPlayOutNewAttachEntity(entityId, new int[]
|
||||
{
|
||||
entityIds[1]
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
PacketPlayOutAttachEntity vehiclePacket = new PacketPlayOutAttachEntity();
|
||||
vehiclePacket.a = 0;
|
||||
vehiclePacket.b = spawnPacket.a;
|
||||
@ -553,28 +580,41 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
|
||||
UtilPlayer.sendPacket(owner, vehiclePacket);
|
||||
}
|
||||
}
|
||||
|
||||
PacketPlayOutSpawnEntityLiving spawnPacket = new PacketPlayOutSpawnEntityLiving();
|
||||
spawnPacket.a = newEntityId;
|
||||
spawnPacket.a = entityIds[0];
|
||||
spawnPacket.b = (byte) 30;
|
||||
spawnPacket.c = 1000000;
|
||||
spawnPacket.c = owner.getLocation().getBlockX() * 32;
|
||||
spawnPacket.d = -150;
|
||||
spawnPacket.e = owner.getLocation().getBlockZ() * 32;
|
||||
|
||||
spawnPacket.l = watcher;
|
||||
spawnPacket.uuid = UUID.randomUUID();
|
||||
|
||||
UtilPlayer.sendPacket(owner, spawnPacket);
|
||||
|
||||
if (UtilPlayer.is1_9(owner))
|
||||
{
|
||||
UtilPlayer.sendPacket(owner, new PacketPlayOutNewAttachEntity(entityIds[1], new int[]
|
||||
{
|
||||
entityIds[0]
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
PacketPlayOutAttachEntity vehiclePacket = new PacketPlayOutAttachEntity();
|
||||
vehiclePacket.a = 0;
|
||||
vehiclePacket.b = spawnPacket.a;
|
||||
vehiclePacket.c = squidId >= 0 ? squidId : entityId;
|
||||
vehiclePacket.b = entityIds[0];
|
||||
vehiclePacket.c = entityIds[1];
|
||||
|
||||
UtilPlayer.sendPacket(owner, vehiclePacket);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PacketPlayOutEntityMetadata entityMetadata = new PacketPlayOutEntityMetadata();
|
||||
entityMetadata.a = newEntityId;
|
||||
entityMetadata.a = entityIds[0];
|
||||
entityMetadata.b = watcher.c();
|
||||
|
||||
packetList.bypassProcess(entityMetadata);
|
||||
|
@ -1,5 +1,8 @@
|
||||
package mineplex.core;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
@ -7,6 +10,7 @@ import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scheduler.BukkitScheduler;
|
||||
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import mineplex.core.command.CommandCenter;
|
||||
import mineplex.core.command.ICommand;
|
||||
import mineplex.core.common.util.F;
|
||||
@ -16,6 +20,9 @@ import mineplex.core.common.util.UtilTime.TimeUnit;
|
||||
|
||||
public abstract class MiniPlugin implements Listener
|
||||
{
|
||||
private static final ExecutorService threadPool = Executors.newCachedThreadPool(
|
||||
new ThreadFactoryBuilder().setNameFormat("MiniPlugin Async %1$d").build());
|
||||
|
||||
protected String _moduleName = "Default";
|
||||
protected JavaPlugin _plugin;
|
||||
protected NautHashMap<String, ICommand> _commands;
|
||||
@ -110,7 +117,8 @@ public abstract class MiniPlugin implements Listener
|
||||
|
||||
public void runAsync(Runnable runnable)
|
||||
{
|
||||
_plugin.getServer().getScheduler().runTaskAsynchronously(_plugin, runnable);
|
||||
// Instead of using
|
||||
threadPool.execute(runnable);
|
||||
}
|
||||
|
||||
public void runAsync(Runnable runnable, long time)
|
||||
|
@ -1,8 +1,8 @@
|
||||
package mineplex.core.account;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.UUID;
|
||||
@ -49,8 +49,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
private NautHashMap<String, CoreClient> _clientList;
|
||||
private HashSet<String> _duplicateLoginGlitchPreventionList;
|
||||
|
||||
private NautHashMap<String, ILoginProcessor> _loginProcessors = new NautHashMap<String, ILoginProcessor>();
|
||||
private LinkedList<IQuerylessLoginProcessor> _querylessLoginProcessors = new LinkedList<IQuerylessLoginProcessor>();
|
||||
private List<ILoginProcessor> _loginProcessors = new ArrayList<>();
|
||||
|
||||
private Object _clientLock = new Object();
|
||||
|
||||
@ -260,7 +259,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
|
||||
CoreClient client = Add(playerName);
|
||||
client.SetRank(Rank.valueOf(token.Rank), false);
|
||||
client.setAccountId(_repository.login(_loginProcessors, _querylessLoginProcessors, uuid.toString(), client.GetPlayerName()));
|
||||
client.setAccountId(_repository.login(_loginProcessors, uuid, client.GetPlayerName()));
|
||||
|
||||
// JSON sql response
|
||||
Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
|
||||
@ -332,7 +331,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
|
||||
CoreClient client = Add(playerName);
|
||||
client.SetRank(Rank.valueOf(token.Rank), false);
|
||||
client.setAccountId(_repository.login(_loginProcessors, _querylessLoginProcessors, uuid.toString(), client.GetPlayerName()));
|
||||
client.setAccountId(_repository.login(_loginProcessors, uuid, client.GetPlayerName()));
|
||||
|
||||
// JSON sql response
|
||||
Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
|
||||
@ -378,7 +377,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
client.setAccountId(_repository.login(_loginProcessors, _querylessLoginProcessors, uuid.toString(), client.GetPlayerName()));
|
||||
client.setAccountId(_repository.login(_loginProcessors, uuid, client.GetPlayerName()));
|
||||
_clientLoginLock.remove(client.GetPlayerName());
|
||||
}
|
||||
});
|
||||
@ -387,6 +386,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
String response = _repository.GetClient(client.GetPlayerName(), uuid, ipAddress);
|
||||
TimingManager.stop(client.GetPlayerName() + " GetClient.");
|
||||
|
||||
TimingManager.start(client.GetPlayerName() + " Event.");
|
||||
token = gson.fromJson(response, ClientToken.class);
|
||||
|
||||
client.SetRank(Rank.valueOf(token.Rank), false);
|
||||
@ -395,7 +395,9 @@ public class CoreClientManager extends MiniPlugin
|
||||
|
||||
// JSON sql response
|
||||
Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
|
||||
TimingManager.stop(client.GetPlayerName() + " Event.");
|
||||
|
||||
TimingManager.start(client.GetPlayerName() + " While Loop.");
|
||||
while (_clientLoginLock.containsKey(client.GetPlayerName()) && System.currentTimeMillis() - timeStart < 15000)
|
||||
{
|
||||
try
|
||||
@ -407,6 +409,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
TimingManager.stop(client.GetPlayerName() + " While Loop.");
|
||||
|
||||
if (_clientLoginLock.containsKey(client.GetPlayerName()))
|
||||
{
|
||||
@ -646,12 +649,7 @@ public class CoreClientManager extends MiniPlugin
|
||||
|
||||
public void addStoredProcedureLoginProcessor(ILoginProcessor processor)
|
||||
{
|
||||
_loginProcessors.put(processor.getName(), processor);
|
||||
}
|
||||
|
||||
public void addStoredProcedureLoginProcessor(IQuerylessLoginProcessor processor)
|
||||
{
|
||||
_querylessLoginProcessors.add(processor);
|
||||
_loginProcessors.add(processor);
|
||||
}
|
||||
|
||||
public boolean hasRank(Player player, Rank rank)
|
||||
@ -662,10 +660,4 @@ public class CoreClientManager extends MiniPlugin
|
||||
|
||||
return client.GetRank().has(rank);
|
||||
}
|
||||
|
||||
public int getCachedClientAccountId(UUID uuid)
|
||||
{
|
||||
PlayerInfo playerInfo = PlayerCache.getInstance().getPlayer(uuid);
|
||||
return playerInfo == null ? -1 : playerInfo.getAccountId();
|
||||
}
|
||||
}
|
@ -6,23 +6,20 @@ import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import mineplex.cache.player.PlayerCache;
|
||||
import mineplex.core.account.ILoginProcessor;
|
||||
import mineplex.core.account.IQuerylessLoginProcessor;
|
||||
import mineplex.core.account.repository.token.LoginToken;
|
||||
import mineplex.core.account.repository.token.RankUpdateToken;
|
||||
import mineplex.core.common.Rank;
|
||||
import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.common.util.EnclosedObject;
|
||||
import mineplex.core.common.util.NautHashMap;
|
||||
import mineplex.core.database.MinecraftRepository;
|
||||
import mineplex.core.server.remotecall.JsonWebCall;
|
||||
import mineplex.serverdata.database.DBPool;
|
||||
@ -60,24 +57,32 @@ public class AccountRepository extends MinecraftRepository
|
||||
//executeUpdate(CREATE_ACCOUNT_TABLE);
|
||||
}
|
||||
|
||||
public int login(NautHashMap<String, ILoginProcessor> loginProcessors, LinkedList<IQuerylessLoginProcessor> querylessLoginProcessors, String uuid, String name)
|
||||
public int login(final List<ILoginProcessor> loginProcessors, final UUID uuid, final String name)
|
||||
{
|
||||
// First we try to grab the account id from cache - this saves an extra trip to database
|
||||
int accountId = -1;
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
Statement statement = connection.createStatement()
|
||||
)
|
||||
|
||||
try (Connection connection = getConnection(); Statement statement = connection.createStatement())
|
||||
{
|
||||
int cachedId = PlayerCache.getInstance().getAccountId(uuid);
|
||||
if (cachedId > 0)
|
||||
{
|
||||
accountId = cachedId;
|
||||
System.out.println("Loaded Account ID From Cache [" + name + " - " + accountId + "]");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Player was not found in cache, we need to grab the account id from database
|
||||
statement.execute("SELECT id FROM accounts WHERE accounts.uuid = '" + uuid + "' LIMIT 1;");
|
||||
ResultSet resultSet = statement.getResultSet();
|
||||
|
||||
while (resultSet.next())
|
||||
if (resultSet.next())
|
||||
{
|
||||
accountId = resultSet.getInt(1);
|
||||
}
|
||||
|
||||
if (accountId == -1)
|
||||
else
|
||||
{
|
||||
// Player doesn't exist in our database, add them to the accounts table
|
||||
final List<Integer> tempList = new ArrayList<Integer>(1);
|
||||
|
||||
executeInsert(ACCOUNT_LOGIN_NEW, new ResultSetCallable()
|
||||
@ -90,71 +95,29 @@ public class AccountRepository extends MinecraftRepository
|
||||
tempList.add(resultSet.getInt(1));
|
||||
}
|
||||
}
|
||||
},new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 100, name));
|
||||
}, new ColumnVarChar("uuid", 100, uuid.toString()), new ColumnVarChar("name", 100, name));
|
||||
|
||||
accountId = tempList.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
boolean statementStatus = statement.execute(
|
||||
"UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE accounts.uuid = '" + uuid + "';"
|
||||
+ "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"
|
||||
+ "SELECT items.name, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId INNER JOIN accounts ON accounts.id = ai.accountId WHERE accounts.uuid = '" + uuid + "';"
|
||||
+ "SELECT benefit FROM rankBenefits WHERE rankBenefits.uuid = '" + uuid + "';"
|
||||
+ "SELECT stats.name, value FROM accountStats INNER JOIN stats ON stats.id = accountStats.statId INNER JOIN accounts ON accountStats.accountId = accounts.id WHERE accounts.uuid = '" + uuid + "';"
|
||||
+ "SELECT tA.Name, status, serverName, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource = '" + uuid + "';"
|
||||
+ "SELECT gameType, elo FROM eloRating WHERE uuid = '" + uuid + "';"
|
||||
);
|
||||
*/
|
||||
final int finalId = accountId;
|
||||
final String uuidString = uuid.toString();
|
||||
|
||||
String loginString = "UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE id = '" + accountId + "';";
|
||||
|
||||
for (ILoginProcessor loginProcessor : loginProcessors.values())
|
||||
{
|
||||
loginString += loginProcessor.getQuery(accountId, uuid, name);
|
||||
}
|
||||
// We can use a parallel stream because they will be in the correct order when we collect
|
||||
loginString += loginProcessors.parallelStream().map(processor -> processor.getQuery(finalId, uuidString, name)).collect(Collectors.joining());
|
||||
|
||||
statement.execute(loginString);
|
||||
|
||||
/*
|
||||
while (true)
|
||||
{
|
||||
if (statementStatus)
|
||||
{
|
||||
System.out.println("ResultSet : " + statement.getResultSet().getMetaData().getColumnCount() + " columns:");
|
||||
|
||||
for (int i = 0; i < statement.getResultSet().getMetaData().getColumnCount(); i++)
|
||||
{
|
||||
System.out.println(statement.getResultSet().getMetaData().getColumnName(i + 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (statement.getUpdateCount() == -1)
|
||||
break;
|
||||
|
||||
System.out.println("Update statement : " + statement.getUpdateCount() + " rows affected.");
|
||||
}
|
||||
|
||||
statementStatus = statement.getMoreResults();
|
||||
}
|
||||
|
||||
System.out.println("Done");
|
||||
*/
|
||||
|
||||
statement.getUpdateCount();
|
||||
statement.getMoreResults();
|
||||
|
||||
for (ILoginProcessor loginProcessor : loginProcessors.values())
|
||||
for (ILoginProcessor loginProcessor : loginProcessors)
|
||||
{
|
||||
loginProcessor.processLoginResultSet(name, accountId, statement.getResultSet());
|
||||
loginProcessor.processLoginResultSet(name, finalId, statement.getResultSet());
|
||||
statement.getMoreResults();
|
||||
}
|
||||
|
||||
for (IQuerylessLoginProcessor loginProcessor : querylessLoginProcessors)
|
||||
{
|
||||
loginProcessor.processLogin(name, accountId);
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
@ -190,7 +153,7 @@ public class AccountRepository extends MinecraftRepository
|
||||
|
||||
public UUID getClientUUID(String name)
|
||||
{
|
||||
EnclosedObject<UUID> uuid = new EnclosedObject<>();
|
||||
final List<UUID> uuids = new ArrayList<UUID>();
|
||||
|
||||
executeQuery(SELECT_ACCOUNT_UUID_BY_NAME, new ResultSetCallable()
|
||||
{
|
||||
@ -199,12 +162,15 @@ public class AccountRepository extends MinecraftRepository
|
||||
{
|
||||
while (resultSet.next())
|
||||
{
|
||||
uuid.Set(UUID.fromString(resultSet.getString(1)));
|
||||
uuids.add(UUID.fromString(resultSet.getString(1)));
|
||||
}
|
||||
}
|
||||
}, new ColumnVarChar("name", 100, name));
|
||||
|
||||
return uuid.Get();
|
||||
if (uuids.size() > 0)
|
||||
return uuids.get(0);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public void saveRank(final Callback<Rank> callback, final String name, final UUID uuid, final Rank rank, final boolean perm)
|
||||
|
@ -917,7 +917,7 @@ public class BonusManager extends MiniClientPlugin<BonusClientData> implements I
|
||||
|
||||
if (client.getHologram() == null)
|
||||
{
|
||||
double yAdd = 2.18;
|
||||
double yAdd = 2.3;
|
||||
hologram = new Hologram(_hologramManager, _carlNpc.getLocation().clone().add(0, yAdd, 0), "");
|
||||
hologram.setHologramTarget(Hologram.HologramTarget.WHITELIST);
|
||||
hologram.addPlayer(player);
|
||||
|
@ -5,6 +5,8 @@ import net.minecraft.server.v1_8_R3.EntityWither;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
|
||||
public class DisguiseWither extends DisguiseMonster
|
||||
{
|
||||
public DisguiseWither(org.bukkit.entity.Entity entity)
|
||||
@ -24,6 +26,7 @@ public class DisguiseWither extends DisguiseMonster
|
||||
|
||||
public void setInvulTime(int i)
|
||||
{
|
||||
DataWatcher.watch(17, Integer.valueOf(i), EntityWither.META_INVUL_TIME, i);
|
||||
DataWatcher.watch(20, Integer.valueOf(i), EntityWither.META_INVUL_TIME, i);
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UUIDFetcher;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.donation.DonationManager;
|
||||
|
||||
public class GemCommand extends CommandBase<DonationManager>
|
||||
@ -32,7 +33,11 @@ public class GemCommand extends CommandBase<DonationManager>
|
||||
String gemsString = args[1];
|
||||
Player target = UtilPlayer.searchExact(targetName);
|
||||
|
||||
if (target == null)
|
||||
if (targetName.equalsIgnoreCase("@a"))
|
||||
{
|
||||
rewardAllGems(caller, gemsString);
|
||||
}
|
||||
else if (target == null)
|
||||
{
|
||||
UUID uuid = UUIDFetcher.getUUIDOf(targetName);
|
||||
if (uuid != null)
|
||||
@ -50,6 +55,42 @@ public class GemCommand extends CommandBase<DonationManager>
|
||||
}
|
||||
}
|
||||
|
||||
private void rewardAllGems(Player caller, String gemsString)
|
||||
{
|
||||
try
|
||||
{
|
||||
int gems = Integer.parseInt(gemsString);
|
||||
|
||||
if (gems > 1000)
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Gem", "You can only give everybody 1000 gems at a time."));
|
||||
return;
|
||||
}
|
||||
|
||||
rewardAllGems(caller, gems);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Gem", "Invalid gems Amount"));
|
||||
}
|
||||
}
|
||||
|
||||
private void rewardAllGems(Player caller, int gems)
|
||||
{
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
Plugin.RewardGems(new Callback<Boolean>()
|
||||
{
|
||||
public void run(Boolean completed)
|
||||
{
|
||||
|
||||
}
|
||||
}, caller.getName(), player.getName(), player.getUniqueId(), gems);
|
||||
}
|
||||
|
||||
UtilPlayer.message(caller, F.main("Gem", "Gave everyone " + F.elem(gems + " gems")));
|
||||
}
|
||||
|
||||
private void rewardGems(final Player caller, final Player target, final String targetName, final UUID uuid, String gemsString)
|
||||
{
|
||||
try
|
||||
|
@ -6,8 +6,8 @@ import mineplex.core.common.Rank;
|
||||
import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.donation.DonationManager;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ShardCommand extends CommandBase<DonationManager>
|
||||
@ -30,7 +30,11 @@ public class ShardCommand extends CommandBase<DonationManager>
|
||||
final String coinsString = args[1];
|
||||
Player target = UtilPlayer.searchExact(targetName);
|
||||
|
||||
if (target == null)
|
||||
if (targetName.equalsIgnoreCase("@a"))
|
||||
{
|
||||
rewardAllShards(caller, coinsString);
|
||||
}
|
||||
else if (target == null)
|
||||
{
|
||||
Plugin.getClientManager().loadClientByName(targetName, new Runnable()
|
||||
{
|
||||
@ -53,6 +57,44 @@ public class ShardCommand extends CommandBase<DonationManager>
|
||||
}
|
||||
}
|
||||
|
||||
private void rewardAllShards(Player caller, String shardsString)
|
||||
{
|
||||
try
|
||||
{
|
||||
int shards = Integer.parseInt(shardsString);
|
||||
|
||||
if (shards > 1000)
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Shards", "You can only give everybody 1000 shards at a time."));
|
||||
return;
|
||||
}
|
||||
|
||||
rewardAllShards(caller, shards);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Shards", "Invalid Shards Amount"));
|
||||
}
|
||||
}
|
||||
|
||||
private void rewardAllShards(Player caller, int shards)
|
||||
{
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
CoreClient client = Plugin.getClientManager().Get(player);
|
||||
|
||||
Plugin.RewardCoins(new Callback<Boolean>()
|
||||
{
|
||||
public void run(Boolean completed)
|
||||
{
|
||||
|
||||
}
|
||||
}, caller.getName(), player.getName(), client.getAccountId(), shards);
|
||||
}
|
||||
|
||||
UtilPlayer.message(caller, F.main("Shards", "Gave everyone " + F.elem(shards + " Treasure Shards")));
|
||||
}
|
||||
|
||||
private void rewardCoins(final Player caller, final Player target, final String targetName, final int accountId, String coinsString)
|
||||
{
|
||||
try
|
||||
|
@ -21,6 +21,7 @@ public enum GameDisplay
|
||||
Dragons("Dragons", Material.ENDER_STONE, (byte)0, GameCategory.ARCADE, 13),
|
||||
DragonsTeams("Dragons Teams", Material.DRAGON_EGG, (byte)0, GameCategory.TEAM_VARIANT, 14),
|
||||
Draw("Draw My Thing", Material.BOOK_AND_QUILL, (byte)0, GameCategory.CLASSICS, 15),
|
||||
ElytraRings("Elytra Rings", Material.ELYTRA, (byte) 0, GameCategory.CLASSICS, 61),
|
||||
Evolution("Evolution", Material.EMERALD, (byte)0, GameCategory.ARCADE, 16),
|
||||
Gravity("Gravity", Material.ENDER_PORTAL_FRAME, (byte)0, GameCategory.EXTRA, 18),
|
||||
Halloween("Halloween Horror", Material.PUMPKIN, (byte)0, GameCategory.CLASSICS, 19),
|
||||
|
@ -9,6 +9,7 @@ import mineplex.core.common.Rank;
|
||||
import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.inventory.InventoryManager;
|
||||
import mineplex.core.inventory.data.Item;
|
||||
|
||||
@ -47,6 +48,15 @@ public class GiveItemCommand extends CommandBase<InventoryManager>
|
||||
{
|
||||
UtilPlayer.message(caller, F.main("Item", "Item with the name " + F.item(itemName) + " not found!"));
|
||||
}
|
||||
else if (playerName.equalsIgnoreCase("@a"))
|
||||
{
|
||||
for (Player pl : UtilServer.getPlayers())
|
||||
{
|
||||
Plugin.addItemToInventory(pl, item.Name, amount);
|
||||
}
|
||||
|
||||
UtilPlayer.message(caller, F.main("Item", "You gave " + F.elem(amount + " " + itemName) + " to everyone"));
|
||||
}
|
||||
else if (player != null)
|
||||
{
|
||||
Plugin.addItemToInventory(player, item.Name, amount);
|
||||
|
@ -131,7 +131,11 @@ public class PersonalServerManager extends MiniPlugin
|
||||
}
|
||||
|
||||
if (eventServer)
|
||||
{
|
||||
ram = 4096;
|
||||
cpu = 8;
|
||||
createGroup(player, "EVENT", ram, cpu, 40, 80, "Event", eventServer);
|
||||
}
|
||||
else
|
||||
createGroup(player, serverName, ram, cpu, 40, 80, "Smash", eventServer);
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ public class ResourcePackManager extends MiniPlugin implements CommandCallback
|
||||
|
||||
if (_resourcePackRequired)
|
||||
{
|
||||
if (event.getStatus() == Status.ACCEPTED)
|
||||
if (event.getStatus() == Status.ACCEPTED || event.getStatus() == Status.SUCCESSFULLY_LOADED)
|
||||
{
|
||||
_resourcePackNoResponse.remove(player.getName());
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ public abstract class ShopBase<PluginType extends MiniPlugin> implements Listene
|
||||
private NautHashMap<String, Long> _errorThrottling;
|
||||
private NautHashMap<String, Long> _purchaseBlock;
|
||||
|
||||
private List<CurrencyType> _availableCurrencyTypes;
|
||||
private List<CurrencyType> _availableCurrencyTypes = new ArrayList<CurrencyType>();
|
||||
|
||||
private PluginType _plugin;
|
||||
private CoreClientManager _clientManager;
|
||||
@ -57,7 +57,7 @@ public abstract class ShopBase<PluginType extends MiniPlugin> implements Listene
|
||||
_errorThrottling = new NautHashMap<String, Long>();
|
||||
_purchaseBlock = new NautHashMap<String, Long>();
|
||||
|
||||
_availableCurrencyTypes = new ArrayList<CurrencyType>();
|
||||
if (currencyTypes != null && currencyTypes.length > 0)
|
||||
_availableCurrencyTypes.addAll(Arrays.asList(currencyTypes));
|
||||
|
||||
_plugin.registerEvents(this);
|
||||
|
@ -4,6 +4,7 @@ import java.util.List;
|
||||
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilAction;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
@ -101,12 +102,6 @@ public class TreasureLocation implements Listener
|
||||
return;
|
||||
}
|
||||
|
||||
if (!chargeAccount(player, treasureType))
|
||||
{
|
||||
player.sendMessage(F.main("Treasure", "You dont have any chests to open!"));
|
||||
return;
|
||||
}
|
||||
|
||||
TreasureStartEvent event = new TreasureStartEvent(player);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
@ -115,6 +110,25 @@ public class TreasureLocation implements Listener
|
||||
return;
|
||||
}
|
||||
|
||||
chargeAccount(player, treasureType, new Callback<Boolean>()
|
||||
{
|
||||
@Override
|
||||
public void run(Boolean success)
|
||||
{
|
||||
if (!success)
|
||||
{
|
||||
player.sendMessage(F.main("Treasure", "You dont have any chests to open!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isTreasureInProgress())
|
||||
{
|
||||
// Need to check again because of callback. Add item back
|
||||
player.sendMessage(F.main("Treasure", "Please wait for the current chest to be opened"));
|
||||
_inventoryManager.addItemToInventory(player, treasureType.getItemName(), 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// Treasure is now being opened
|
||||
setHoloChestVisible(false);
|
||||
|
||||
@ -147,16 +161,22 @@ public class TreasureLocation implements Listener
|
||||
|
||||
_treasureManager.addOpenStat(player, treasureType);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean chargeAccount(Player player, TreasureType treasureType)
|
||||
private void chargeAccount(Player player, TreasureType treasureType, Callback<Boolean> callback)
|
||||
{
|
||||
int itemCount = _inventoryManager.Get(player).getItemCount(treasureType.getItemName());
|
||||
if (itemCount > 0)
|
||||
{
|
||||
_inventoryManager.addItemToInventory(player, treasureType.getItemName(), -1);
|
||||
return true;
|
||||
// Should always handle the callback for us
|
||||
_inventoryManager.addItemToInventory(callback, player, treasureType.getItemName(), -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback.run(false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void setHoloChestVisible(boolean visible)
|
||||
|
@ -16,6 +16,7 @@ import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilWorld;
|
||||
import mineplex.game.clans.clans.event.ClanCreatedEvent;
|
||||
import mineplex.game.clans.clans.event.ClanCreationCompleteEvent;
|
||||
import mineplex.game.clans.clans.event.ClanDeleteEvent;
|
||||
import mineplex.game.clans.clans.event.ClanJoinEvent;
|
||||
import mineplex.game.clans.clans.event.ClanLeaveEvent;
|
||||
@ -195,6 +196,9 @@ public class ClansDataAccessLayer
|
||||
}
|
||||
|
||||
if (callback != null) callback.run(clanInfo);
|
||||
|
||||
ClanCreationCompleteEvent event = new ClanCreationCompleteEvent(token, Bukkit.getPlayer(creator));
|
||||
UtilServer.getServer().getPluginManager().callEvent(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -170,6 +170,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
|
||||
private DonationManager _donationManager;
|
||||
private NetherManager _netherManager;
|
||||
private DamageManager _damageManager;
|
||||
private SiegeManager _siegeManager;
|
||||
|
||||
private ClansBlacklist _blacklist;
|
||||
|
||||
@ -403,7 +404,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
|
||||
|
||||
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "Replay|Restrict");
|
||||
|
||||
new SiegeManager(this);
|
||||
_siegeManager = new SiegeManager(this);
|
||||
// _netherManager = new NetherManager(this);
|
||||
}
|
||||
|
||||
@ -1305,4 +1306,9 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
|
||||
{
|
||||
return _blacklist;
|
||||
}
|
||||
|
||||
public SiegeManager getSiegeManager()
|
||||
{
|
||||
return _siegeManager;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,194 @@
|
||||
package mineplex.game.clans.clans.event;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import mineplex.game.clans.core.repository.tokens.ClanToken;
|
||||
|
||||
public class ClanCreationCompleteEvent extends Event
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private Player _founder;
|
||||
private int _id;
|
||||
private String _name;
|
||||
private String _description;
|
||||
private String _home;
|
||||
private boolean _admin;
|
||||
private int _energy;
|
||||
private int _kills;
|
||||
private int _murders;
|
||||
private int _deaths;
|
||||
private int _warWins;
|
||||
private int _warLosses;
|
||||
private Timestamp _dateCreated;
|
||||
private Timestamp _lastOnline;
|
||||
|
||||
public ClanCreationCompleteEvent(ClanToken token, Player founder)
|
||||
{
|
||||
_founder = founder;
|
||||
|
||||
_id = token.Id;
|
||||
_name = token.Name;
|
||||
_description = token.Description;
|
||||
_home = token.Home;
|
||||
_admin = token.Admin;
|
||||
_energy = token.Energy;
|
||||
_kills = token.Kills;
|
||||
_murders = token.Murder;
|
||||
_deaths = token.Deaths;
|
||||
_warWins = token.WarWins;
|
||||
_warLosses = token.WarLosses;
|
||||
_dateCreated = token.DateCreated;
|
||||
_lastOnline = token.LastOnline;
|
||||
}
|
||||
|
||||
public Player getFounder()
|
||||
{
|
||||
return _founder;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return _id;
|
||||
}
|
||||
|
||||
public void setId(int id)
|
||||
{
|
||||
_id = id;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
_name = name;
|
||||
}
|
||||
|
||||
public String getDescription()
|
||||
{
|
||||
return _description;
|
||||
}
|
||||
|
||||
public void setDescription(String description)
|
||||
{
|
||||
_description = description;
|
||||
}
|
||||
|
||||
public String getHome()
|
||||
{
|
||||
return _home;
|
||||
}
|
||||
|
||||
public void setHome(String home)
|
||||
{
|
||||
_home = home;
|
||||
}
|
||||
|
||||
public boolean isAdmin()
|
||||
{
|
||||
return _admin;
|
||||
}
|
||||
|
||||
public void setAdmin(boolean admin)
|
||||
{
|
||||
_admin = admin;
|
||||
}
|
||||
|
||||
public int getEnergy()
|
||||
{
|
||||
return _energy;
|
||||
}
|
||||
|
||||
public void setEnergy(int energy)
|
||||
{
|
||||
_energy = energy;
|
||||
}
|
||||
|
||||
public int getKills()
|
||||
{
|
||||
return _kills;
|
||||
}
|
||||
|
||||
public void setKills(int kills)
|
||||
{
|
||||
_kills = kills;
|
||||
}
|
||||
|
||||
public int getMurders()
|
||||
{
|
||||
return _murders;
|
||||
}
|
||||
|
||||
public void setMurders(int murders)
|
||||
{
|
||||
_murders = murders;
|
||||
}
|
||||
|
||||
public int getDeaths()
|
||||
{
|
||||
return _deaths;
|
||||
}
|
||||
|
||||
public void setDeaths(int deaths)
|
||||
{
|
||||
_deaths = deaths;
|
||||
}
|
||||
|
||||
public int getWarWins()
|
||||
{
|
||||
return _warWins;
|
||||
}
|
||||
|
||||
public void setWarWins(int warWins)
|
||||
{
|
||||
_warWins = warWins;
|
||||
}
|
||||
|
||||
public int getWarLosses()
|
||||
{
|
||||
return _warLosses;
|
||||
}
|
||||
|
||||
public void setWarLosses(int warLosses)
|
||||
{
|
||||
_warLosses = warLosses;
|
||||
}
|
||||
|
||||
public Timestamp getDateCreated()
|
||||
{
|
||||
return _dateCreated;
|
||||
}
|
||||
|
||||
public void setDateCreated(Timestamp dateCreated)
|
||||
{
|
||||
_dateCreated = dateCreated;
|
||||
}
|
||||
|
||||
public Timestamp getLastOnline()
|
||||
{
|
||||
return _lastOnline;
|
||||
}
|
||||
|
||||
public void setLastOnline(Timestamp lastOnline)
|
||||
{
|
||||
_lastOnline = lastOnline;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
}
|
@ -19,13 +19,15 @@ public class ClansBlacklist extends MiniPlugin
|
||||
public ClansBlacklist(JavaPlugin plugin)
|
||||
{
|
||||
super("Clan Name Blacklist", plugin);
|
||||
|
||||
_repository = new ClanNameBlacklistRepository(plugin, this);
|
||||
}
|
||||
|
||||
// Fetch new blacklisted clans every 16 seconds (in case someone blacklists a clan name on a different server)
|
||||
@EventHandler
|
||||
public void update(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.SLOWER)
|
||||
if (event.getType() == UpdateType.SLOWER)
|
||||
{
|
||||
runAsync(() -> _repository.loadNames(this::setBlacklist));
|
||||
}
|
||||
|
@ -133,10 +133,18 @@ public abstract class Tutorial implements Listener, ObjectiveListener
|
||||
@Override
|
||||
public void onObjectiveStart(Player player, Objective objective)
|
||||
{
|
||||
String title = objective.getName();
|
||||
String desc = objective.getDescription();
|
||||
String title = objective.getName(player);
|
||||
String desc = objective.getDescription(player);
|
||||
player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 1f);
|
||||
_message.setMessage(player, title, desc, 100, true);
|
||||
_message.setMessage(player, title, desc, 20, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onObjectivePlayerUpdate(Player player, Objective objective)
|
||||
{
|
||||
String desc = objective.getDescription(player);
|
||||
player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 1f);
|
||||
_message.setMessage(player, "", desc, 20, true);
|
||||
}
|
||||
|
||||
private void finish(Player player)
|
||||
@ -217,6 +225,11 @@ public abstract class Tutorial implements Listener, ObjectiveListener
|
||||
_worldManager = worldManager;
|
||||
}
|
||||
|
||||
public TutorialWorldManager getWorldManager()
|
||||
{
|
||||
return _worldManager;
|
||||
}
|
||||
|
||||
public TutorialRegion getRegion(Player player)
|
||||
{
|
||||
return _playerSessionMap.get(player).getRegion();
|
||||
|
@ -33,7 +33,7 @@ public class TutorialRegion
|
||||
|
||||
private void pasteSchematic()
|
||||
{
|
||||
_locationMap = _schematic.paste(getOrigin());
|
||||
_locationMap = _schematic.paste(getOrigin(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -56,14 +56,16 @@ public class TutorialWorldManager extends MiniPlugin
|
||||
_regionStack = new Stack<>();
|
||||
|
||||
// Populate the stack with 100 available tutorial regions
|
||||
for (int x = 0; x < 10; x++)
|
||||
for (int x = 0; x < 1; x++)
|
||||
{
|
||||
for (int z = 0; z < 10; z++)
|
||||
for (int z = 0; z < 1; z++)
|
||||
{
|
||||
double xLoc = (x - 5) * 100; // 100x100 regions
|
||||
double zLoc = (z - 5) * 100;
|
||||
long time = System.currentTimeMillis();
|
||||
double xLoc = (x) * 1000; // 1000x1000 regions
|
||||
double zLoc = (z) * 1000;
|
||||
|
||||
_regionStack.add(new TutorialRegion(_schematic, new Location(_tutorialWorld, xLoc, 64, zLoc)));
|
||||
System.out.println("Finished Generating Region: " + ((x * 10) + z) + ". Took " + (System.currentTimeMillis() - time) + " ms");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -88,13 +90,8 @@ public class TutorialWorldManager extends MiniPlugin
|
||||
log("Returned " + region.toString());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onCommand(PlayerCommandPreprocessEvent event)
|
||||
public World getTutorialWorld()
|
||||
{
|
||||
if (event.getPlayer().getName().contains("Phinary") && event.getMessage().contains("tw"))
|
||||
{
|
||||
event.getPlayer().teleport(new Location(_tutorialWorld, 0, 64, 0));
|
||||
}
|
||||
|
||||
return _tutorialWorld;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,721 @@
|
||||
package mineplex.game.clans.tutorial.map;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.CraftChunk;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
|
||||
import org.bukkit.entity.ItemFrame;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.ItemSpawnEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEntityEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.map.MapRenderer;
|
||||
import org.bukkit.map.MapView;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.collect.HashMultiset;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Multisets;
|
||||
|
||||
import mineplex.core.MiniPlugin;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilInv;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.itemstack.ItemBuilder;
|
||||
import mineplex.core.portal.ServerTransferEvent;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import net.minecraft.server.v1_8_R3.Block;
|
||||
import net.minecraft.server.v1_8_R3.BlockPosition;
|
||||
import net.minecraft.server.v1_8_R3.Blocks;
|
||||
import net.minecraft.server.v1_8_R3.IBlockData;
|
||||
import net.minecraft.server.v1_8_R3.MaterialMapColor;
|
||||
import net.minecraft.server.v1_8_R3.PersistentCollection;
|
||||
|
||||
public class TutorialMapManager extends MiniPlugin
|
||||
{
|
||||
private int _blocksScan = 16;
|
||||
private Comparator<Entry<Integer, Integer>> _comparator;
|
||||
private int _halfMapSize;
|
||||
private int[][] _heightMap;
|
||||
private boolean _loadWorld = true;
|
||||
private HashMap<Integer, Byte[][]> _map = new HashMap<Integer, Byte[][]>();
|
||||
private short _mapId = (short) UtilMath.r(Short.MAX_VALUE);
|
||||
private ArrayList<Entry<Integer, Integer>> _scanList = new ArrayList<Entry<Integer, Integer>>();
|
||||
private World _world;
|
||||
private int _centerX;
|
||||
private int _centerZ;
|
||||
private int _scale;
|
||||
|
||||
public TutorialMapManager(JavaPlugin plugin, World world, int minX, int minZ, int maxX, int maxZ)
|
||||
{
|
||||
super("TutorialMapManager", plugin);
|
||||
|
||||
_centerX = minX + ((maxX - minX) / 2);
|
||||
_centerZ = minZ + ((maxZ - minZ) / 2);
|
||||
_centerX = (int) (Math.round(_centerX / 16D) * 16);
|
||||
_centerZ = (int) (Math.round(_centerZ / 16D) * 16);
|
||||
|
||||
_halfMapSize = (int) (Math.ceil(Math.max((maxX - minX) / 2D, (maxZ - minZ) / 2D) / 16D) * 16);
|
||||
|
||||
ArrayList<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>();
|
||||
|
||||
for (int scale = 1; scale <= 16; scale++)
|
||||
{
|
||||
int s = _halfMapSize;
|
||||
|
||||
if ((s / scale) > 127)
|
||||
continue;
|
||||
|
||||
while (s < 10000 && (s % 16 != 0 || s % scale != 0))
|
||||
{
|
||||
s += 16;
|
||||
}
|
||||
|
||||
if (s < 10000)
|
||||
{
|
||||
list.add(new HashMap.SimpleEntry(scale, s));
|
||||
}
|
||||
}
|
||||
|
||||
if (list.isEmpty())
|
||||
{
|
||||
_scale = 16;
|
||||
_halfMapSize = 127 * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
Collections.sort(list, new Comparator<Entry<Integer, Integer>>()
|
||||
{
|
||||
|
||||
@Override
|
||||
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2)
|
||||
{
|
||||
return Integer.compare(o1.getValue(), o2.getValue());
|
||||
}
|
||||
});
|
||||
|
||||
_scale = list.get(0).getKey();
|
||||
_halfMapSize = list.get(0).getValue();
|
||||
|
||||
System.out.print(
|
||||
"Using scale " + _scale + ", Size: " + _halfMapSize + ", CenterX: " + _centerX + ", CenterZ: " + _centerZ);
|
||||
}
|
||||
|
||||
_heightMap = new int[(_halfMapSize * 2) + 16][];
|
||||
|
||||
_comparator = new Comparator<Entry<Integer, Integer>>()
|
||||
{
|
||||
|
||||
@Override
|
||||
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2)
|
||||
{
|
||||
// Render the places outside the map first to speed up visual errors fixing
|
||||
int outsideMap = Boolean.compare(o1.getValue() < -_halfMapSize, o2.getValue() < -_halfMapSize);
|
||||
|
||||
if (outsideMap != 0)
|
||||
{
|
||||
return -outsideMap;
|
||||
}
|
||||
|
||||
double dist1 = 0;
|
||||
double dist2 = 0;
|
||||
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
dist1 += getDistance(o1, player.getLocation().getX(), player.getLocation().getZ());
|
||||
dist2 += getDistance(o2, player.getLocation().getX(), player.getLocation().getZ());
|
||||
}
|
||||
|
||||
if (dist1 != dist2)
|
||||
{
|
||||
return Double.compare(dist1, dist2);
|
||||
}
|
||||
|
||||
dist1 = getDistance(o1, 0, 0);
|
||||
dist2 = getDistance(o2, 0, 0);
|
||||
|
||||
return Double.compare(dist1, dist2);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
for (int x = -_halfMapSize; x < _halfMapSize; x += _blocksScan)
|
||||
{
|
||||
for (int z = -_halfMapSize - 16; z < _halfMapSize; z += (z < -_halfMapSize ? 16 : _blocksScan))
|
||||
{
|
||||
_scanList.add(new HashMap.SimpleEntry(x, z));
|
||||
}
|
||||
}
|
||||
|
||||
for (int s = 1; s <= 2; s++)
|
||||
{
|
||||
if (s == 2)
|
||||
{
|
||||
s = getScale();
|
||||
|
||||
if (s == 1)
|
||||
break;
|
||||
}
|
||||
|
||||
int size = (_halfMapSize * 2) / s;
|
||||
Byte[][] bytes = new Byte[size][];
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
bytes[i] = new Byte[size];
|
||||
}
|
||||
|
||||
_map.put(s, bytes);
|
||||
}
|
||||
|
||||
for (int i = 0; i < _heightMap.length; i++)
|
||||
{
|
||||
_heightMap[i] = new int[_heightMap.length];
|
||||
}
|
||||
|
||||
_world = world;
|
||||
|
||||
try
|
||||
{
|
||||
File foundFile = null;
|
||||
|
||||
for (File f : new File("world/data").listFiles())
|
||||
{
|
||||
if (f.getName().startsWith("map_"))
|
||||
{
|
||||
foundFile = f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundFile == null)
|
||||
{
|
||||
PersistentCollection collection = ((CraftWorld) _world).getHandle().worldMaps;
|
||||
Field f = collection.getClass().getDeclaredField("d");
|
||||
f.setAccessible(true);
|
||||
((HashMap) f.get(collection)).put("map", (short) 0);
|
||||
}
|
||||
|
||||
MapView view = Bukkit.createMap(_world);
|
||||
_mapId = view.getId();
|
||||
setupRenderer(view);
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
setupRenderer(Bukkit.createMap(_world));// Ensures the following 100 maps are unused
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
rebuildScan();
|
||||
}
|
||||
|
||||
private void setupRenderer(MapView view)
|
||||
{
|
||||
for (MapRenderer renderer : view.getRenderers())
|
||||
{
|
||||
view.removeRenderer(renderer);
|
||||
}
|
||||
|
||||
view.addRenderer(new TutorialMapRenderer(this));
|
||||
}
|
||||
|
||||
public int getScale()
|
||||
{
|
||||
return _scale;
|
||||
}
|
||||
|
||||
public int getX()
|
||||
{
|
||||
return _centerX;
|
||||
}
|
||||
|
||||
public int getZ()
|
||||
{
|
||||
return _centerZ;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void preventMapInItemFrame(PlayerInteractEntityEvent event)
|
||||
{
|
||||
if (!(event.getRightClicked() instanceof ItemFrame))
|
||||
return;
|
||||
|
||||
ItemStack item = event.getPlayer().getItemInHand();
|
||||
|
||||
if (item == null || item.getType() != Material.MAP || item.getDurability() < _mapId || item.getDurability() != _mapId)
|
||||
return;
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the center of the map.
|
||||
*/
|
||||
public int calcMapCenter(int zoom, int cord)
|
||||
{
|
||||
int mapSize = _halfMapSize / zoom; // This is how large the map is in pixels
|
||||
|
||||
int mapCord = cord / zoom; // This is pixels from true center of map, not held map
|
||||
|
||||
int fDiff = mapSize - -mapCord;
|
||||
int sDiff = mapSize - mapCord;
|
||||
|
||||
double chunkBlock = cord & 0xF;
|
||||
cord -= chunkBlock;
|
||||
chunkBlock /= zoom;
|
||||
|
||||
/*if ((fDiff < 64 || sDiff < 64) && (Math.abs(fDiff - sDiff) > 1))
|
||||
{
|
||||
cord += (fDiff > sDiff ? Math.floor(chunkBlock) : Math.ceil(chunkBlock));
|
||||
}
|
||||
else*/
|
||||
{
|
||||
cord += (int) Math.floor(chunkBlock) * zoom;
|
||||
}
|
||||
|
||||
while ((fDiff < 64 || sDiff < 64) && (Math.abs(fDiff - sDiff) > 1))
|
||||
{
|
||||
int change = (fDiff > sDiff ? -zoom : zoom);
|
||||
cord += change;
|
||||
|
||||
mapCord = cord / zoom;
|
||||
|
||||
fDiff = mapSize - -mapCord;
|
||||
sDiff = mapSize - mapCord;
|
||||
}
|
||||
|
||||
return cord;
|
||||
}
|
||||
|
||||
private void colorWorldHeight(int zoom, int startingX, int startingZ)
|
||||
{
|
||||
if (zoom == 0)
|
||||
zoom = 1;
|
||||
|
||||
Byte[][] map = _map.get(zoom);
|
||||
|
||||
for (int x = startingX; x < startingX + _blocksScan; x += zoom)
|
||||
{
|
||||
double d0 = 0;
|
||||
|
||||
// Prevents ugly lines for the first line of Z
|
||||
|
||||
for (int addX = 0; addX < zoom; addX++)
|
||||
{
|
||||
for (int addZ = 0; addZ < zoom; addZ++)
|
||||
{
|
||||
int hX = x + addX + _halfMapSize;
|
||||
int hZ = (startingZ - zoom) + addZ + _halfMapSize;
|
||||
|
||||
if (hX >= _halfMapSize * 2 || hZ >= _halfMapSize * 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
d0 += _heightMap[hX + 16][hZ + 16] / (zoom * zoom);
|
||||
}
|
||||
}
|
||||
|
||||
for (int z = startingZ; z < startingZ + _blocksScan; z += zoom)
|
||||
{
|
||||
// Water depth colors not included
|
||||
double d1 = 0;
|
||||
|
||||
for (int addX = 0; addX < zoom; addX++)
|
||||
{
|
||||
for (int addZ = 0; addZ < zoom; addZ++)
|
||||
{
|
||||
int hX = x + addX + _halfMapSize;
|
||||
int hZ = z + addZ + _halfMapSize;
|
||||
|
||||
if (hX >= _halfMapSize * 2 || hZ >= _halfMapSize * 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
d1 += _heightMap[hX + 16][hZ + 16] / (zoom * zoom);
|
||||
}
|
||||
}
|
||||
|
||||
double d2 = (d1 - d0) * 4.0D / (zoom + 4) + ((x + z & 0x1) - 0.5D) * 0.4D;
|
||||
byte b0 = 1;
|
||||
|
||||
d0 = d1;
|
||||
|
||||
if (d2 > 0.6D)
|
||||
{
|
||||
b0 = 2;
|
||||
}
|
||||
else if (d2 > 1.2D)
|
||||
{
|
||||
b0 = 3;
|
||||
}
|
||||
else if (d2 < -0.6D)
|
||||
{
|
||||
b0 = 0;
|
||||
}
|
||||
|
||||
int origColor = map[(x + _halfMapSize) / zoom][(z + _halfMapSize) / zoom] - 1;
|
||||
|
||||
/*if (color < 4)
|
||||
{
|
||||
d2 = waterDepth * 0.1D + (k1 + j2 & 0x1) * 0.2D;
|
||||
b0 = 1;
|
||||
if (d2 < 0.5D)
|
||||
{
|
||||
b0 = 2;
|
||||
}
|
||||
|
||||
if (d2 > 0.9D)
|
||||
{
|
||||
b0 = 0;
|
||||
}
|
||||
}*/
|
||||
|
||||
byte color = (byte) (origColor + b0);
|
||||
map[(x + _halfMapSize) / zoom][(z + _halfMapSize) / zoom] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void drawWorldScale(int zoom, int startingX, int startingZ)
|
||||
{
|
||||
Byte[][] first = _map.get(1);
|
||||
Byte[][] second = _map.get(zoom);
|
||||
|
||||
for (int x = startingX; x < startingX + _blocksScan; x += zoom)
|
||||
{
|
||||
for (int z = startingZ; z < startingZ + _blocksScan; z += zoom)
|
||||
{
|
||||
HashMultiset<Byte> hashmultiset = HashMultiset.create();
|
||||
|
||||
for (int addX = 0; addX < zoom; addX++)
|
||||
{
|
||||
for (int addZ = 0; addZ < zoom; addZ++)
|
||||
{
|
||||
int pX = x + addX + _halfMapSize;
|
||||
int pZ = z + addZ + _halfMapSize;
|
||||
|
||||
if (pX >= first.length || pZ >= first.length)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Byte b = first[pX][pZ];
|
||||
|
||||
if (b == null)
|
||||
continue;
|
||||
|
||||
hashmultiset.add(b);
|
||||
}
|
||||
}
|
||||
|
||||
Byte color = Iterables.getFirst(Multisets.copyHighestCountFirst(hashmultiset), (byte) 0);
|
||||
|
||||
second[(x + _halfMapSize) / zoom][(z + _halfMapSize) / zoom] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void dropItem(ItemSpawnEvent event)
|
||||
{
|
||||
ItemStack item = event.getEntity().getItemStack();
|
||||
|
||||
if (item != null && item.getType() == Material.MAP && item.getDurability() == _mapId)
|
||||
{
|
||||
event.getEntity().remove();
|
||||
}
|
||||
}
|
||||
|
||||
private double getDistance(double x1, double z1, double x2, double z2)
|
||||
{
|
||||
x1 = (x1 - x2);
|
||||
z1 = (z1 - z2);
|
||||
|
||||
return (x1 * x1) + (z1 * z1);
|
||||
}
|
||||
|
||||
private double getDistance(Entry<Integer, Integer> entry, double x1, double z1)
|
||||
{
|
||||
return getDistance(x1 + _centerX, z1 + _centerZ, entry.getKey() + (_blocksScan / 2),
|
||||
entry.getValue() + (_blocksScan / 2));
|
||||
}
|
||||
|
||||
public Byte[][] getMap(int scale)
|
||||
{
|
||||
return _map.get(scale);
|
||||
}
|
||||
|
||||
public int getMapSize()
|
||||
{
|
||||
return _halfMapSize;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void preventMapMoveInventories(InventoryClickEvent event)
|
||||
{
|
||||
Inventory inv = event.getClickedInventory();
|
||||
|
||||
if (inv == null)
|
||||
return;
|
||||
|
||||
// Yeah, the loop looks a little weird..
|
||||
for (ItemStack item : new ItemStack[]
|
||||
{
|
||||
event.getCurrentItem(),
|
||||
event.getCursor()
|
||||
})
|
||||
{
|
||||
if (item == null || item.getType() != Material.MAP || item.getDurability() != _mapId)
|
||||
continue;
|
||||
|
||||
if (inv.getHolder() instanceof Player ? !event.isShiftClick() : Objects.equal(event.getCurrentItem(), item))
|
||||
continue;
|
||||
|
||||
event.setCancelled(true);
|
||||
|
||||
UtilPlayer.message(event.getWhoClicked(),
|
||||
F.main("Inventory", "You cannot move " + F.item("Clans Map") + " between inventories."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void rebuildScan()
|
||||
{
|
||||
for (int x = -_halfMapSize; x < _halfMapSize; x += _blocksScan)
|
||||
{
|
||||
for (int z = -_halfMapSize - 16; z < _halfMapSize; z += (z < -_halfMapSize ? 16 : _blocksScan))
|
||||
{
|
||||
_scanList.add(new HashMap.SimpleEntry(x, z));
|
||||
}
|
||||
}
|
||||
|
||||
if (!_loadWorld)
|
||||
{
|
||||
Iterator<Entry<Integer, Integer>> itel = _scanList.iterator();
|
||||
|
||||
while (itel.hasNext())
|
||||
{
|
||||
Entry<Integer, Integer> entry = itel.next();
|
||||
boolean removeEntry = true;
|
||||
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
if (Math.sqrt(getDistance(entry, player.getLocation().getX(), player.getLocation().getZ())) < 200)
|
||||
{
|
||||
removeEntry = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (removeEntry)
|
||||
{
|
||||
itel.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Collections.sort(_scanList, _comparator);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void renderMap(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.FASTEST)
|
||||
return;
|
||||
|
||||
if (_scanList.isEmpty())
|
||||
{
|
||||
if (_loadWorld)
|
||||
{
|
||||
_loadWorld = false;
|
||||
}
|
||||
|
||||
if (UtilServer.getPlayers().length == 0)
|
||||
return;
|
||||
|
||||
rebuildScan();
|
||||
}
|
||||
else if (_scanList.size() % 20 == 0)
|
||||
{
|
||||
Collections.sort(_scanList, _comparator);
|
||||
}
|
||||
|
||||
Entry<Integer, Integer> entry = _scanList.remove(0);
|
||||
|
||||
int startingX = entry.getKey();
|
||||
int startingZ = entry.getValue();
|
||||
|
||||
boolean outsideMap = startingZ < -_halfMapSize;
|
||||
|
||||
scanWorldMap(startingX, startingZ, !outsideMap);
|
||||
|
||||
if (outsideMap)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int s = 1; s <= 2; s++)
|
||||
{
|
||||
if (s == 2)
|
||||
{
|
||||
s = getScale();
|
||||
|
||||
if (s == 1)
|
||||
break;
|
||||
}
|
||||
|
||||
if (s == 13 && _loadWorld)
|
||||
continue;
|
||||
|
||||
if (!outsideMap)
|
||||
{
|
||||
drawWorldScale(s, startingX, startingZ);
|
||||
}
|
||||
|
||||
colorWorldHeight(s, startingX, startingZ);
|
||||
}
|
||||
|
||||
colorWorldHeight(0, startingX, startingZ);
|
||||
}
|
||||
|
||||
public void scanWorldMap(int startingX, int startingZ, boolean setColors)
|
||||
{
|
||||
Byte[][] map = _map.get(1);
|
||||
|
||||
for (int beginX = startingX; beginX < startingX + _blocksScan; beginX += 16)
|
||||
{
|
||||
for (int beginZ = startingZ - (startingZ > -_halfMapSize ? 16 : 0); beginZ < startingZ
|
||||
+ (setColors ? _blocksScan : 16); beginZ += 16)
|
||||
{
|
||||
Chunk chunk = _world.getChunkAt((beginX + _centerX) / 16, (beginZ + _centerZ) / 16);
|
||||
boolean loaded = false;
|
||||
|
||||
if (!chunk.isLoaded())
|
||||
{
|
||||
if (_loadWorld)
|
||||
{
|
||||
loaded = chunk.load();
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
net.minecraft.server.v1_8_R3.Chunk nmsChunk = ((CraftChunk) chunk).getHandle();
|
||||
|
||||
for (int x = beginX; x < beginX + 16; x++)
|
||||
{
|
||||
for (int z = beginZ; z < beginZ + 16; z++)
|
||||
{
|
||||
int color = 0;
|
||||
|
||||
if (!nmsChunk.isEmpty())
|
||||
{
|
||||
int k3 = x & 0xF;
|
||||
int l3 = z & 0xF;
|
||||
|
||||
int l4 = nmsChunk.b(k3, l3) + 1;
|
||||
IBlockData iblockdata = Blocks.AIR.getBlockData();
|
||||
|
||||
if (l4 > 1)
|
||||
{
|
||||
do
|
||||
{
|
||||
l4--;
|
||||
iblockdata = nmsChunk.getBlockData(new BlockPosition(k3, l4, l3));
|
||||
}
|
||||
while (iblockdata.getBlock().g(iblockdata) == MaterialMapColor.b && (l4 > 0));
|
||||
|
||||
if ((l4 > 0) && (iblockdata.getBlock().getMaterial().isLiquid()))
|
||||
{
|
||||
int j5 = l4 - 1;
|
||||
Block block1;
|
||||
do
|
||||
{
|
||||
block1 = nmsChunk.getType(new BlockPosition(k3, j5--, l3));
|
||||
}
|
||||
while ((j5 > 0) && (block1.getMaterial().isLiquid()));
|
||||
}
|
||||
}
|
||||
|
||||
_heightMap[x + _halfMapSize + 16][z + _halfMapSize + 16] = l4;
|
||||
|
||||
if (setColors)
|
||||
{
|
||||
// color = block.f(i5).M;
|
||||
IBlockData data = nmsChunk.getBlockData(new BlockPosition(k3, l4, l3));
|
||||
color = data.getBlock().g(data).M;
|
||||
|
||||
color = (byte) ((color * 4) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (setColors && beginZ >= startingZ)
|
||||
{
|
||||
map[x + _halfMapSize][z + _halfMapSize] = (byte) color;
|
||||
}
|
||||
}
|
||||
|
||||
if (loaded)
|
||||
{
|
||||
chunk.unload();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setMap(Player player)
|
||||
{
|
||||
for (ItemStack item : UtilInv.getItems(player))
|
||||
{
|
||||
if (item.getType() == Material.MAP && item.getDurability() == _mapId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack item = new ItemBuilder(Material.MAP, 1, _mapId).setTitle("Tutorial Map").build();
|
||||
|
||||
int slot = player.getInventory().firstEmpty();
|
||||
|
||||
if (slot >= 0)
|
||||
{
|
||||
ItemStack mapSlot = player.getInventory().getItem(8);
|
||||
|
||||
if (mapSlot == null || mapSlot.getType() == Material.AIR)
|
||||
{
|
||||
slot = 8;
|
||||
}
|
||||
|
||||
player.getInventory().setItem(slot, item);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,100 @@
|
||||
package mineplex.game.clans.tutorial.map;
|
||||
|
||||
import mineplex.core.recharge.Recharge;
|
||||
import mineplex.game.clans.tutorial.TutorialRegion;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.map.MapCanvas;
|
||||
import org.bukkit.map.MapCursor;
|
||||
import org.bukkit.map.MapCursorCollection;
|
||||
import org.bukkit.map.MapRenderer;
|
||||
import org.bukkit.map.MapView;
|
||||
|
||||
public class TutorialMapRenderer extends MapRenderer
|
||||
{
|
||||
private TutorialMapManager _manager;
|
||||
|
||||
public TutorialMapRenderer(TutorialMapManager itemMapManager)
|
||||
{
|
||||
super(true);
|
||||
|
||||
_manager = itemMapManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MapView mapView, MapCanvas canvas, Player player)
|
||||
{
|
||||
int zoom = _manager.getScale();
|
||||
|
||||
Byte[][] map = _manager.getMap(zoom);
|
||||
|
||||
int centerX = 0;
|
||||
int centerZ = 0;
|
||||
|
||||
// We have this cooldown to squeeze out every single bit of performance from the server.
|
||||
if (Recharge.Instance.use(player, "Draw Map", 4000, false, false))
|
||||
{
|
||||
for (int mapX = 0; mapX < 128; mapX++)
|
||||
{
|
||||
for (int mapZ = 0; mapZ < 128; mapZ++)
|
||||
{
|
||||
int blockX = centerX + (mapX - 64);
|
||||
int blockZ = centerZ + (mapZ - 64);
|
||||
|
||||
int pixelX = blockX + (map.length / 2);
|
||||
int pixelZ = blockZ + (map.length / 2);
|
||||
|
||||
Byte color;
|
||||
|
||||
if (!(pixelX < 0 || pixelZ < 0 || pixelX >= map.length || pixelZ >= map.length)
|
||||
&& map[pixelX][pixelZ] != null)
|
||||
{
|
||||
color = map[pixelX][pixelZ];
|
||||
|
||||
blockX *= zoom;
|
||||
blockZ *= zoom;
|
||||
}
|
||||
else
|
||||
{
|
||||
color = (byte) 0;
|
||||
}
|
||||
|
||||
/* TODO Figure out if you want to colorize this pixel
|
||||
{
|
||||
color = MapPalette.matchColor(r, g, b);
|
||||
}*/
|
||||
|
||||
canvas.setPixel(mapX, mapZ, color);
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMap(mapView);
|
||||
}
|
||||
|
||||
MapCursorCollection cursors = canvas.getCursors();
|
||||
|
||||
while (cursors.size() > 0)
|
||||
|
||||
{
|
||||
cursors.removeCursor(cursors.getCursor(0));
|
||||
}
|
||||
|
||||
Location l = player.getLocation();
|
||||
|
||||
double mapX = (l.getX() - _manager.getX()) / zoom;
|
||||
double mapZ = (l.getZ() - _manager.getZ()) / zoom;
|
||||
|
||||
if (mapX > -64 && mapX < 64 && mapZ > -64 && mapZ < 64)
|
||||
{
|
||||
byte b0 = (byte) (int) Math.min(127, (double) (mapX * 2.0F) + 0.5D);
|
||||
byte b1 = (byte) (int) Math.max(-127, (double) (mapZ * 2.0F) + 0.5D);
|
||||
|
||||
byte rotation = (byte) (int) ((l.getYaw() * 16D) / 360D);
|
||||
|
||||
MapCursor cursor = new MapCursor(b0, b1, (byte) (rotation & 0xF), MapCursor.Type.WHITE_POINTER.getValue(), true);
|
||||
|
||||
cursors.addCursor(cursor);
|
||||
}
|
||||
}
|
||||
}
|
@ -4,11 +4,15 @@ import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.DyeColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
@ -20,6 +24,7 @@ import mineplex.game.clans.message.ClansMessageManager;
|
||||
import mineplex.game.clans.tutorial.Tutorial;
|
||||
import mineplex.game.clans.tutorial.TutorialRegion;
|
||||
import mineplex.game.clans.tutorial.TutorialWorldManager;
|
||||
import mineplex.game.clans.tutorial.map.TutorialMapManager;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClassesObjective;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.FieldsObjective;
|
||||
@ -29,6 +34,8 @@ import mineplex.game.clans.tutorial.tutorials.clans.objective.ShopsObjective;
|
||||
|
||||
public class ClansMainTutorial extends Tutorial
|
||||
{
|
||||
private TutorialMapManager _mapManager;
|
||||
|
||||
public ClansMainTutorial(JavaPlugin plugin, ClansMessageManager message)
|
||||
{
|
||||
super(plugin, message, "Clans Tutorial", "Clans.MainTutorial", Material.DIAMOND_SWORD, (byte) 0);
|
||||
@ -42,6 +49,8 @@ public class ClansMainTutorial extends Tutorial
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
_mapManager = new TutorialMapManager(plugin, getWorldManager().getTutorialWorld(), -10, 0, 117, 127);
|
||||
|
||||
addObjective(new LeaveSpawnObjective(this, plugin));
|
||||
addObjective(new ClanObjective(this, plugin));
|
||||
addObjective(new ShopsObjective(this, plugin));
|
||||
@ -59,10 +68,17 @@ public class ClansMainTutorial extends Tutorial
|
||||
@Override
|
||||
protected void onStart(Player player)
|
||||
{
|
||||
player.teleport(getRegion(player).getLocationMap().getLocations(DyeColor.RED).get(0));
|
||||
TutorialRegion region = getRegion(player);
|
||||
|
||||
player.teleport(getSpawn(region));
|
||||
spawnFences(region, DyeColor.BLACK); // Fields
|
||||
spawnFences(region, DyeColor.BROWN); // Shops
|
||||
spawnFences(region, DyeColor.RED); // Middle
|
||||
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
player.getInventory().clear();
|
||||
ClansManager.getInstance().getItemMapManager().setMap(player);
|
||||
_mapManager.setMap(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -70,6 +86,82 @@ public class ClansMainTutorial extends Tutorial
|
||||
{
|
||||
}
|
||||
|
||||
public Location getPoint(TutorialRegion region, Point point)
|
||||
{
|
||||
return region.getLocationMap().getGoldLocations(point.getDataLocColor()).get(0).clone();
|
||||
}
|
||||
|
||||
public boolean isIn(Location location, TutorialRegion region, Bounds bounds)
|
||||
{
|
||||
List<Location> locs = region.getLocationMap().getGoldLocations(bounds.getDataLocColor());
|
||||
return UtilAlg.inBoundingBox(location, locs.get(0), locs.get(1));
|
||||
}
|
||||
|
||||
public boolean isIn(Player player, Bounds bounds)
|
||||
{
|
||||
TutorialRegion region = getRegion(player);
|
||||
|
||||
if (region != null)
|
||||
{
|
||||
return isIn(player.getLocation(), region, bounds);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public Location getSpawn(TutorialRegion region)
|
||||
{
|
||||
Location location = region.getLocationMap().getGoldLocations(Point.SPAWN.getDataLocColor()).get(0).clone();
|
||||
location.setYaw(180);
|
||||
return location;
|
||||
}
|
||||
|
||||
public enum Bounds
|
||||
{
|
||||
LAND_CLAIM(DyeColor.LIGHT_BLUE), // Should be 16x16
|
||||
ENEMY_LAND(DyeColor.RED), // Should be 16x16
|
||||
SPAWN(DyeColor.GREEN), // Spawn Platform
|
||||
FIELDS(DyeColor.PURPLE), // Boulders for ores to spawn in?
|
||||
SHOPS(DyeColor.YELLOW); // Little shop areas similar to Shops in clans map
|
||||
// Gray Wool - Cannon Location
|
||||
// Magenta Wool - Spawn
|
||||
// Lime Wool - Farming Shop
|
||||
// Purple Wool - Pvp Shop
|
||||
// Light Gray Wool - Energy Shop
|
||||
|
||||
private DyeColor _dataLocColor;
|
||||
|
||||
Bounds(DyeColor dataLocColor)
|
||||
{
|
||||
_dataLocColor = dataLocColor;
|
||||
}
|
||||
|
||||
public DyeColor getDataLocColor()
|
||||
{
|
||||
return _dataLocColor;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Point
|
||||
{
|
||||
SPAWN(DyeColor.MAGENTA),
|
||||
FARMING_SHOP(DyeColor.LIME),
|
||||
PVP_SHOP(DyeColor.PURPLE),
|
||||
ENERGY_SHOP(DyeColor.SILVER);
|
||||
|
||||
private DyeColor _dataLocColor;
|
||||
|
||||
Point(DyeColor dataLocColor)
|
||||
{
|
||||
_dataLocColor = dataLocColor;
|
||||
}
|
||||
|
||||
public DyeColor getDataLocColor()
|
||||
{
|
||||
return _dataLocColor;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void dropItem(PlayerDropItemEvent event)
|
||||
{
|
||||
@ -88,6 +180,57 @@ public class ClansMainTutorial extends Tutorial
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void blockDamage(EntityDamageEvent event)
|
||||
{
|
||||
if (event.getEntity() instanceof Player)
|
||||
{
|
||||
if (isInTutorial((Player)event.getEntity()))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Fences
|
||||
// Black = fields
|
||||
// Brown = shops
|
||||
public void spawnFence(Block startBlock)
|
||||
{
|
||||
Block block = startBlock;
|
||||
int count = 0;
|
||||
while (block.getType() == Material.AIR && count < 100)
|
||||
{
|
||||
block.setType(Material.FENCE);
|
||||
|
||||
block = block.getRelative(BlockFace.UP);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
public void destroyFence(Block startBlock)
|
||||
{
|
||||
Block block = startBlock;
|
||||
int count = 0;
|
||||
while (block.getType() == Material.FENCE && count < 100)
|
||||
{
|
||||
block.setType(Material.AIR);
|
||||
|
||||
block = block.getRelative(BlockFace.UP);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
public void spawnFences(TutorialRegion region, DyeColor dataLoc)
|
||||
{
|
||||
List<Location> locations = region.getLocationMap().getIronLocations(dataLoc);
|
||||
locations.stream().map(Location::getBlock).forEach(this::spawnFence);
|
||||
}
|
||||
|
||||
public void destroyFences(TutorialRegion region, DyeColor dataLoc)
|
||||
{
|
||||
List<Location> locations = region.getLocationMap().getIronLocations(dataLoc);
|
||||
locations.stream().map(Location::getBlock).forEach(this::spawnFence);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void checkInRegion(UpdateEvent event)
|
||||
{
|
||||
@ -96,39 +239,11 @@ public class ClansMainTutorial extends Tutorial
|
||||
|
||||
for (Player player : getPlayers())
|
||||
{
|
||||
TutorialRegion region = getRegion(player);
|
||||
|
||||
if (!isInRegion(player.getLocation(), region))
|
||||
if (player.getLocation().getWorld() != getWorldManager().getTutorialWorld())
|
||||
{
|
||||
TutorialRegion region = getRegion(player);
|
||||
player.teleport(getSpawn(region));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Location getSpawn(TutorialRegion region)
|
||||
{
|
||||
return region.getLocationMap().getLocations(DyeColor.RED).get(0);
|
||||
}
|
||||
|
||||
public boolean isInSpawn(Player player)
|
||||
{
|
||||
return isInSpawn(player.getLocation(), getRegion(player));
|
||||
}
|
||||
|
||||
public boolean isInSpawn(Location location, TutorialRegion region)
|
||||
{
|
||||
List<Location> locs = region.getLocationMap().getLocations(DyeColor.ORANGE);
|
||||
return UtilAlg.inBoundingBox(location, locs.get(0), locs.get(1));
|
||||
}
|
||||
|
||||
public boolean isInRegion(Player player)
|
||||
{
|
||||
return isInRegion(player.getLocation(), getRegion(player));
|
||||
}
|
||||
|
||||
public boolean isInRegion(Location location, TutorialRegion region)
|
||||
{
|
||||
List<Location> locs = region.getLocationMap().getLocations(DyeColor.GREEN);
|
||||
return UtilAlg.inBoundingBox(location, locs.get(0), locs.get(1));
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package mineplex.game.clans.tutorial.tutorials.clans.objective;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
@ -39,7 +41,7 @@ public class LeaveSpawnObjective extends SingleObjective<ClansMainTutorial>
|
||||
|
||||
for (Player player : getActivePlayers())
|
||||
{
|
||||
if (!getPlugin().isInSpawn(player))
|
||||
if (!getPlugin().isIn(player, ClansMainTutorial.Bounds.SPAWN))
|
||||
{
|
||||
finish(player);
|
||||
}
|
||||
|
@ -1,11 +1,14 @@
|
||||
package mineplex.game.clans.tutorial.tutorials.clans.objective.goals.clan;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.game.clans.clans.ClansManager;
|
||||
import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent;
|
||||
|
||||
public class AttackEnemyGoal extends ObjectiveGoal
|
||||
@ -18,8 +21,8 @@ public class AttackEnemyGoal extends ObjectiveGoal
|
||||
@Override
|
||||
protected void customStart(Player player)
|
||||
{
|
||||
// give tnt (For cannon)
|
||||
// and place cannon?
|
||||
player.getInventory().addItem(new ItemStack(Material.TNT, 20));
|
||||
finish(player);
|
||||
}
|
||||
|
||||
// use this event for figuring out if the cannon hit the base
|
||||
|
@ -19,8 +19,11 @@ import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.game.clans.clans.ClansManager;
|
||||
import mineplex.game.clans.tutorial.TutorialRegion;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
|
||||
public class BuildHouseGoal extends ObjectiveGoal
|
||||
public class BuildHouseGoal extends ObjectiveGoal<ClanObjective>
|
||||
{
|
||||
private List<ItemStack> _items = Lists.newArrayList(
|
||||
new ItemStack(Material.SMOOTH_BRICK, 54),
|
||||
@ -29,7 +32,7 @@ public class BuildHouseGoal extends ObjectiveGoal
|
||||
);
|
||||
|
||||
|
||||
public BuildHouseGoal(Objective objective)
|
||||
public BuildHouseGoal(ClanObjective objective)
|
||||
{
|
||||
super(objective, "Build House", "Build a Stone Brick house. (Place all your blocks)");
|
||||
}
|
||||
@ -55,7 +58,7 @@ public class BuildHouseGoal extends ObjectiveGoal
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isInBuildArea(event.getBlock()))
|
||||
if (!isInBuildArea(event.getPlayer(), event.getBlock()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -82,7 +85,7 @@ public class BuildHouseGoal extends ObjectiveGoal
|
||||
return;
|
||||
}
|
||||
|
||||
if (isInBuildArea(event.getBlock()))
|
||||
if (isInBuildArea(event.getPlayer(), event.getBlock()))
|
||||
{
|
||||
// Run 1 tick later because inventory doesn't get updated instantly
|
||||
ClansManager.getInstance().runSync(() -> {
|
||||
@ -110,8 +113,9 @@ public class BuildHouseGoal extends ObjectiveGoal
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isInBuildArea(Block block)
|
||||
private boolean isInBuildArea(Player player, Block block)
|
||||
{
|
||||
return true; // TODO
|
||||
TutorialRegion region = getObjective().getPlugin().getRegion(player);
|
||||
return getObjective().getPlugin().isIn(block.getLocation(), region, ClansMainTutorial.Bounds.LAND_CLAIM);
|
||||
}
|
||||
}
|
||||
|
@ -5,11 +5,15 @@ import org.bukkit.event.EventHandler;
|
||||
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.game.clans.clans.event.PlayerPreClaimTerritoryEvent;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
|
||||
public class ClaimLandGoal extends ObjectiveGoal
|
||||
public class ClaimLandGoal extends ObjectiveGoal<ClanObjective>
|
||||
{
|
||||
public ClaimLandGoal(Objective objective)
|
||||
public ClaimLandGoal(ClanObjective objective)
|
||||
{
|
||||
super(objective, "Claim Land", "Claim land with /c claim");
|
||||
}
|
||||
@ -29,8 +33,16 @@ public class ClaimLandGoal extends ObjectiveGoal
|
||||
{
|
||||
if (contains(event.getClaimer()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
if (getObjective().getPlugin().isIn(event.getClaimer(), ClansMainTutorial.Bounds.LAND_CLAIM))
|
||||
{
|
||||
finish(event.getClaimer());
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilPlayer.message(event.getClaimer(), F.main("Tutorial", "You must claim the land inside the blue outline"));
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,13 +3,15 @@ package mineplex.game.clans.tutorial.tutorials.clans.objective.goals.clan;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.game.clans.clans.ClanInfo;
|
||||
import mineplex.game.clans.clans.ClansManager;
|
||||
import mineplex.game.clans.clans.event.ClansCommandExecutedEvent;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
|
||||
public class ClanDetailsGoal extends ObjectiveGoal
|
||||
public class ClanDetailsGoal extends ObjectiveGoal<ClanObjective>
|
||||
{
|
||||
public ClanDetailsGoal(Objective objective)
|
||||
public ClanDetailsGoal(ClanObjective objective)
|
||||
{
|
||||
super(objective, "View Clan Details", "View Clan Details with /c");
|
||||
}
|
||||
@ -24,6 +26,13 @@ public class ClanDetailsGoal extends ObjectiveGoal
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription(Player player)
|
||||
{
|
||||
ClanInfo clan = ClansManager.getInstance().getClan(player);
|
||||
return "View Clan Details with /c " + clan.getName();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onClanInfo(ClansCommandExecutedEvent event)
|
||||
{
|
||||
|
@ -6,10 +6,12 @@ import org.bukkit.event.EventHandler;
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.game.clans.clans.event.ClanCreatedEvent;
|
||||
import mineplex.game.clans.clans.event.ClanCreationCompleteEvent;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
|
||||
public class CreateClanGoal extends ObjectiveGoal
|
||||
public class CreateClanGoal extends ObjectiveGoal<ClanObjective>
|
||||
{
|
||||
public CreateClanGoal(Objective objective)
|
||||
public CreateClanGoal(ClanObjective objective)
|
||||
{
|
||||
super(objective, "Create a Clan", "Create a Clan");
|
||||
}
|
||||
@ -27,7 +29,7 @@ public class CreateClanGoal extends ObjectiveGoal
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onClanCreate(ClanCreatedEvent event)
|
||||
public void onClanCreate(ClanCreationCompleteEvent event)
|
||||
{
|
||||
if (contains(event.getFounder()))
|
||||
{
|
||||
|
@ -5,11 +5,15 @@ import org.bukkit.event.EventHandler;
|
||||
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.game.clans.clans.event.ClanSetHomeEvent;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ClanObjective;
|
||||
|
||||
public class SetHomeGoal extends ObjectiveGoal
|
||||
public class SetHomeGoal extends ObjectiveGoal<ClanObjective>
|
||||
{
|
||||
public SetHomeGoal(Objective objective)
|
||||
public SetHomeGoal(ClanObjective objective)
|
||||
{
|
||||
super(objective, "Set Home", "Set your Clan's home by typing /c sethome");
|
||||
}
|
||||
@ -28,8 +32,17 @@ public class SetHomeGoal extends ObjectiveGoal
|
||||
public void onSetHome(ClanSetHomeEvent event)
|
||||
{
|
||||
if (contains(event.getPlayer()))
|
||||
{
|
||||
if (getObjective().getPlugin().isIn(event.getPlayer(), ClansMainTutorial.Bounds.LAND_CLAIM))
|
||||
{
|
||||
finish(event.getPlayer());
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Tutorial", "You must set your home in your own land claim"));
|
||||
}
|
||||
finish(event.getPlayer());
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ public class StealEnemyPotatoesGoal extends ObjectiveGoal
|
||||
@Override
|
||||
protected void customStart(Player player)
|
||||
{
|
||||
|
||||
finish(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,16 +1,23 @@
|
||||
package mineplex.game.clans.tutorial.tutorials.clans.objective.goals.shops;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import mineplex.core.common.objective.Objective;
|
||||
import mineplex.core.common.objective.ObjectiveGoal;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.game.clans.clans.event.ClanCreatedEvent;
|
||||
import mineplex.game.clans.clans.event.PlayerEnterTerritoryEvent;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.ClansMainTutorial;
|
||||
import mineplex.game.clans.tutorial.tutorials.clans.objective.ShopsObjective;
|
||||
|
||||
public class GoToShopsGoal extends ObjectiveGoal
|
||||
public class GoToShopsGoal extends ObjectiveGoal<ShopsObjective>
|
||||
{
|
||||
public GoToShopsGoal(Objective objective)
|
||||
public GoToShopsGoal(ShopsObjective objective)
|
||||
{
|
||||
super(objective, "Go to the Shops", "Head over to the Shops (use your map)");
|
||||
}
|
||||
@ -28,19 +35,18 @@ public class GoToShopsGoal extends ObjectiveGoal
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void enterRegion(PlayerEnterTerritoryEvent event)
|
||||
{
|
||||
if (!contains(event.getPlayer()))
|
||||
public void checkRegion(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.FAST)
|
||||
return;
|
||||
}
|
||||
|
||||
// This "reverse" equals is to prevent an NPE
|
||||
if (!"Shops".equals(event.getNewTerritory()))
|
||||
for (UUID uuid : getActivePlayers())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
finish(event.getPlayer());
|
||||
Player player = UtilPlayer.searchExact(uuid);
|
||||
if (getObjective().getPlugin().isIn(player, ClansMainTutorial.Bounds.SHOPS))
|
||||
{
|
||||
finish(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Random;
|
||||
|
||||
import mineplex.core.reward.RewardManager;
|
||||
@ -1076,4 +1077,27 @@ public class HubManager extends MiniClientPlugin<HubClient>
|
||||
{
|
||||
playNextSong();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void trackPortalDelayPlayers(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.TICK)
|
||||
return;
|
||||
|
||||
for (Iterator<String> playerNameIterator = _portalTime.keySet().iterator(); playerNameIterator.hasNext();)
|
||||
{
|
||||
String playerName = playerNameIterator.next();
|
||||
|
||||
if (UtilTime.elapsed(_portalTime.get(playerName), 5000))
|
||||
{
|
||||
playerNameIterator.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
|
||||
if (player != null)
|
||||
System.out.println(playerName + "'s location: " + player.getLocation().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -256,8 +256,13 @@ public class StackerManager extends MiniPlugin implements IThrown
|
||||
getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
if ((fThrower instanceof Player && !((Player)fThrower).isOnline())
|
||||
|| (fThroweeStack instanceof Player && !((Player)fThroweeStack).isOnline()))
|
||||
{
|
||||
fThrower.setPassenger(fThroweeStack);
|
||||
}
|
||||
|
||||
_tempStackShift.remove(fThroweeStack);
|
||||
}
|
||||
}, 2);
|
||||
@ -273,7 +278,7 @@ public class StackerManager extends MiniPlugin implements IThrown
|
||||
UtilPlayer.message(thrower, F.main("Stacker", "You threw " + F.name(UtilEnt.getName(throwee)) + "."));
|
||||
UtilPlayer.message(throwee, F.main("Stacker", "You were thrown by " + F.name(thrower.getName()) + "."));
|
||||
|
||||
System.out.println("Stacker throw.");
|
||||
System.out.println("Stacker throw (" + thrower.getName() + ") -> (" + UtilEnt.getName(throwee) + ")");
|
||||
|
||||
UtilAction.velocity(throwee, thrower.getLocation().getDirection(), 1.8, false, 0, 0.3, 2, false);
|
||||
|
||||
|
@ -219,7 +219,7 @@ public class Arcade extends JavaPlugin
|
||||
for (String gameName : _serverConfiguration.getServerGroup().getGames().split(","))
|
||||
{
|
||||
try
|
||||
{
|
||||
{System.out.println(gameName);
|
||||
GameType type = GameType.valueOf(gameName);
|
||||
config.GameList.add(type);
|
||||
}
|
||||
|
@ -4,34 +4,6 @@ import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.block.BlockBurnEvent;
|
||||
import org.bukkit.event.block.BlockFadeEvent;
|
||||
import org.bukkit.event.block.BlockSpreadEvent;
|
||||
import org.bukkit.event.block.LeavesDecayEvent;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.MiniPlugin;
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
import mineplex.core.achievement.AchievementManager;
|
||||
@ -136,6 +108,35 @@ import nautilus.game.arcade.player.ArcadePlayer;
|
||||
import nautilus.game.arcade.shop.ArcadeShop;
|
||||
import net.minecraft.server.v1_8_R3.EntityLiving;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.block.BlockBurnEvent;
|
||||
import org.bukkit.event.block.BlockFadeEvent;
|
||||
import org.bukkit.event.block.BlockSpreadEvent;
|
||||
import org.bukkit.event.block.LeavesDecayEvent;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.util.Vector;
|
||||
import net.minecraft.server.v1_8_R3.EntityLiving;
|
||||
|
||||
public class ArcadeManager extends MiniPlugin implements IRelation
|
||||
{
|
||||
// Modules
|
||||
@ -910,6 +911,11 @@ public class ArcadeManager extends MiniPlugin implements IRelation
|
||||
|
||||
UtilInv.Clear(player);
|
||||
|
||||
UtilPlayer.setAutoDeploy(player, false);
|
||||
UtilPlayer.setGlidableWithoutWings(player, false);
|
||||
UtilPlayer.setGliding(player, false);
|
||||
UtilPlayer.setAutoDeployDistance(player, 1.15F);
|
||||
|
||||
((CraftEntity) player).getHandle().getDataWatcher().watch(0, Byte.valueOf((byte) 0), EntityLiving.META_ENTITYDATA, (byte) 0);
|
||||
|
||||
player.setCustomName("");
|
||||
|
@ -41,6 +41,7 @@ import nautilus.game.arcade.game.games.oldmineware.OldMineWare;
|
||||
import nautilus.game.arcade.game.games.paintball.Paintball;
|
||||
import nautilus.game.arcade.game.games.quiver.Quiver;
|
||||
import nautilus.game.arcade.game.games.quiver.QuiverTeams;
|
||||
import nautilus.game.arcade.game.games.rings.ElytraRings;
|
||||
import nautilus.game.arcade.game.games.runner.Runner;
|
||||
import nautilus.game.arcade.game.games.searchanddestroy.SearchAndDestroy;
|
||||
import nautilus.game.arcade.game.games.sheep.SheepGame;
|
||||
@ -89,6 +90,7 @@ public enum GameType
|
||||
Dragons(Dragons.class, GameDisplay.Dragons),
|
||||
DragonsTeams(DragonsTeams.class, GameDisplay.DragonsTeams),
|
||||
Draw(Draw.class, GameDisplay.Draw, "http://chivebox.com/mineplex/ResDrawMyThing.zip", true),
|
||||
ElytraRings(ElytraRings.class, GameDisplay.ElytraRings),
|
||||
Evolution(Evolution.class, GameDisplay.Evolution),
|
||||
Gravity(Gravity.class, GameDisplay.Gravity),
|
||||
Halloween(Halloween.class, GameDisplay.Halloween, "http://file.mineplex.com/ResHalloween.zip", true),
|
||||
|
@ -1118,11 +1118,17 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
while (!UtilBlock.airFoliage(block))
|
||||
{
|
||||
block = block.getRelative(BlockFace.UP);
|
||||
|
||||
if (block.getY() >= 256)
|
||||
break;
|
||||
}
|
||||
|
||||
while (UtilBlock.airFoliage(block))
|
||||
{
|
||||
block = block.getRelative(BlockFace.DOWN);
|
||||
|
||||
if (block.getY() <= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
block = block.getRelative(BlockFace.UP);
|
||||
@ -1943,4 +1949,10 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
public void setBridgeTime(int time)
|
||||
{
|
||||
_bridgeTime = time;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,7 +17,9 @@ import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilSystem;
|
||||
import mineplex.core.common.util.UtilText;
|
||||
import mineplex.core.common.util.UtilTextMiddle;
|
||||
import mineplex.core.common.util.UtilEvent.ActionType;
|
||||
import mineplex.core.common.util.UtilInv;
|
||||
import mineplex.core.creature.event.CreatureKillEntitiesEvent;
|
||||
import mineplex.core.event.StackerEvent;
|
||||
import mineplex.core.gadget.gadgets.morph.MorphBlock;
|
||||
@ -30,6 +32,7 @@ import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
import nautilus.game.arcade.ArcadeManager;
|
||||
import nautilus.game.arcade.events.PlayerDeathOutEvent;
|
||||
import nautilus.game.arcade.game.games.bridge.Bridge;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -452,6 +455,84 @@ public class EventModule extends MiniPlugin
|
||||
}
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "You gave the gadget " + F.item(gadget) + " to all Players!"));
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("announce"))
|
||||
{
|
||||
String text = args[1];
|
||||
|
||||
for (int i = 2; i < args.length; i++)
|
||||
{
|
||||
text += " " + args[i];
|
||||
}
|
||||
|
||||
UtilTextMiddle.display(C.cDGreenB + "Announcement", text);
|
||||
UtilServer.broadcast(F.main("Event Announcement", text));
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("clear"))
|
||||
{
|
||||
String playerName = args[1];
|
||||
|
||||
if (playerName.equalsIgnoreCase("@a"))
|
||||
{
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
{
|
||||
UtilInv.Clear(player);
|
||||
}
|
||||
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "Cleared everyone's inventory!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Player player = Bukkit.getPlayer(args[1]);
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), "No matches for: " + F.elem(args[1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilInv.Clear(player);
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "Cleared " + F.elem(player.getName() + "'s") + " inventory!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("bridge"))
|
||||
{
|
||||
if (!(Manager.GetGame() instanceof Bridge))
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "You can only drop the bridges in Bridges!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (((Bridge) Manager.GetGame()).isBridgesDown())
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "The bridges have already dropped!"));
|
||||
return;
|
||||
}
|
||||
|
||||
int seconds = 10;
|
||||
|
||||
if (args.length > 1)
|
||||
{
|
||||
try
|
||||
{
|
||||
seconds = Integer.parseInt(args[1]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "Invalid integer for seconds!"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (seconds < 0)
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "Seconds must be greater than 0!"));
|
||||
return;
|
||||
}
|
||||
|
||||
((Bridge) Manager.GetGame()).setBridgeTime((int) ((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + seconds * 1000));
|
||||
UtilPlayer.message(event.getPlayer(), F.main("Event", "Bridges will drop in " + F.elem(seconds + " Seconds") + "!"));
|
||||
}
|
||||
}
|
||||
|
||||
public void listSettings(Player player)
|
||||
|
@ -240,49 +240,42 @@ public class HideSeek extends TeamGame
|
||||
|
||||
for (Entry<Player, Form> entry : _forms.entrySet())
|
||||
{
|
||||
if (entry.getValue() instanceof BlockForm)
|
||||
{
|
||||
final BlockForm blockForm = (BlockForm) entry
|
||||
.getValue();
|
||||
if (!(entry.getValue() instanceof BlockForm))
|
||||
continue;
|
||||
|
||||
final BlockForm blockForm = (BlockForm) entry.getValue();
|
||||
|
||||
if (blockForm.Player.getEntityId() != id || blockForm.Player == packetInfo.getPlayer())
|
||||
continue;
|
||||
|
||||
if (blockForm.Player.getEntityId() == id
|
||||
&& blockForm.Player != packetInfo.getPlayer())
|
||||
{
|
||||
final Player player = packetInfo.getPlayer();
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(
|
||||
Manager.getPlugin(), new Runnable()
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
UtilPlayer
|
||||
.sendPacket(
|
||||
player,
|
||||
blockForm
|
||||
.getBlockPackets(UtilPlayer.is1_9(player)));
|
||||
UtilPlayer.sendPacket(player, blockForm.getBlockPackets(UtilPlayer.is1_9(player)));
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (packetInfo.getPacket() instanceof PacketPlayOutEntityDestroy)
|
||||
{
|
||||
for (int i : ((PacketPlayOutEntityDestroy) packetInfo
|
||||
.getPacket()).a)
|
||||
for (int i : ((PacketPlayOutEntityDestroy) packetInfo.getPacket()).a)
|
||||
{
|
||||
for (Entry<Player, Form> entry : _forms.entrySet())
|
||||
{
|
||||
if (entry.getValue() instanceof BlockForm)
|
||||
{
|
||||
if (!(entry.getValue() instanceof BlockForm))
|
||||
continue;
|
||||
|
||||
BlockForm blockForm = (BlockForm) entry.getValue();
|
||||
|
||||
if (blockForm.Player.getEntityId() == i)
|
||||
{
|
||||
UtilPlayer.sendPacket(packetInfo.getPlayer(),
|
||||
new PacketPlayOutEntityDestroy(
|
||||
new int[]
|
||||
if (blockForm.Player.getEntityId() != i)
|
||||
continue;
|
||||
|
||||
UtilPlayer.sendPacket(packetInfo.getPlayer(), new PacketPlayOutEntityDestroy(new int[]
|
||||
{
|
||||
blockForm.getBlockId()
|
||||
}));
|
||||
@ -290,8 +283,6 @@ public class HideSeek extends TeamGame
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public HideSeek(ArcadeManager manager)
|
||||
|
@ -54,8 +54,8 @@ public class BlockForm extends Form
|
||||
private int _entityId;
|
||||
|
||||
private Location _loc;
|
||||
private int _selfEntityId1;
|
||||
private int _selfEntityId2;
|
||||
private int _fakeSilverfishId;
|
||||
private int _fakeBlockId;
|
||||
private Vector _lastSaw;
|
||||
private Vector _sawDiff = new Vector();
|
||||
private int _blockId = UtilEnt.getNewEntityId();
|
||||
@ -66,8 +66,8 @@ public class BlockForm extends Form
|
||||
|
||||
_mat = mat;
|
||||
_loc = player.getLocation();
|
||||
_selfEntityId1 = UtilEnt.getNewEntityId();
|
||||
_selfEntityId2 = UtilEnt.getNewEntityId();
|
||||
_fakeSilverfishId = UtilEnt.getNewEntityId();
|
||||
_fakeBlockId = UtilEnt.getNewEntityId();
|
||||
System.out.println("Block Form: " + _mat + " " + _mat.getId());
|
||||
}
|
||||
|
||||
@ -100,7 +100,7 @@ public class BlockForm extends Form
|
||||
Packet[] packets = new Packet[3];
|
||||
|
||||
PacketPlayOutSpawnEntityLiving packet1 = new PacketPlayOutSpawnEntityLiving();
|
||||
packet1.a = _selfEntityId1;
|
||||
packet1.a = _fakeSilverfishId;
|
||||
packet1.b = EntityType.SILVERFISH.getTypeId();
|
||||
packet1.c = (int) Math.floor(_lastSaw.getX() * 32);
|
||||
packet1.d = (int) Math.floor(_lastSaw.getY() * 32);
|
||||
@ -114,9 +114,9 @@ public class BlockForm extends Form
|
||||
|
||||
if (UtilPlayer.is1_9(Player))
|
||||
{
|
||||
packets[2] = new PacketPlayOutNewAttachEntity(_selfEntityId1, new int[]
|
||||
packets[2] = new PacketPlayOutNewAttachEntity(_fakeSilverfishId, new int[]
|
||||
{
|
||||
_selfEntityId2
|
||||
_fakeBlockId
|
||||
});
|
||||
|
||||
}
|
||||
@ -124,14 +124,14 @@ public class BlockForm extends Form
|
||||
{
|
||||
PacketPlayOutAttachEntity packet3 = new PacketPlayOutAttachEntity();
|
||||
|
||||
packet3.b = _selfEntityId2;
|
||||
packet3.c = _selfEntityId1;
|
||||
packet3.b = _fakeBlockId;
|
||||
packet3.c = _fakeSilverfishId;
|
||||
|
||||
packets[2] = packet3;
|
||||
}
|
||||
|
||||
PacketPlayOutSpawnEntity packet2 = new PacketPlayOutSpawnEntity(player, 70, _mat.getId());
|
||||
packet2.a = _selfEntityId2;
|
||||
packet2.a = _fakeBlockId;
|
||||
packet2.uuid = UUID.randomUUID();
|
||||
packets[1] = packet2;
|
||||
|
||||
@ -140,16 +140,11 @@ public class BlockForm extends Form
|
||||
// Inform
|
||||
String blockName = F.elem(ItemStackFactory.Instance.GetName(_mat, (byte) 0, false));
|
||||
if (!blockName.contains("Block"))
|
||||
UtilPlayer.message(
|
||||
Player,
|
||||
F.main("Game",
|
||||
C.cWhite + "You are now a "
|
||||
UtilPlayer.message(Player, F.main("Game", C.cWhite + "You are now a "
|
||||
+ F.elem(ItemStackFactory.Instance.GetName(_mat, (byte) 0, false) + " Block") + "!"));
|
||||
else
|
||||
UtilPlayer.message(
|
||||
Player,
|
||||
F.main("Game", C.cWhite + "You are now a " + F.elem(ItemStackFactory.Instance.GetName(_mat, (byte) 0, false))
|
||||
+ "!"));
|
||||
UtilPlayer.message(Player, F.main("Game",
|
||||
C.cWhite + "You are now a " + F.elem(ItemStackFactory.Instance.GetName(_mat, (byte) 0, false)) + "!"));
|
||||
|
||||
// Give Item
|
||||
Player.getInventory().setItem(8, new ItemStack(Host.GetItemEquivilent(_mat)));
|
||||
@ -171,11 +166,11 @@ public class BlockForm extends Form
|
||||
|
||||
if (is19)
|
||||
{
|
||||
packets[2] = new PacketPlayOutNewAttachEntity(_blockId, new int[]
|
||||
packets[1] = new PacketPlayOutNewAttachEntity(Player.getEntityId(), new int[]
|
||||
{
|
||||
Player.getEntityId()
|
||||
});
|
||||
_blockId
|
||||
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -203,8 +198,8 @@ public class BlockForm extends Form
|
||||
|
||||
UtilPlayer.sendPacket(Player, new PacketPlayOutEntityDestroy(new int[]
|
||||
{
|
||||
_selfEntityId1,
|
||||
_selfEntityId2,
|
||||
_fakeSilverfishId,
|
||||
_fakeBlockId,
|
||||
_blockId
|
||||
}));
|
||||
|
||||
@ -214,8 +209,8 @@ public class BlockForm extends Form
|
||||
public void SolidifyUpdate()
|
||||
{
|
||||
if (!Player.isSprinting())
|
||||
((CraftEntity) Player).getHandle().getDataWatcher()
|
||||
.watch(0, Byte.valueOf((byte) 32), Entity.META_ENTITYDATA, (byte) 32);
|
||||
((CraftEntity) Player).getHandle().getDataWatcher().watch(0, Byte.valueOf((byte) 32), Entity.META_ENTITYDATA,
|
||||
(byte) 32);
|
||||
|
||||
// Not a Block
|
||||
if (_block == null)
|
||||
@ -273,19 +268,19 @@ public class BlockForm extends Form
|
||||
|
||||
_sawDiff.add(blockLoc.clone().subtract(_lastSaw));
|
||||
|
||||
Packet packet = this.getPacket(_sawDiff, blockLoc);
|
||||
Packet[] packet = this.getPacket(_sawDiff, blockLoc);
|
||||
|
||||
_lastSaw = Player.getLocation().toVector().subtract(new Vector(0, 0.15625, 0));
|
||||
_sawDiff = _lastSaw.clone().subtract(blockLoc);
|
||||
|
||||
if (packet != null)
|
||||
{
|
||||
if (packet instanceof PacketPlayOutEntityTeleport)
|
||||
if (packet[0] instanceof PacketPlayOutEntityTeleport)
|
||||
{
|
||||
_sawDiff = new Vector();
|
||||
}
|
||||
|
||||
((CraftPlayer) Player).getHandle().playerConnection.sendPacket(packet);
|
||||
UtilPlayer.sendPacket(Player, packet[UtilPlayer.is1_9(Player) ? 1 : 0]);
|
||||
}
|
||||
|
||||
for (Player player : UtilServer.getPlayers())
|
||||
@ -321,8 +316,8 @@ public class BlockForm extends Form
|
||||
MapUtil.QuickChangeBlockAt(_block.getLocation(), 0, (byte) 0);
|
||||
_block = null;
|
||||
|
||||
EntityTrackerEntry tracker = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) Player).getHandle().world).tracker.trackedEntities
|
||||
.get(Player.getEntityId());
|
||||
EntityTrackerEntry tracker = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) Player)
|
||||
.getHandle().world).tracker.trackedEntities.get(Player.getEntityId());
|
||||
|
||||
if (tracker != null)
|
||||
{
|
||||
@ -374,13 +369,13 @@ public class BlockForm extends Form
|
||||
|
||||
_lastSaw = Player.getLocation().subtract(0, 0.15625, 0).toVector();
|
||||
|
||||
Packet packet = this.getPacket(_sawDiff, _lastSaw);
|
||||
Packet[] packet = this.getPacket(_sawDiff, _lastSaw);
|
||||
|
||||
if (packet != null)
|
||||
{
|
||||
if (packet instanceof PacketPlayOutRelEntityMove)
|
||||
if (!UtilPlayer.is1_9(Player) && packet[0] instanceof PacketPlayOutRelEntityMove)
|
||||
{
|
||||
PacketPlayOutRelEntityMove relPacket = (PacketPlayOutRelEntityMove) packet;
|
||||
PacketPlayOutRelEntityMove relPacket = (PacketPlayOutRelEntityMove) packet[0];
|
||||
_sawDiff.subtract(new Vector(relPacket.b / 32D, relPacket.c / 32D, relPacket.d / 32D));
|
||||
}
|
||||
else
|
||||
@ -388,12 +383,12 @@ public class BlockForm extends Form
|
||||
_sawDiff = new Vector();
|
||||
}
|
||||
|
||||
UtilPlayer.sendPacket(Player, packet);
|
||||
UtilPlayer.sendPacket(Player, packet[UtilPlayer.is1_9(Player) ? 1 : 0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Packet getPacket(Vector blocksFromNewPosition, Vector newPosition)
|
||||
private Packet[] getPacket(Vector blocksFromNewPosition, Vector newPosition)
|
||||
{
|
||||
int x = (int) Math.floor(blocksFromNewPosition.getX() * 32);
|
||||
int y = (int) Math.floor(blocksFromNewPosition.getY() * 32);
|
||||
@ -401,26 +396,33 @@ public class BlockForm extends Form
|
||||
|
||||
if (x != 0 || y != 0 || z != 0)
|
||||
{
|
||||
Packet[] packets = new Packet[2];
|
||||
|
||||
if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127)
|
||||
{
|
||||
PacketPlayOutRelEntityMove relMove = new PacketPlayOutRelEntityMove();
|
||||
relMove.a = this._selfEntityId1;
|
||||
relMove.a = this._fakeSilverfishId;
|
||||
relMove.b = (byte) x;
|
||||
relMove.c = (byte) y;
|
||||
relMove.d = (byte) z;
|
||||
|
||||
return relMove;
|
||||
packets[0] = relMove;
|
||||
}
|
||||
else
|
||||
|
||||
{
|
||||
PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport();
|
||||
teleportPacket.a = _selfEntityId1;
|
||||
teleportPacket.a = _fakeSilverfishId;
|
||||
teleportPacket.b = (int) Math.floor(32 * newPosition.getX());
|
||||
teleportPacket.c = (int) Math.floor(32 * newPosition.getY());
|
||||
teleportPacket.d = (int) Math.floor(32 * newPosition.getZ());
|
||||
|
||||
return teleportPacket;
|
||||
if (packets[0] == null)
|
||||
packets[0] = teleportPacket;
|
||||
|
||||
packets[1] = teleportPacket;
|
||||
}
|
||||
|
||||
return packets;
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -0,0 +1,253 @@
|
||||
package nautilus.game.arcade.game.games.rings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerToggleSneakEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.UtilAction;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilParticle.ParticleType;
|
||||
import mineplex.core.common.util.UtilParticle.ViewDist;
|
||||
import mineplex.core.common.util.UtilShapes;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import nautilus.game.arcade.ArcadeManager;
|
||||
import nautilus.game.arcade.GameType;
|
||||
import nautilus.game.arcade.events.GameStateChangeEvent;
|
||||
import nautilus.game.arcade.events.PlayerGameRespawnEvent;
|
||||
import nautilus.game.arcade.game.SoloGame;
|
||||
import nautilus.game.arcade.game.games.uhc.KitUHC;
|
||||
import nautilus.game.arcade.kit.Kit;
|
||||
|
||||
public class ElytraRings extends SoloGame
|
||||
{
|
||||
private HashMap<Integer, Ring> _rings = new HashMap<Integer, Ring>();
|
||||
private HashMap<UUID, Integer> _goneThrough = new HashMap<UUID, Integer>();
|
||||
private HashMap<UUID, Location> _lastLocation = new HashMap<UUID, Location>();
|
||||
|
||||
public ElytraRings(ArcadeManager manager)
|
||||
{
|
||||
super(manager, GameType.ElytraRings, new Kit[]
|
||||
{
|
||||
// new KitElytraRings(manager)
|
||||
}, new String[]
|
||||
{
|
||||
"Fly through the rings!"
|
||||
});
|
||||
|
||||
DeathOut = false;
|
||||
DeathMessages = false;
|
||||
}
|
||||
|
||||
public void RespawnPlayer(final Player player)
|
||||
{
|
||||
player.eject();
|
||||
|
||||
if (_goneThrough.containsKey(player.getUniqueId()) && _rings.containsKey(_goneThrough.get(player.getUniqueId())))
|
||||
{
|
||||
Ring ring = _rings.get(_goneThrough.get(player.getUniqueId()));
|
||||
|
||||
player.teleport(ring.getCenter());
|
||||
}
|
||||
else if (_goneThrough.containsKey(player.getUniqueId()) && _rings.containsKey(_goneThrough.get(player.getUniqueId()) + 1))
|
||||
{
|
||||
Ring ring = _rings.get(_goneThrough.get(player.getUniqueId()) + 1);
|
||||
|
||||
player.teleport(ring.getCenter());
|
||||
}
|
||||
else
|
||||
{
|
||||
player.teleport(GetTeam(player).GetSpawn());
|
||||
}
|
||||
|
||||
Manager.Clear(player);
|
||||
|
||||
// Event
|
||||
PlayerGameRespawnEvent event = new PlayerGameRespawnEvent(this, player);
|
||||
UtilServer.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
// Re-Give Kit
|
||||
Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
GetKit(player).ApplyKit(player);
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ParseData()
|
||||
{
|
||||
Location loc = UtilAlg.getAverageLocation(GetTeamList().get(0).GetSpawns());
|
||||
BlockFace currentDirection = BlockFace.values()[UtilMath.r(4)];
|
||||
|
||||
while (_rings.size() < 30)
|
||||
{
|
||||
int dist = UtilMath.r(40);
|
||||
|
||||
loc = loc.getBlock().getRelative(currentDirection, 20).getLocation();
|
||||
|
||||
generateRing(loc, currentDirection, 2 + UtilMath.r(2) + UtilMath.r(2));
|
||||
}
|
||||
|
||||
loc = loc.getBlock().getRelative(currentDirection, 20).getLocation();
|
||||
|
||||
Ring ring = generateRing(loc, currentDirection, 7);
|
||||
|
||||
for (Block b : ring.getRing())
|
||||
{
|
||||
b.setType(Material.GOLD_BLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onGameStart(GameStateChangeEvent event)
|
||||
{
|
||||
if (event.GetState() != GameState.Prepare)
|
||||
return;
|
||||
|
||||
for (Player player : this.GetPlayers(true))
|
||||
{
|
||||
player.getInventory().setChestplate(new ItemStack(Material.ELYTRA));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(PlayerMoveEvent event)
|
||||
{
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
|
||||
if (!IsAlive(event.getPlayer()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
int current = 1;
|
||||
|
||||
if (_goneThrough.containsKey(player.getUniqueId()))
|
||||
{
|
||||
current = _goneThrough.get(player.getUniqueId()) + 1;
|
||||
}
|
||||
|
||||
if (!_rings.containsKey(current))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Ring ring = _rings.get(current);
|
||||
|
||||
if (!ring.isMoveThroughRing(event.getFrom(), event.getTo()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_goneThrough.put(player.getUniqueId(), current + 1);
|
||||
|
||||
Announce(player.getName() + " has gone through ring " + current + "!");
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onSpeedBoost(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.TICK)
|
||||
return;
|
||||
|
||||
for (Player player : GetPlayers(true))
|
||||
{
|
||||
float exp = player.getExp();
|
||||
|
||||
exp += 0.02;
|
||||
|
||||
if (exp > 0.05 && _lastLocation.containsKey(player.getUniqueId()))
|
||||
{
|
||||
UtilAction.velocity(player, player.getLocation().getDirection().multiply(0.3));
|
||||
|
||||
if (!_goneThrough.containsKey(player.getUniqueId())
|
||||
|| _rings.containsKey(_goneThrough.get(player.getUniqueId()) + 1))
|
||||
{
|
||||
exp -= 0.05;
|
||||
}
|
||||
|
||||
for (Location loc : UtilShapes.getLinesDistancedPoints(_lastLocation.get(player.getUniqueId()),
|
||||
player.getLocation(), 0.3))
|
||||
{
|
||||
UtilParticle.PlayParticleToAll(ParticleType.CLOUD, loc, 0.2F, 0.2F, 0.2F, 0, 3, ViewDist.LONGER);
|
||||
}
|
||||
|
||||
_lastLocation.put(player.getUniqueId(), player.getLocation());
|
||||
}
|
||||
|
||||
player.setExp(Math.min(exp, 1));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onToggleSneak(PlayerToggleSneakEvent event)
|
||||
{
|
||||
if (!IsAlive(event.getPlayer()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (event.isSneaking() && UtilPlayer.isGliding(player))
|
||||
{
|
||||
_lastLocation.put(player.getUniqueId(), player.getLocation());
|
||||
}
|
||||
else
|
||||
{
|
||||
_lastLocation.remove(player.getUniqueId());
|
||||
}
|
||||
}
|
||||
|
||||
private Ring generateRing(Location center, BlockFace direction, int size)
|
||||
{
|
||||
ArrayList<Block> blocks = new ArrayList<Block>();
|
||||
ArrayList<Block> hole = new ArrayList<Block>();
|
||||
|
||||
for (Location loc : UtilShapes.rotate(UtilShapes.getSphereBlocks(center, size, size, true),
|
||||
UtilShapes.getFacing(direction)))
|
||||
{
|
||||
blocks.add(loc.getBlock());
|
||||
}
|
||||
|
||||
size--;
|
||||
|
||||
for (Location loc : UtilShapes.rotate(UtilShapes.getSphereBlocks(center, size, size, false),
|
||||
UtilShapes.getFacing(direction)))
|
||||
{
|
||||
hole.add(loc.getBlock());
|
||||
}
|
||||
|
||||
center.setDirection(new Vector(direction.getModX(), direction.getModY(), direction.getModZ()));
|
||||
|
||||
Ring ring = new Ring(blocks, hole, center.clone());
|
||||
|
||||
for (Block b : ring.getRing())
|
||||
{
|
||||
b.setTypeIdAndData(Material.STAINED_CLAY.getId(), (byte) 4, false);
|
||||
}
|
||||
|
||||
_rings.put(_rings.size() + 1, ring);
|
||||
|
||||
return ring;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package nautilus.game.arcade.game.games.rings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
|
||||
public class Ring
|
||||
{
|
||||
private ArrayList<Block> _core = new ArrayList<Block>();
|
||||
private ArrayList<Block> _ring = new ArrayList<Block>();
|
||||
private Location _center;
|
||||
|
||||
public Ring(ArrayList<Block> blocks, ArrayList<Block> inside, Location center)
|
||||
{
|
||||
_core = inside;
|
||||
_ring = blocks;
|
||||
_center = center;
|
||||
}
|
||||
|
||||
public Location getCenter()
|
||||
{
|
||||
return _center;
|
||||
}
|
||||
|
||||
public ArrayList<Block> getRing()
|
||||
{
|
||||
return _ring;
|
||||
}
|
||||
|
||||
public boolean isMoveThroughRing(Location from, Location to)
|
||||
{
|
||||
from = from.clone();
|
||||
to = to.clone();
|
||||
from.setX(from.getBlockX() + 0.5);
|
||||
from.setY(from.getBlockY() + 0.5);
|
||||
from.setZ(from.getBlockZ() + 0.5);
|
||||
to.setX(to.getBlockX() + 0.5);
|
||||
to.setY(to.getBlockY() + 0.5);
|
||||
to.setZ(to.getBlockZ() + 0.5);
|
||||
|
||||
Vector vec = UtilAlg.getTrajectory(from, to).multiply(0.5);
|
||||
double dist = UtilMath.offset(from, to);
|
||||
|
||||
while (dist > 0)
|
||||
{
|
||||
dist -= 0.5;
|
||||
|
||||
Location loc = from.getBlock().getLocation().add(0.5, 0.5, 0.5);
|
||||
|
||||
if (_core.contains(loc.getBlock()))
|
||||
return true;
|
||||
|
||||
if (_core.contains(loc.clone().add(loc.getX() == 0 ? 0 : loc.getX() > 0 ? 1 : -1, 0, 0)))
|
||||
return true;
|
||||
|
||||
if (_core.contains(loc.clone().add(0, loc.getY() == 0 ? 0 : loc.getY() > 0 ? 1 : -1, 0)))
|
||||
return true;
|
||||
|
||||
if (_core.contains(loc.clone().add(0, 0, loc.getZ() == 0 ? 0 : loc.getZ() > 0 ? 1 : -1)))
|
||||
return true;
|
||||
|
||||
from.add(vec);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -29,6 +29,7 @@ import org.bukkit.util.Vector;
|
||||
|
||||
import net.minecraft.server.v1_8_R3.EntityCreature;
|
||||
import net.minecraft.server.v1_8_R3.Navigation;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity;
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
@ -52,6 +53,9 @@ import nautilus.game.arcade.GameType;
|
||||
import nautilus.game.arcade.events.GamePrepareCountdownCommence;
|
||||
import nautilus.game.arcade.events.GameStateChangeEvent;
|
||||
import nautilus.game.arcade.game.SoloGame;
|
||||
import nautilus.game.arcade.game.Game.GameState;
|
||||
import nautilus.game.arcade.game.games.snake.events.SlimeUpgradeEvent;
|
||||
import nautilus.game.arcade.game.games.snake.events.TailGrowEvent;
|
||||
import nautilus.game.arcade.game.games.snake.kits.KitInvulnerable;
|
||||
import nautilus.game.arcade.game.games.snake.kits.KitReverser;
|
||||
import nautilus.game.arcade.game.games.snake.kits.KitSpeed;
|
||||
@ -63,57 +67,6 @@ import nautilus.game.arcade.stats.SlimySheepStatTracker;
|
||||
|
||||
public class Snake extends SoloGame
|
||||
{
|
||||
public static class TailGrowEvent extends PlayerEvent
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return getHandlerList();
|
||||
}
|
||||
|
||||
private final int _length;
|
||||
|
||||
public TailGrowEvent(Player who, int length)
|
||||
{
|
||||
super(who);
|
||||
|
||||
_length = length;
|
||||
}
|
||||
|
||||
public int getLength()
|
||||
{
|
||||
return _length;
|
||||
}
|
||||
}
|
||||
|
||||
public static class SlimeUpgradeEvent extends PlayerEvent
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return getHandlerList();
|
||||
}
|
||||
|
||||
public SlimeUpgradeEvent(Player who)
|
||||
{
|
||||
super(who);
|
||||
}
|
||||
}
|
||||
|
||||
private double _maxSpeed = 180;
|
||||
|
||||
private HashMap<Player, ArrayList<Creature>> _tail = new HashMap<Player, ArrayList<Creature>>();
|
||||
@ -730,4 +683,22 @@ public class Snake extends SoloGame
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void handleInteractEntityPacket(GameStateChangeEvent event)
|
||||
{
|
||||
if (event.GetState() == GameState.Dead)
|
||||
{
|
||||
_tail.clear();
|
||||
_food.clear();
|
||||
_color.clear();
|
||||
_invul.clear();
|
||||
_speed.clear();
|
||||
_reverse.clear();
|
||||
_move.clear();
|
||||
_moveTime.clear();
|
||||
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,26 @@
|
||||
package nautilus.game.arcade.game.games.snake.events;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
|
||||
public class SlimeUpgradeEvent extends PlayerEvent
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return getHandlerList();
|
||||
}
|
||||
|
||||
public SlimeUpgradeEvent(Player who)
|
||||
{
|
||||
super(who);
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package nautilus.game.arcade.game.games.snake.events;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
|
||||
public class TailGrowEvent extends PlayerEvent
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return getHandlerList();
|
||||
}
|
||||
|
||||
private final int _length;
|
||||
|
||||
public TailGrowEvent(Player who, int length)
|
||||
{
|
||||
super(who);
|
||||
|
||||
_length = length;
|
||||
}
|
||||
|
||||
public int getLength()
|
||||
{
|
||||
return _length;
|
||||
}
|
||||
}
|
@ -369,7 +369,7 @@ public class TurfForts extends TeamGame
|
||||
|
||||
//On Own
|
||||
Block block = event.getBlock().getRelative(BlockFace.DOWN);
|
||||
while (block.getTypeId() == 0)
|
||||
while (block.getTypeId() == 0 && block.getY() > 0)
|
||||
block = block.getRelative(BlockFace.DOWN);
|
||||
|
||||
if (block.getData() != team.GetColorData())
|
||||
|
@ -4,7 +4,7 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
|
||||
import nautilus.game.arcade.game.Game;
|
||||
import nautilus.game.arcade.game.games.snake.Snake;
|
||||
import nautilus.game.arcade.game.games.snake.events.TailGrowEvent;
|
||||
|
||||
public class ChooChooStatTracker extends StatTracker<Game>
|
||||
{
|
||||
@ -14,7 +14,7 @@ public class ChooChooStatTracker extends StatTracker<Game>
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||
public void onTailGrow(Snake.TailGrowEvent event)
|
||||
public void onTailGrow(TailGrowEvent event)
|
||||
{
|
||||
if (getGame().GetState() != Game.GameState.Live)
|
||||
return;
|
||||
|
@ -8,7 +8,7 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
|
||||
import nautilus.game.arcade.game.Game;
|
||||
import nautilus.game.arcade.game.games.snake.Snake;
|
||||
import nautilus.game.arcade.game.games.snake.events.SlimeUpgradeEvent;
|
||||
|
||||
public class SlimySheepStatTracker extends StatTracker<Game>
|
||||
{
|
||||
@ -20,7 +20,7 @@ public class SlimySheepStatTracker extends StatTracker<Game>
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||
public void onSlimeUpgrade(Snake.SlimeUpgradeEvent event)
|
||||
public void onSlimeUpgrade(SlimeUpgradeEvent event)
|
||||
{
|
||||
if (getGame().GetState() != Game.GameState.Live)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user