Skip to content

Commit

Permalink
Fix for Citizen NPC
Browse files Browse the repository at this point in the history
  • Loading branch information
arboriginal committed Feb 24, 2019
1 parent b9eecaa commit 9dcbb7b
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 132 deletions.
266 changes: 135 additions & 131 deletions src/me/arboriginal/PlayerRider/PlayerRider.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,25 @@ public class PlayerRider extends JavaPlugin implements Listener {
// JavaPlugin methods
// -----------------------------------------------------------------------------------------------

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equalsIgnoreCase("prider-reload")) {
reloadConfig();
userMessage(sender, "reload");

return true;
}

return super.onCommand(sender, command, label, args);
}

@Override
public void onDisable() {
super.onDisable();

HandlerList.unregisterAll((JavaPlugin) this);
}

@Override
public void onEnable() {
cooldown = new PRcooldown();
Expand Down Expand Up @@ -68,96 +87,62 @@ public void reloadConfig() {
}
}

@Override
public void onDisable() {
super.onDisable();

HandlerList.unregisterAll((JavaPlugin) this);
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equalsIgnoreCase("prider-reload")) {
reloadConfig();
userMessage(sender, "reload");

return true;
}

return super.onCommand(sender, command, label, args);
}

// -----------------------------------------------------------------------------------------------
// Listener methods
// -----------------------------------------------------------------------------------------------

@EventHandler
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
// https://www.spigotmc.org/threads/how-would-i-stop-an-event-from-being-called-twice.135234/#post-1434104
if (event.getHand() == EquipmentSlot.OFF_HAND || !(event.getRightClicked() instanceof Player)) return;

Player player = event.getPlayer(), duck = (Player) event.getRightClicked();

if (player.getPassengers().contains(duck)) {
if (player.getLocation().getPitch() < config.getDouble("eject_maxPitch")
&& player.hasPermission("playerrider.eject")
&& !cooldown.isActive("eject.perform", player, true)) {
player.eject();
alert("eject", duck, player);
cooldown.clear("eject.perform", player);
}
private boolean duckAllowed(Player duck, int passengersCount) {
ConfigurationSection section = config.getConfigurationSection("max_riders");

return;
for (String group : section.getKeys(false)) {
if ((group.equals("default") || duck.hasPermission("playerrider.duck." + group))
&& config.getInt("max_riders." + group) >= passengersCount)
return true;
}

if (!playerAllowed(player, "ride") || !duck.hasPermission("playerrider.duck") || player.isInsideVehicle()) return;

ItemStack item = player.getInventory().getItemInMainHand();

if (!config.getStringList("allowed_items.ride").contains(item.getType().toString())) return;
return false;
}

List<Entity> riders = duck.getPassengers();
int count = 0;
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled()) return;

while (riders.size() == 1 && riders.get(0) instanceof Player) {
duck = (Player) riders.get(0);
count++;
Entity injured = event.getEntity();

if (duck.equals(player)) {
return;
}
if (!isPlayer(injured)) return;

riders = duck.getPassengers();
if (config.getBoolean("prevent_suffocation")
&& event.getCause() == DamageCause.SUFFOCATION
&& isPlayer(injured.getVehicle())) {
event.setCancelled(true);
return;
}

if (riders.size() > 0) return;

if (!duckAllowed(duck, count + 1)) {
userMessage(player, "tooMany", player, duck);
if (config.getBoolean("getoff_when_hurt") && isPlayer(injured.getVehicle())) {
injured.leaveVehicle();
return;
}

if (duck.addPassenger(player)) {
consume(player, item, "ride");
alert("ride", player, duck);
cooldown.set("ride.perform", player, duck);
cooldown.set("eject.perform", duck);
}
else {
userMessage(player, "failed", player, duck);
if (config.getBoolean("eject_when_hurt") && injured.getPassengers().size() > 0) {
injured.eject();
return;
}
}

private boolean duckAllowed(Player duck, int passengersCount) {
ConfigurationSection section = config.getConfigurationSection("max_riders");
@EventHandler
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
Entity injured = event.getEntity();

for (String group : section.getKeys(false)) {
if ((group.equals("default") || duck.hasPermission("playerrider.duck." + group))
&& config.getInt("max_riders." + group) >= passengersCount)
return true;
}
if (!isPlayer(injured)) return;

return false;
if (config.getBoolean("prevent_hit_rider") && isPlayer(event.getDamager())) {
Entity vehicle = injured.getVehicle();

if (vehicle != null && event.getDamager().equals(vehicle)) {
event.setCancelled(true);
return;
}
}
}

@EventHandler
Expand All @@ -171,7 +156,7 @@ public void onPlayerInteract(PlayerInteractEvent event) {

if (!playerAllowed(player, "whip")
|| player.getLocation().getPitch() < config.getDouble("boost_maxPitch")
|| !(player.getVehicle() instanceof Player))
|| !isPlayer(player.getVehicle()))
return;

ItemStack item = player.getInventory().getItemInMainHand();
Expand Down Expand Up @@ -199,74 +184,65 @@ public void onPlayerInteract(PlayerInteractEvent event) {
}

@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled()) return;
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
// https://www.spigotmc.org/threads/how-would-i-stop-an-event-from-being-called-twice.135234/#post-1434104
if (event.getHand() == EquipmentSlot.OFF_HAND || !isPlayer(event.getRightClicked())) return;

Entity injured = event.getEntity();
Player player = event.getPlayer(), duck = (Player) event.getRightClicked();

if (!(injured instanceof Player)) return;
if (player.getPassengers().contains(duck)) {
if (player.getLocation().getPitch() < config.getDouble("eject_maxPitch")
&& player.hasPermission("playerrider.eject")
&& !cooldown.isActive("eject.perform", player, true)) {
player.eject();
alert("eject", duck, player);
cooldown.clear("eject.perform", player);
}

if (config.getBoolean("prevent_suffocation")
&& event.getCause() == DamageCause.SUFFOCATION
&& injured.getVehicle() instanceof Player) {
event.setCancelled(true);
return;
}

if (config.getBoolean("getoff_when_hurt") && injured.getVehicle() instanceof Player) {
injured.leaveVehicle();
return;
}
if (!playerAllowed(player, "ride") || !duck.hasPermission("playerrider.duck") || player.isInsideVehicle()) return;

if (config.getBoolean("eject_when_hurt") && injured.getPassengers().size() > 0) {
injured.eject();
return;
}
}
ItemStack item = player.getInventory().getItemInMainHand();

@EventHandler
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
Entity injured = event.getEntity();
if (!config.getStringList("allowed_items.ride").contains(item.getType().toString())) return;

if (!(injured instanceof Player)) return;
List<Entity> riders = duck.getPassengers();
int count = 0;

if (config.getBoolean("prevent_hit_rider") && event.getDamager() instanceof Player) {
Entity vehicle = injured.getVehicle();
while (riders.size() == 1 && isPlayer(riders.get(0))) {
duck = (Player) riders.get(0);
count++;

if (vehicle != null && event.getDamager().equals(vehicle)) {
event.setCancelled(true);
if (duck.equals(player)) {
return;
}

riders = duck.getPassengers();
}
}

// -----------------------------------------------------------------------------------------------
// Custom methods
// -----------------------------------------------------------------------------------------------
if (riders.size() > 0) return;

private boolean playerAllowed(Player player, String key) {
return player.hasPermission("playerrider." + key) || player.hasPermission("playerrider." + key + ".keepitem");
}
if (!duckAllowed(duck, count + 1)) {
userMessage(player, "tooMany", player, duck);
return;
}

private void consume(Player player, ItemStack item, String key) {
if (config.getBoolean("consume_items." + key)
&& !player.hasPermission("playerrider." + key + ".keepitem")
&& item.getType() != Material.AIR)
item.setAmount(item.getAmount() - 1);
if (duck.addPassenger(player)) {
consume(player, item, "ride");
alert("ride", player, duck);
cooldown.set("ride.perform", player, duck);
cooldown.set("eject.perform", duck);
}
else {
userMessage(player, "failed", player, duck);
}
}

protected static void warn(String key, Player player, Player duck, int delay) {
String[] parts = key.split("\\.");

if (parts.length != 2 || !parts[1].equals("perform")) return;

String message = PlayerRider.config.getString("warn_player_when_cooldown." + parts[0]);

if (message.isEmpty()) return;

((Player) player).spigot().sendMessage(ChatMessageType.ACTION_BAR,
new TextComponent(prepareMessage(message.replace("{delay}", "" + delay), player, duck)));
}
// -----------------------------------------------------------------------------------------------
// Custom methods
// -----------------------------------------------------------------------------------------------

private void alert(String key, Player player, Player duck) {
if (!cooldown.isActive(key + ".alertPlayer", player, duck)) {
Expand All @@ -285,18 +261,6 @@ private void alert(String key, Player player, Player duck) {
}
}

private void userMessage(CommandSender sender, String key) {
userMessage(sender, key, null, null);
}

private void userMessage(CommandSender sender, String key, CommandSender player, CommandSender duck) {
String message = config.getString(key);

if (!message.isEmpty()) {
sender.sendMessage(prepareMessage(message, player, duck));
}
}

private void broadcast(String key, CommandSender player, CommandSender duck) {
String message = config.getString("broadcast." + key);

Expand All @@ -305,6 +269,21 @@ private void broadcast(String key, CommandSender player, CommandSender duck) {
}
}

private void consume(Player player, ItemStack item, String key) {
if (config.getBoolean("consume_items." + key)
&& !player.hasPermission("playerrider." + key + ".keepitem")
&& item.getType() != Material.AIR)
item.setAmount(item.getAmount() - 1);
}

private boolean isPlayer(Entity entity) {
return (entity instanceof Player) && !entity.hasMetadata("NPC");
}

private boolean playerAllowed(Player player, String key) {
return player.hasPermission("playerrider." + key) || player.hasPermission("playerrider." + key + ".keepitem");
}

private static String prepareMessage(String message) {
return prepareMessage(message, null, null);
}
Expand All @@ -317,4 +296,29 @@ private static String prepareMessage(String message, CommandSender player, Comma

return ChatColor.translateAlternateColorCodes('&', message);
}

private void userMessage(CommandSender sender, String key) {
userMessage(sender, key, null, null);
}

private void userMessage(CommandSender sender, String key, CommandSender player, CommandSender duck) {
String message = config.getString(key);

if (!message.isEmpty()) {
sender.sendMessage(prepareMessage(message, player, duck));
}
}

protected static void warn(String key, Player player, Player duck, int delay) {
String[] parts = key.split("\\.");

if (parts.length != 2 || !parts[1].equals("perform")) return;

String message = PlayerRider.config.getString("warn_player_when_cooldown." + parts[0]);

if (message.isEmpty()) return;

((Player) player).spigot().sendMessage(ChatMessageType.ACTION_BAR,
new TextComponent(prepareMessage(message.replace("{delay}", "" + delay), player, duck)));
}
}
2 changes: 1 addition & 1 deletion src/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: PlayerRider
description: Allow you to ride players.
version: 1.13.1
version: 1.13.2

author: arboriginal
website: https://www.spigotmc.org/resources/playerrider.62799/
Expand Down

0 comments on commit 9dcbb7b

Please sign in to comment.