Refactor Stuffs
This commit is contained in:
parent
95905c6987
commit
22166e58b2
@ -2,16 +2,10 @@ package de.leafbla.meinkraft;
|
||||
|
||||
import de.leafbla.meinkraft.roleplay.RoleCommand;
|
||||
import de.leafbla.meinkraft.roleplay.RoleManager;
|
||||
import de.leafbla.meinkraft.roleplay.bomber.BomberListener;
|
||||
import de.leafbla.meinkraft.roleplay.fighter.FighterListener;
|
||||
import de.leafbla.meinkraft.roleplay.ninja.NinjaListener;
|
||||
import de.leafbla.meinkraft.roleplay.thief.ThiefListener;
|
||||
import de.leafbla.meinkraft.roleplay.wizard.WizardListener;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class Main extends JavaPlugin {
|
||||
|
||||
@ -19,20 +13,14 @@ public class Main extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
Bukkit.getLogger().log(Level.INFO, "Plugin disabled");
|
||||
Bukkit.getLogger().log(Level.INFO, "MeinKraft disabled");
|
||||
roleManager.unsetAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
Bukkit.getLogger().log(Level.INFO, "MeinKraft enabled");
|
||||
this.roleManager = new RoleManager(this);
|
||||
Bukkit.getLogger().log(Level.INFO, "Plugin enabled");
|
||||
getServer().getPluginManager().registerEvents(new ThiefListener(this), this);
|
||||
getServer().getPluginManager().registerEvents(new NinjaListener(this), this);
|
||||
getServer().getPluginManager().registerEvents(new BomberListener(this), this);
|
||||
getServer().getPluginManager().registerEvents(new FighterListener(this), this);
|
||||
getServer().getPluginManager().registerEvents(new WizardListener(this), this);
|
||||
|
||||
this.getCommand("role").setExecutor(new RoleCommand(this.roleManager));
|
||||
}
|
||||
}
|
||||
|
@ -4,41 +4,116 @@ import de.leafbla.meinkraft.Main;
|
||||
import de.leafbla.meinkraft.roleplay.wizard.ProjectileBlockHit;
|
||||
import de.leafbla.meinkraft.roleplay.wizard.ProjectileEntityHit;
|
||||
import de.leafbla.meinkraft.util.Pair;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Projectile;
|
||||
import org.bukkit.entity.Snowball;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class PlayerRole {
|
||||
public abstract class PlayerRole implements Listener {
|
||||
|
||||
protected final Map<Integer, Pair<ProjectileEntityHit, ProjectileBlockHit>> projectiles = new HashMap<>();
|
||||
protected final Map<Pair<Material, String>, Runnable> rightClickActions = new HashMap<>();
|
||||
protected final Player player;
|
||||
public final Main plugin;
|
||||
private final Role role;
|
||||
private final RoleManager roleManager;
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public PlayerRole(Main plugin, Player player, Role role) {
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
this.player = player;
|
||||
this.plugin = plugin;
|
||||
this.role = role;
|
||||
this.roleManager = plugin.roleManager;
|
||||
}
|
||||
|
||||
public Role getRole() {
|
||||
return this.role;
|
||||
}
|
||||
|
||||
public abstract void start();
|
||||
public abstract void onStart();
|
||||
|
||||
public abstract void end();
|
||||
public abstract void onEnd();
|
||||
|
||||
public void end() {
|
||||
this.onEnd();
|
||||
rightClickActions.keySet().forEach(pair -> player.getInventory().remove(pair.getLeft()));
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
|
||||
public Snowball launchProjectile(Material material, ProjectileEntityHit entityHit, ProjectileBlockHit blockHit) {
|
||||
Snowball snowball = Utils.launchProjectile(player, material);
|
||||
this.projectiles.put(snowball.getEntityId(), new Pair<>(entityHit, blockHit));
|
||||
return snowball;
|
||||
}
|
||||
|
||||
public boolean matchesRole(Player player) {
|
||||
PlayerRole playerRole = this.roleManager.getPlayerRole(player);
|
||||
if (playerRole == null) return false;
|
||||
return playerRole.getRole() == this.role;
|
||||
}
|
||||
|
||||
public void registerRightClickAction(Material material, String name, Runnable action) {
|
||||
player.getInventory().addItem(Utils.namedItem(material, name));
|
||||
Bukkit.broadcastMessage(String.format("registering RCA %s %s", material.name(), name));
|
||||
rightClickActions.put(new Pair<>(material, name), action);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteractRightClickHandItem(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
if (event.getHand() != EquipmentSlot.HAND) return;
|
||||
if (!event.getAction().name().contains("RIGHT")) return;
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
if (!itemStack.hasItemMeta()) return;
|
||||
Material material = itemStack.getType();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) return;
|
||||
if (!itemMeta.hasDisplayName()) return;
|
||||
String displayName = itemMeta.getDisplayName();
|
||||
Pair<Material, String> pair = new Pair<>(material, displayName);
|
||||
if (!rightClickActions.containsKey(pair)) return;
|
||||
Runnable runnable = rightClickActions.get(pair);
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onRegisteredProjectileHit(ProjectileHitEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getShooter();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
Projectile projectile = event.getEntity();
|
||||
if (this.projectiles.containsKey(projectile.getEntityId())) {
|
||||
ProjectileBlockHit projectileBlockHit = this.projectiles.get(projectile.getEntityId()).getRight();
|
||||
ProjectileEntityHit projectileEntityHit = this.projectiles.get(projectile.getEntityId()).getLeft();
|
||||
if (event.getHitEntity() != null) {
|
||||
projectileEntityHit.onHit(event, projectile, event.getHitEntity(), player);
|
||||
} else if (event.getHitBlock() != null) {
|
||||
Entity hitEntity = event.getHitEntity();
|
||||
projectileBlockHit.onHit(event, projectile, event.getHitBlock(), event.getHitBlockFace(), player);
|
||||
}
|
||||
this.projectiles.remove(projectile.getEntityId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ public class RoleManager {
|
||||
return;
|
||||
}
|
||||
this.classes.put(player, thePlayerRole);
|
||||
thePlayerRole.start();
|
||||
thePlayerRole.onStart();
|
||||
player.sendMessage(
|
||||
String.format("§eYou are now a §6%s§e!", StringUtils.capitalize(theclass.name()))
|
||||
);
|
||||
|
@ -1,118 +0,0 @@
|
||||
package de.leafbla.meinkraft.roleplay.bomber;
|
||||
|
||||
import de.leafbla.meinkraft.Main;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Snowball;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class BomberListener implements Listener {
|
||||
private final Main plugin;
|
||||
|
||||
private final Map<Location, Player> mines = new HashMap<>();
|
||||
private final Map<Player, Location> c4 = new HashMap<>();
|
||||
|
||||
public BomberListener(Main main) {
|
||||
this.plugin = main;
|
||||
}
|
||||
|
||||
public void onPlace(BlockPlaceEvent event) {
|
||||
if (event.getBlockPlaced().getType() == Material.STONE_PRESSURE_PLATE) {
|
||||
mines.put(event.getBlockPlaced().getLocation(), event.getPlayer());
|
||||
}
|
||||
if (event.getBlockPlaced().getType() == Material.TURTLE_EGG) {
|
||||
if (c4.containsKey(event.getPlayer())) {
|
||||
Location old = c4.get(event.getPlayer());
|
||||
old.getBlock().setType(Material.AIR);
|
||||
}
|
||||
c4.put(event.getPlayer(), event.getBlockPlaced().getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
public void onPlace(PlayerInteractEvent event) {
|
||||
if (event.getAction() == Action.PHYSICAL)
|
||||
if (event.getClickedBlock().getType() == Material.STONE_PRESSURE_PLATE) {
|
||||
World w = event.getClickedBlock().getWorld();
|
||||
Location loc = event.getClickedBlock().getLocation();
|
||||
if (mines.containsKey(loc)) {
|
||||
Player source = mines.get(loc);
|
||||
w.createExplosion(loc, 2f, false, false, source);
|
||||
mines.remove(loc);
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
loc.getBlock().setType(Material.AIR);
|
||||
}
|
||||
}.runTask(this.plugin);
|
||||
//mines.remove(loc);
|
||||
}
|
||||
}
|
||||
if (event.getAction().name().contains("RIGHT")) {
|
||||
if (event.getPlayer().getItemInHand().getType() == Material.REDSTONE_TORCH) {
|
||||
World w = event.getPlayer().getWorld();
|
||||
if (c4.containsKey(event.getPlayer())) {
|
||||
Location loc = c4.get(event.getPlayer());
|
||||
w.createExplosion(loc, 2f, false, false, event.getPlayer());
|
||||
w.getBlockAt(loc).setType(Material.AIR);
|
||||
c4.remove(event.getPlayer());
|
||||
}
|
||||
}
|
||||
if (event.getPlayer().getItemInHand().getType() == Material.SLIME_BALL) {
|
||||
ItemStack oneknife = new ItemStack(Material.SLIME_BALL, 1);
|
||||
Snowball ball = event.getPlayer().launchProjectile(Snowball.class);
|
||||
grenades.put(ball, event.getPlayer());
|
||||
ball.setVelocity(ball.getVelocity().multiply(.75));
|
||||
ball.setBounce(true);
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
ItemStack balls = event.getPlayer().getItemInHand();
|
||||
int amt = balls.getAmount();
|
||||
balls.setAmount(amt);
|
||||
event.getPlayer().setItemInHand(balls);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<Snowball, Player> grenades = new HashMap<>();
|
||||
|
||||
public void onLand(ProjectileHitEvent event) {
|
||||
if (event.getEntity() instanceof Snowball) {
|
||||
Snowball ball = (Snowball) event.getEntity();
|
||||
ItemStack item =
|
||||
CraftItemStack.asBukkitCopy(
|
||||
((CraftSnowball) ball).getHandle().getItem()
|
||||
);
|
||||
if (item.getType() == Material.SLIME_BALL) {
|
||||
if (grenades.containsKey(ball)) {
|
||||
Player thrower = grenades.get(ball);
|
||||
Location loc = event.getEntity().getLocation();
|
||||
World w = event.getEntity().getWorld();
|
||||
w.playSound(event.getEntity().getLocation(), Sound.ENTITY_CREEPER_PRIMED, 2, 1);
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
w.createExplosion(loc, 3f, false, false, thrower);
|
||||
}
|
||||
}.runTaskLater(this.plugin, 30);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,21 +3,39 @@ package de.leafbla.meinkraft.roleplay.bomber;
|
||||
import de.leafbla.meinkraft.Main;
|
||||
import de.leafbla.meinkraft.roleplay.PlayerRole;
|
||||
import de.leafbla.meinkraft.roleplay.Role;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Snowball;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class BomberRole extends PlayerRole {
|
||||
|
||||
private final Map<Location, Player> mines = new HashMap<>();
|
||||
private final Map<Player, Location> c4 = new HashMap<>();
|
||||
public BomberRole(Main plugin, Player player) {
|
||||
super(plugin, player, Role.BOMBER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
public void onStart() {
|
||||
player.setLevel(42);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end() {
|
||||
public void onEnd() {
|
||||
player.setLevel(0);
|
||||
}
|
||||
|
||||
@ -25,4 +43,90 @@ public class BomberRole extends PlayerRole {
|
||||
public Role getRole() {
|
||||
return Role.BOMBER;
|
||||
}
|
||||
|
||||
|
||||
public void onPlace(BlockPlaceEvent event) {
|
||||
if (event.getBlockPlaced().getType() == Material.STONE_PRESSURE_PLATE) {
|
||||
mines.put(event.getBlockPlaced().getLocation(), event.getPlayer());
|
||||
}
|
||||
if (event.getBlockPlaced().getType() == Material.TURTLE_EGG) {
|
||||
if (c4.containsKey(event.getPlayer())) {
|
||||
Location old = c4.get(event.getPlayer());
|
||||
old.getBlock().setType(Material.AIR);
|
||||
}
|
||||
c4.put(event.getPlayer(), event.getBlockPlaced().getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
public void onPlace(PlayerInteractEvent event) {
|
||||
if (event.getAction() == Action.PHYSICAL)
|
||||
if (event.getClickedBlock().getType() == Material.STONE_PRESSURE_PLATE) {
|
||||
World w = event.getClickedBlock().getWorld();
|
||||
Location loc = event.getClickedBlock().getLocation();
|
||||
if (mines.containsKey(loc)) {
|
||||
Player source = mines.get(loc);
|
||||
w.createExplosion(loc, 2f, false, false, source);
|
||||
mines.remove(loc);
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
loc.getBlock().setType(Material.AIR);
|
||||
}
|
||||
}.runTask(this.plugin);
|
||||
//mines.remove(loc);
|
||||
}
|
||||
}
|
||||
if (event.getAction().name().contains("RIGHT")) {
|
||||
if (event.getPlayer().getItemInHand().getType() == Material.REDSTONE_TORCH) {
|
||||
World w = event.getPlayer().getWorld();
|
||||
if (c4.containsKey(event.getPlayer())) {
|
||||
Location loc = c4.get(event.getPlayer());
|
||||
w.createExplosion(loc, 2f, false, false, event.getPlayer());
|
||||
w.getBlockAt(loc).setType(Material.AIR);
|
||||
c4.remove(event.getPlayer());
|
||||
}
|
||||
}
|
||||
if (event.getPlayer().getItemInHand().getType() == Material.SLIME_BALL) {
|
||||
ItemStack oneknife = new ItemStack(Material.SLIME_BALL, 1);
|
||||
Snowball ball = event.getPlayer().launchProjectile(Snowball.class);
|
||||
grenades.put(ball, event.getPlayer());
|
||||
ball.setVelocity(ball.getVelocity().multiply(.75));
|
||||
ball.setBounce(true);
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
ItemStack balls = event.getPlayer().getItemInHand();
|
||||
int amt = balls.getAmount();
|
||||
balls.setAmount(amt);
|
||||
event.getPlayer().setItemInHand(balls);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<Snowball, Player> grenades = new HashMap<>();
|
||||
|
||||
public void onLand(ProjectileHitEvent event) {
|
||||
if (event.getEntity() instanceof Snowball) {
|
||||
Snowball ball = (Snowball) event.getEntity();
|
||||
ItemStack item =
|
||||
CraftItemStack.asBukkitCopy(
|
||||
((CraftSnowball) ball).getHandle().getItem()
|
||||
);
|
||||
if (item.getType() == Material.SLIME_BALL) {
|
||||
if (grenades.containsKey(ball)) {
|
||||
Player thrower = grenades.get(ball);
|
||||
Location loc = event.getEntity().getLocation();
|
||||
World w = event.getEntity().getWorld();
|
||||
w.playSound(event.getEntity().getLocation(), Sound.ENTITY_CREEPER_PRIMED, 2, 1);
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
w.createExplosion(loc, 3f, false, false, thrower);
|
||||
}
|
||||
}.runTaskLater(this.plugin, 30);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,36 +0,0 @@
|
||||
package de.leafbla.meinkraft.roleplay.fighter;
|
||||
|
||||
import de.leafbla.meinkraft.Main;
|
||||
import de.leafbla.meinkraft.roleplay.Role;
|
||||
import de.leafbla.meinkraft.roleplay.RoleListener;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
|
||||
public class FighterListener extends RoleListener<FighterRole> {
|
||||
|
||||
public FighterListener(Main main) {
|
||||
super(Role.FIGHTER, main);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDamage(EntityDamageByEntityEvent event) {
|
||||
if (!(event.getDamager() instanceof Player)) return;
|
||||
Player player = (Player) event.getDamager();
|
||||
if (!this.matchesRole(player)) return;
|
||||
FighterRole role = this.getRole(player);
|
||||
if (event.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
|
||||
|
||||
role.attackEntity(event.getEntity(), event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAttack(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
FighterRole role = this.getRole(player);
|
||||
role.onInteract(event);
|
||||
}
|
||||
}
|
@ -11,8 +11,10 @@ import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
@ -31,7 +33,7 @@ public class FighterRole extends PlayerRole implements ManaAble {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
public void onStart() {
|
||||
this.setMana(0);
|
||||
this.player.setWalkSpeed(0.3f);
|
||||
this.powerfist = false;
|
||||
@ -39,8 +41,8 @@ public class FighterRole extends PlayerRole implements ManaAble {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end() {
|
||||
player.setExp(0.5f);
|
||||
public void onEnd() {
|
||||
player.setExp(0);
|
||||
this.player.setWalkSpeed(0.2f);
|
||||
}
|
||||
|
||||
@ -240,4 +242,20 @@ public class FighterRole extends PlayerRole implements ManaAble {
|
||||
}.runTaskTimer(plugin, 0, 1);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDamage(EntityDamageByEntityEvent event) {
|
||||
if (!(event.getDamager() instanceof Player)) return;
|
||||
Player player = (Player) event.getDamager();
|
||||
if (!this.matchesRole(player)) return;
|
||||
if (event.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
|
||||
|
||||
this.attackEntity(event.getEntity(), event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAttack(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
this.onInteract(event);
|
||||
}
|
||||
}
|
||||
|
@ -1,78 +0,0 @@
|
||||
package de.leafbla.meinkraft.roleplay.ninja;
|
||||
|
||||
import de.leafbla.meinkraft.Main;
|
||||
import de.leafbla.meinkraft.roleplay.Role;
|
||||
import de.leafbla.meinkraft.roleplay.RoleListener;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.*;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
|
||||
public class NinjaListener extends RoleListener<NinjaRole> {
|
||||
private Main plugin;
|
||||
|
||||
public NinjaListener(Main main) {
|
||||
super(Role.NINJA, main);
|
||||
this.plugin = main;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(PlayerMoveEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.onMove(event);
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.onInteract(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPoison(EntityDamageEvent event) {
|
||||
if (!(event.getEntity() instanceof Player)) return;
|
||||
Player player = (Player) event.getEntity();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
if (event.getCause() == EntityDamageEvent.DamageCause.POISON)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLand(ProjectileHitEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getShooter();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.projectileHit(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPoisonSoak(LingeringPotionSplashEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getShooter();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.lingeringPotionSplash(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onCloudApply(AreaEffectCloudApplyEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getSource();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.effectCloudApply(event);
|
||||
}
|
||||
}
|
@ -15,6 +15,7 @@ import org.bukkit.event.entity.LingeringPotionSplashEvent;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.ShapedRecipe;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@ -29,6 +30,7 @@ import org.bukkit.util.RayTraceResult;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.EventListener;
|
||||
import java.util.Objects;
|
||||
|
||||
public class NinjaRole extends PlayerRole {
|
||||
@ -43,10 +45,11 @@ public class NinjaRole extends PlayerRole {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
player.getInventory().addItem(Utils.namedItem(Material.STICK, "Blasrohr"));
|
||||
player.getInventory().addItem(Utils.namedItem(Material.SLIME_BALL, "Lingering Poison Potion"));
|
||||
player.getInventory().addItem(Utils.namedItem(Material.BONE, "Dash Attack"));
|
||||
public void onStart() {
|
||||
this.registerRightClickAction(Material.STICK, "Blasrohr", this::blasrohr);
|
||||
this.registerRightClickAction(Material.SLIME_BALL, "Lingering Poison Potion", this::poisonCloud);
|
||||
this.registerRightClickAction(Material.BONE, "Dash Attack", this::dash);
|
||||
|
||||
stealth = new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -69,23 +72,11 @@ public class NinjaRole extends PlayerRole {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end() {
|
||||
public void onEnd() {
|
||||
stealth.cancel();
|
||||
player.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
}
|
||||
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
ItemStack inHand = player.getInventory().getItemInMainHand();
|
||||
if (inHand.getType() == Material.STICK) {
|
||||
this.blasrohr();
|
||||
} else if (inHand.getType() == Material.SLIME_BALL) {
|
||||
this.poisonCloud();
|
||||
} else if (inHand.getType() == Material.BONE) {
|
||||
player.sendMessage("BONE");
|
||||
this.dash();
|
||||
}
|
||||
}
|
||||
|
||||
private void blasrohr() {
|
||||
Snowball ball = this.launchProjectile(Material.ARROW, (event, projectile, target, shooter) -> {
|
||||
@ -108,7 +99,7 @@ public class NinjaRole extends PlayerRole {
|
||||
thownPotion.setItem(lingeringPotion);
|
||||
}
|
||||
|
||||
public void onMove(PlayerMoveEvent event) {
|
||||
public void onMove2(PlayerMoveEvent event) {
|
||||
if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return; // not really moved, huh?
|
||||
this.lastMove = new Date();
|
||||
if (stealthed) {
|
||||
@ -122,7 +113,7 @@ public class NinjaRole extends PlayerRole {
|
||||
}
|
||||
}
|
||||
|
||||
final int DASHLENGTH = 7;
|
||||
final int DASHLENGTH = 20;
|
||||
|
||||
public void dash() {
|
||||
RayTraceResult blockTraceResult = player.getWorld().rayTraceBlocks(player.getEyeLocation(), player.getEyeLocation().getDirection(), DASHLENGTH);
|
||||
@ -172,18 +163,14 @@ public class NinjaRole extends PlayerRole {
|
||||
|
||||
public void effectCloudApply(AreaEffectCloudApplyEvent event) {
|
||||
event.setCancelled(true);
|
||||
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20, 0));
|
||||
//player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20, 0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onMove(PlayerMoveEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.onMove(event);
|
||||
this.onMove2(event);
|
||||
}
|
||||
|
||||
|
||||
@ -191,8 +178,6 @@ public class NinjaRole extends PlayerRole {
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.onInteract(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -200,7 +185,6 @@ public class NinjaRole extends PlayerRole {
|
||||
if (!(event.getEntity() instanceof Player)) return;
|
||||
Player player = (Player) event.getEntity();
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
if (event.getCause() == EntityDamageEvent.DamageCause.POISON)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
@ -211,26 +195,24 @@ public class NinjaRole extends PlayerRole {
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.projectileHit(event);
|
||||
this.projectileHit(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPoisonSoak(LingeringPotionSplashEvent event) {
|
||||
public void onPoisonLaydown(LingeringPotionSplashEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getShooter();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.lingeringPotionSplash(event);
|
||||
this.lingeringPotionSplash(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onCloudApply(AreaEffectCloudApplyEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getSource();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
NinjaRole role = this.getRole(player);
|
||||
role.effectCloudApply(event);
|
||||
this.effectCloudApply(event);
|
||||
}
|
||||
}
|
||||
|
@ -1,128 +0,0 @@
|
||||
package de.leafbla.meinkraft.roleplay.wizard;
|
||||
|
||||
import de.leafbla.meinkraft.Main;
|
||||
import de.leafbla.meinkraft.roleplay.Role;
|
||||
import de.leafbla.meinkraft.roleplay.RoleListener;
|
||||
import de.leafbla.meinkraft.roleplay.fighter.FighterRole;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.Particle;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Snowball;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.ShapedRecipe;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.spigotmc.event.entity.EntityDismountEvent;
|
||||
|
||||
public class WizardListener extends RoleListener<WizardRole> {
|
||||
|
||||
public WizardListener(Main main) {
|
||||
super(Role.WIZARD, main);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onHold(PlayerItemHeldEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
WizardRole role = this.getRole(player);
|
||||
role.onItemHeld(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAttack(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (!this.matchesRole(player)) return;
|
||||
WizardRole role = this.getRole(player);
|
||||
role.onInteract(event);
|
||||
}
|
||||
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (event.getAction().name().contains("RIGHT")) {
|
||||
ItemStack knife = event.getPlayer().getInventory().getItemInMainHand();
|
||||
if (knife.getType() == Material.IRON_INGOT) {
|
||||
ItemStack oneknife = knife.clone();
|
||||
oneknife.setAmount(1);
|
||||
Snowball ball = player.launchProjectile(Snowball.class);
|
||||
ball.setVelocity(ball.getVelocity().multiply(1.2));
|
||||
ball.setBounce(false);
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
int amt = knife.getAmount();
|
||||
knife.setAmount(amt - 1);
|
||||
player.setItemInHand(knife);
|
||||
} else if (knife.getType() == Material.STICK) {
|
||||
ItemStack oneknife = new ItemStack(Material.FEATHER, 1);
|
||||
Snowball ball = player.launchProjectile(Snowball.class);
|
||||
ball.setVelocity(ball.getVelocity().multiply(3));
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
int amt = knife.getAmount();
|
||||
flying = true;
|
||||
new BukkitRunnable() {
|
||||
int i = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (flying)
|
||||
ball.getWorld().spawnParticle(Particle.FLAME, ball.getLocation(), 0);
|
||||
else
|
||||
this.cancel();
|
||||
}
|
||||
}.runTaskTimerAsynchronously(this.plugin, 0, 1);
|
||||
//knife.setAmount(amt - 1);
|
||||
//player.setItemInHand(knife);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean flying = false;
|
||||
|
||||
@EventHandler
|
||||
public void onLand(ProjectileHitEvent event) {
|
||||
ProjectileSource shooter = event.getEntity().getShooter();
|
||||
if (!(shooter instanceof Player)) return;
|
||||
Player player = (Player) shooter;
|
||||
if (!this.matchesRole(player)) return;
|
||||
WizardRole role = this.getRole(player);
|
||||
role.projectileHit(event);
|
||||
//if (event.getEntity() instanceof Snowball) {
|
||||
// Snowball ball = (Snowball) event.getEntity();
|
||||
// ItemStack item =
|
||||
// CraftItemStack.asBukkitCopy(
|
||||
// ((CraftSnowball) ball).getHandle().getItem()
|
||||
// );
|
||||
// if (item.getType() == Material.IRON_INGOT) {
|
||||
// if (event.getHitEntity() == null)
|
||||
// event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), item);
|
||||
// else {
|
||||
// if (event.getHitEntity() instanceof LivingEntity)
|
||||
// ((LivingEntity) event.getHitEntity()).damage(8);
|
||||
// }
|
||||
// } else if (item.getType() == Material.FEATHER) {
|
||||
// flying = false;
|
||||
// if (event.getHitEntity() != null) {
|
||||
// if (event.getHitEntity() instanceof LivingEntity) {
|
||||
// LivingEntity len = ((LivingEntity) event.getHitEntity());
|
||||
// Bukkit.broadcastMessage(String.format("hit %s", len.getName()));
|
||||
// len.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 5 * 20, 0, true, true));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
@ -8,21 +8,26 @@ import de.leafbla.meinkraft.roleplay.Utils;
|
||||
import de.leafbla.meinkraft.util.Pair;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Particle;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Projectile;
|
||||
import org.bukkit.entity.Snowball;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class WizardRole extends PlayerRole implements ManaAble {
|
||||
public class WizardRole extends PlayerRole implements ManaAble, EventListener {
|
||||
|
||||
BukkitRunnable refillMana;
|
||||
Set<Player> transmorphedPlayers = new HashSet<>();
|
||||
@ -51,9 +56,10 @@ public class WizardRole extends PlayerRole implements ManaAble {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
public void onStart() {
|
||||
for (WizardSpell wizardSpell : WizardSpell.values())
|
||||
this.registerRightClickAction(wizardSpell.getIcon(), wizardSpell.displayName(), () -> wizardSpell.cast(this));
|
||||
|
||||
setupInventory();
|
||||
this.currentSpell = WizardSpell.values()[0];
|
||||
this.mana = 33;
|
||||
refillMana = new BukkitRunnable() {
|
||||
@ -76,7 +82,7 @@ public class WizardRole extends PlayerRole implements ManaAble {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end() {
|
||||
public void onEnd() {
|
||||
refillMana.cancel();
|
||||
}
|
||||
|
||||
@ -85,55 +91,48 @@ public class WizardRole extends PlayerRole implements ManaAble {
|
||||
return Role.WIZARD;
|
||||
}
|
||||
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
||||
if (itemStack.getType() != Material.STICK) return;
|
||||
if (!itemStack.hasItemMeta()) return;
|
||||
if (!event.getAction().name().startsWith("RIGHT")) return;
|
||||
if (event.getHand() == EquipmentSlot.OFF_HAND) return;
|
||||
this.castSpell();
|
||||
}
|
||||
|
||||
private void castSpell() {
|
||||
this.currentSpell.cast(this);
|
||||
}
|
||||
|
||||
public void onItemHeld(PlayerItemHeldEvent event) {
|
||||
int newslot = event.getNewSlot();
|
||||
if (newslot == 0) return; // self caused or irrelevant
|
||||
callSpellSlot(newslot - 1);
|
||||
event.setCancelled(true);
|
||||
player.getInventory().setHeldItemSlot(0);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
public void onInteractOldTestStuffs(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (event.getAction().name().contains("RIGHT")) {
|
||||
ItemStack knife = event.getPlayer().getInventory().getItemInMainHand();
|
||||
if (knife.getType() == Material.IRON_INGOT) {
|
||||
ItemStack oneknife = knife.clone();
|
||||
oneknife.setAmount(1);
|
||||
Snowball ball = player.launchProjectile(Snowball.class);
|
||||
ball.setVelocity(ball.getVelocity().multiply(1.2));
|
||||
ball.setBounce(false);
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
private void callSpellSlot(int newslot) {
|
||||
if (newslot >= WizardSpell.values().length) return;
|
||||
this.currentSpell = WizardSpell.values()[newslot];
|
||||
ItemMeta itemMeta = player.getInventory().getItemInMainHand().getItemMeta();
|
||||
itemMeta.setDisplayName(this.currentSpell.displayName());
|
||||
player.getInventory().getItemInMainHand().setItemMeta(itemMeta);
|
||||
player.sendMessage(String.format("§eEquipped Spell §6%s§e.", this.currentSpell.displayName()));
|
||||
}
|
||||
int amt = knife.getAmount();
|
||||
knife.setAmount(amt - 1);
|
||||
player.setItemInHand(knife);
|
||||
} else if (knife.getType() == Material.STICK) {
|
||||
ItemStack oneknife = new ItemStack(Material.FEATHER, 1);
|
||||
Snowball ball = player.launchProjectile(Snowball.class);
|
||||
ball.setVelocity(ball.getVelocity().multiply(3));
|
||||
((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife));
|
||||
|
||||
/**
|
||||
* Called when a projectile hits something that originates from the player
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
public void projectileHit(ProjectileHitEvent event) {
|
||||
assert Objects.equals(event.getEntity().getShooter(), player);
|
||||
Projectile projectile = event.getEntity();
|
||||
if (this.projectiles.containsKey(projectile.getEntityId())) {
|
||||
ProjectileBlockHit projectileBlockHit = this.projectiles.get(projectile.getEntityId()).getRight();
|
||||
ProjectileEntityHit projectileEntityHit = this.projectiles.get(projectile.getEntityId()).getLeft();
|
||||
if (event.getHitEntity() != null) {
|
||||
projectileEntityHit.onHit(event, projectile, event.getHitEntity(), player);
|
||||
} else if (event.getHitBlock() != null) {
|
||||
Entity hitEntity = event.getHitEntity();
|
||||
projectileBlockHit.onHit(event, projectile, event.getHitBlock(), event.getHitBlockFace(), player);
|
||||
int amt = knife.getAmount();
|
||||
flying = true;
|
||||
new BukkitRunnable() {
|
||||
int i = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (flying)
|
||||
ball.getWorld().spawnParticle(Particle.FLAME, ball.getLocation(), 0);
|
||||
else
|
||||
this.cancel();
|
||||
}
|
||||
}.runTaskTimerAsynchronously(this.plugin, 0, 1);
|
||||
//knife.setAmount(amt - 1);
|
||||
//player.setItemInHand(knife);
|
||||
}
|
||||
this.projectiles.remove(projectile.getEntityId());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean flying = false;
|
||||
|
||||
}
|
||||
|
@ -33,8 +33,6 @@ enum WizardSpell {
|
||||
});
|
||||
}
|
||||
},
|
||||
SPELL2("Fireball", Material.FIRE_CHARGE, 0),
|
||||
SPELL3("Something Something", Material.CLAY, 0),
|
||||
TRANSMORPH("Transmorgify", Material.FEATHER, 30) {
|
||||
@Override
|
||||
public void _cast(WizardRole wizardRole) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
package de.leafbla.meinkraft.util;
|
||||
|
||||
public class Pair<L, R> {
|
||||
private L l;
|
||||
private R r;
|
||||
private final L l;
|
||||
private final R r;
|
||||
|
||||
public Pair(L l, R r) {
|
||||
this.l = l;
|
||||
@ -16,4 +16,16 @@ public class Pair<L, R> {
|
||||
public L getLeft() {
|
||||
return this.l;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return l.hashCode() * r.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof Pair)) return false;
|
||||
Pair other = (Pair) o;
|
||||
return this.l.equals(other.l) && this.r.equals(other.r);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user