mirror of https://github.com/Ste3et/furniture.git
304 lines
11 KiB
Java
304 lines
11 KiB
Java
package de.Ste3et_C0st.Furniture.Objects.outdoor;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
import org.bukkit.Bukkit;
|
|
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.Listener;
|
|
import org.bukkit.inventory.ItemStack;
|
|
import org.bukkit.util.EulerAngle;
|
|
|
|
import de.Ste3et_C0st.Furniture.Main.main;
|
|
import de.Ste3et_C0st.FurnitureLib.Events.FurnitureBlockBreakEvent;
|
|
import de.Ste3et_C0st.FurnitureLib.Events.FurnitureBlockClickEvent;
|
|
import de.Ste3et_C0st.FurnitureLib.Events.FurnitureBreakEvent;
|
|
import de.Ste3et_C0st.FurnitureLib.Events.FurnitureClickEvent;
|
|
import de.Ste3et_C0st.FurnitureLib.main.Furniture;
|
|
import de.Ste3et_C0st.FurnitureLib.main.FurnitureLib;
|
|
import de.Ste3et_C0st.FurnitureLib.main.ObjectID;
|
|
import de.Ste3et_C0st.FurnitureLib.main.Type.BodyPart;
|
|
import de.Ste3et_C0st.FurnitureLib.main.Type.EventType;
|
|
import de.Ste3et_C0st.FurnitureLib.main.Type.SQLAction;
|
|
import de.Ste3et_C0st.FurnitureLib.main.entity.fArmorStand;
|
|
import de.Ste3et_C0st.FurnitureLib.main.entity.fEntity;
|
|
|
|
public class hammock extends Furniture implements Listener{
|
|
|
|
public hammock(ObjectID id) {
|
|
super(id);
|
|
setBlock();
|
|
if(isFinish()){
|
|
Bukkit.getPluginManager().registerEvents(this, main.getInstance());
|
|
return;
|
|
}
|
|
spawn(id.getStartLocation());
|
|
}
|
|
|
|
private void setBlock(){
|
|
BlockFace Right = getLutil().yawToFace(getLutil().FaceToYaw(getBlockFace())+90);
|
|
Location center2 = getLutil().getRelativ(getLocation(), Right, 6D, 0D);
|
|
Block b1 = getLocation().getBlock();
|
|
Block b2 = getLocation().getBlock().getRelative(BlockFace.UP);
|
|
Block b3 = center2.getBlock();
|
|
Block b4 = center2.getBlock().getRelative(BlockFace.UP);
|
|
|
|
if(!isFence(b1.getType())) b1.setType(Material.FENCE);
|
|
if(!isFence(b2.getType())) b2.setType(Material.FENCE);
|
|
if(!isFence(b3.getType())) b3.setType(Material.FENCE);
|
|
if(!isFence(b4.getType())) b4.setType(Material.FENCE);
|
|
|
|
getObjID().addBlock(Arrays.asList(b1,b2,b3,b4));
|
|
}
|
|
|
|
private boolean isFence(Material m){
|
|
if(m==null){return false;}
|
|
return m.toString().toLowerCase().endsWith("fence");
|
|
}
|
|
|
|
private boolean isMaterial(Material m){
|
|
if(m==null){return false;}
|
|
boolean b = false;
|
|
if(m.toString().toLowerCase().startsWith("log")){
|
|
b=true;
|
|
}else if(m.toString().toLowerCase().equalsIgnoreCase("banner")){
|
|
b=true;
|
|
}
|
|
|
|
return b;
|
|
}
|
|
|
|
@EventHandler
|
|
public void onFurnitureBreak(FurnitureBreakEvent e) {
|
|
if(e.getID() == null || getObjID() == null) return;
|
|
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
|
|
if(e.getID() == null || getObjID() == null) return;
|
|
if(!e.getID().equals(getObjID())){return;}
|
|
if(!e.canBuild()){return;}
|
|
e.remove();
|
|
delete();
|
|
}
|
|
|
|
@EventHandler
|
|
public void onFurnitureBreak(FurnitureBlockBreakEvent e) {
|
|
if(e.getID() == null || getObjID() == null) return;
|
|
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
|
|
if(!e.getID().equals(getObjID())){return;}
|
|
if(!e.canBuild()){return;}
|
|
e.remove();
|
|
delete();
|
|
}
|
|
|
|
@EventHandler
|
|
public void onFurnitureClick(FurnitureClickEvent e) {
|
|
if(e.getID() == null || getObjID() == null) return;
|
|
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
|
|
if(!e.getID().equals(getObjID())){return;}
|
|
List<fEntity> aspList = getManager().getfArmorStandByObjectID(getObjID());
|
|
Player p = e.getPlayer();
|
|
ItemStack stack = p.getInventory().getItemInMainHand();
|
|
|
|
if(stack!=null){
|
|
if(isMaterial(stack.getType())){
|
|
if(setColor(p,stack, getLib().canBuild(e.getPlayer(), getObjID(), EventType.INTERACT), aspList)){return;}
|
|
}
|
|
}
|
|
|
|
for(fEntity packet : aspList){
|
|
if(packet.getName().equalsIgnoreCase("#SITZ#")){
|
|
if(packet.getPassanger()==null){
|
|
packet.setPassanger(e.getPlayer());
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void removeItem(Player p){
|
|
Boolean useGameMode = FurnitureLib.getInstance().useGamemode();
|
|
if(useGameMode&&p.getGameMode().equals(GameMode.CREATIVE)){return;}
|
|
Integer slot = p.getInventory().getHeldItemSlot();
|
|
ItemStack itemStack = p.getInventory().getItemInMainHand().clone();
|
|
itemStack.setAmount(itemStack.getAmount()-1);
|
|
p.getInventory().setItem(slot, itemStack);
|
|
p.updateInventory();
|
|
}
|
|
|
|
@EventHandler
|
|
public void onFurnitureClick(FurnitureBlockClickEvent e) {
|
|
if(e.getID() == null || getObjID() == null) return;
|
|
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
|
|
if(!e.getID().equals(getObjID())){return;}
|
|
List<fEntity> aspList = getManager().getfArmorStandByObjectID(getObjID());
|
|
Player p = e.getPlayer();
|
|
ItemStack stack = p.getInventory().getItemInMainHand();
|
|
if(stack!=null){
|
|
if(isMaterial(stack.getType())){
|
|
if(setColor(p,stack, e.canBuild(), aspList)){return;}
|
|
}
|
|
}
|
|
|
|
for(fEntity packet : aspList){
|
|
if(packet.getName().equalsIgnoreCase("#SITZ#")){
|
|
if(packet.getPassanger()==null){
|
|
packet.setPassanger(e.getPlayer());
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean setColor(Player p,ItemStack stack, Boolean canbuild, List<fEntity> aspList){
|
|
if(!canbuild){return true;}
|
|
if(stack!=null){
|
|
switch (stack.getType()) {
|
|
case BANNER:
|
|
for(fEntity packet : aspList){
|
|
if(packet.getInventory().getHelmet()!=null&&packet.getInventory().getHelmet().getType().equals(Material.BANNER)){
|
|
packet.getInventory().setHelmet(stack);
|
|
}
|
|
}
|
|
removeItem(p);
|
|
getManager().updateFurniture(getObjID());
|
|
return true;
|
|
case LOG:
|
|
for(fEntity packet : aspList){
|
|
if(packet.getName().equalsIgnoreCase("#PILLAR#")){
|
|
packet.getInventory().setHelmet(stack);
|
|
}
|
|
}
|
|
setPillar(stack.getDurability());
|
|
removeItem(p);
|
|
getManager().updateFurniture(getObjID());
|
|
return true;
|
|
case LOG_2:
|
|
for(fEntity packet : aspList){
|
|
if(packet.getName().equalsIgnoreCase("#PILLAR#")){
|
|
packet.getInventory().setHelmet(stack);
|
|
}
|
|
}
|
|
setPillar(4 + stack.getDurability());
|
|
removeItem(p);
|
|
getManager().updateFurniture(getObjID());
|
|
return true;
|
|
default: break;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void setPillar(int i){
|
|
Material m = null;
|
|
switch (i) {
|
|
case 0: m = Material.FENCE;break;
|
|
case 1: m = Material.SPRUCE_FENCE;break;
|
|
case 2: m = Material.BIRCH_FENCE;break;
|
|
case 3: m = Material.JUNGLE_FENCE;break;
|
|
case 4: m = Material.ACACIA_FENCE;break;
|
|
case 5: m = Material.DARK_OAK_FENCE;break;
|
|
}
|
|
if(m!=null){
|
|
for(Location b : getObjID().getBlockList()){
|
|
getWorld().getBlockAt(b).setType(m);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public void spawn(Location location) {
|
|
Location center1 = getLutil().getCenter(location);
|
|
center1 = center1.add(0, -1.9, 0);
|
|
|
|
BlockFace Right = getLutil().yawToFace(getLutil().FaceToYaw(getBlockFace())+90);
|
|
Location center2 = getLutil().getRelativ(center1, Right, 6D, 0D);
|
|
List<fArmorStand> aspList = new ArrayList<fArmorStand>();
|
|
|
|
fArmorStand packet = getManager().createArmorStand(getObjID(), center1);
|
|
packet.getInventory().setHelmet(new ItemStack(Material.LOG));
|
|
packet.setName("#PILLAR#");
|
|
aspList.add(packet);
|
|
|
|
packet = getManager().createArmorStand(getObjID(), center2);
|
|
packet.getInventory().setHelmet(new ItemStack(Material.LOG));
|
|
packet.setName("#PILLAR#");
|
|
aspList.add(packet);
|
|
|
|
Location middle = getLutil().getRelativ(center1, Right, 2.85D, 0D);
|
|
middle = middle.add(0, .75, 0);
|
|
packet = getManager().createArmorStand(getObjID(), middle);
|
|
packet.getInventory().setHelmet(new ItemStack(Material.BANNER, 1, (short) 0));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-69f,0f,0f)), BodyPart.HEAD);
|
|
aspList.add(packet);
|
|
|
|
Location middle2 = getLutil().getRelativ(middle, Right, 1.5D, 0D);
|
|
middle2 = middle2.add(0, .23, 0);
|
|
packet = getManager().createArmorStand(getObjID(), middle2);
|
|
packet.getInventory().setHelmet(new ItemStack(Material.BANNER, 1, (short) 0));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-90f,0f,0f)), BodyPart.HEAD);
|
|
aspList.add(packet);
|
|
|
|
Location sitz = getLutil().getRelativ(center1, Right, 3D, 0D).add(0, .6, 0);
|
|
sitz.setYaw(getLutil().FaceToYaw(getBlockFace().getOppositeFace()));
|
|
packet = getManager().createArmorStand(getObjID(), sitz);
|
|
packet.setName("#SITZ#");
|
|
aspList.add(packet);
|
|
|
|
middle = getLutil().getRelativ(middle, Right, .3D, 0D);
|
|
middle.setYaw(middle.getYaw()+180);
|
|
packet = getManager().createArmorStand(getObjID(), middle);
|
|
packet.getInventory().setHelmet(new ItemStack(Material.BANNER, 1, (short) 0));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-69f,0f,0f)), BodyPart.HEAD);
|
|
aspList.add(packet);
|
|
|
|
Location stick = getLutil().getRelativ(center1, Right, 4.6d, .5d);
|
|
stick = stick.add(0, 1.7, 0);
|
|
stick.setYaw(getLutil().FaceToYaw(getBlockFace()));
|
|
packet = getManager().createArmorStand(getObjID(), stick);
|
|
packet.getInventory().setItemInMainHand(new ItemStack(Material.STICK));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-40f,110f,0f)), BodyPart.RIGHT_ARM);
|
|
aspList.add(packet);
|
|
|
|
stick = getLutil().getRelativ(center1, Right, 4.6d, -.335d);
|
|
stick = stick.add(0, 1.7, 0);
|
|
stick.setYaw(getLutil().FaceToYaw(getBlockFace()));
|
|
packet = getManager().createArmorStand(getObjID(), stick);
|
|
packet.getInventory().setItemInMainHand(new ItemStack(Material.STICK));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-40f,73f,0f)), BodyPart.RIGHT_ARM);
|
|
packet.setArms(true);
|
|
aspList.add(packet);
|
|
|
|
stick = getLutil().getRelativ(center1, Right.getOppositeFace(), -1.37d, -.335d);
|
|
stick = stick.add(0, 1.7, 0);
|
|
stick.setYaw(getLutil().FaceToYaw(getBlockFace().getOppositeFace()));
|
|
packet = getManager().createArmorStand(getObjID(), stick);
|
|
packet.getInventory().setItemInMainHand(new ItemStack(Material.STICK));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-40f,73f,0f)), BodyPart.RIGHT_ARM);
|
|
packet.setArms(true);
|
|
aspList.add(packet);
|
|
|
|
stick = getLutil().getRelativ(center1, Right.getOppositeFace(), -1.37d, .5d);
|
|
stick = stick.add(0, 1.7, 0);
|
|
stick.setYaw(getLutil().FaceToYaw(getBlockFace().getOppositeFace()));
|
|
packet = getManager().createArmorStand(getObjID(), stick);
|
|
packet.getInventory().setItemInMainHand(new ItemStack(Material.STICK));
|
|
packet.setPose(getLutil().degresstoRad(new EulerAngle(-40f,110f,0f)), BodyPart.RIGHT_ARM);
|
|
packet.setArms(true);
|
|
aspList.add(packet);
|
|
|
|
for(fArmorStand pack : aspList){
|
|
pack.setInvisible(true);
|
|
pack.setBasePlate(false);
|
|
}
|
|
|
|
send();
|
|
Bukkit.getPluginManager().registerEvents(this, getPlugin());
|
|
}
|
|
}
|