mirror of https://github.com/Ste3et/furniture.git
323 lines
10 KiB
Java
323 lines
10 KiB
Java
package de.Ste3et_C0st.Furniture.Objects.garden;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
import org.bukkit.Bukkit;
|
|
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.banner.Pattern;
|
|
import org.bukkit.block.banner.PatternType;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.inventory.ItemStack;
|
|
import org.bukkit.inventory.meta.BannerMeta;
|
|
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 sunshade extends Furniture implements Listener{
|
|
List<Material> matList = Arrays.asList(
|
|
Material.SPRUCE_FENCE,
|
|
Material.BIRCH_FENCE,
|
|
Material.JUNGLE_FENCE,
|
|
Material.DARK_OAK_FENCE,
|
|
Material.ACACIA_FENCE,
|
|
Material.COBBLE_WALL,
|
|
Material.NETHER_FENCE);
|
|
Material m;
|
|
Integer timer;
|
|
Block block;
|
|
|
|
public sunshade(ObjectID id){
|
|
super(id);
|
|
if(isFinish()){
|
|
setblock();
|
|
Bukkit.getPluginManager().registerEvents(this, main.getInstance());
|
|
return;
|
|
}
|
|
setblock();
|
|
spawn(id.getStartLocation());
|
|
}
|
|
|
|
private void setblock(){
|
|
Location loc = getLocation().clone();
|
|
loc.add(0, 2, 0);
|
|
block = loc.getBlock();
|
|
block.setType(Material.BARRIER);
|
|
getObjID().addBlock(Arrays.asList(block));
|
|
}
|
|
|
|
public void spawn(Location location){
|
|
Location center = getLutil().getCenter(location).clone();
|
|
List<fArmorStand> asList = new ArrayList<fArmorStand>();
|
|
center.add(0, -1.1, 0);
|
|
|
|
for(int i = 0; i<=2;i++){
|
|
Location loc = getLutil().getRelativ(center.clone(), getBlockFace(), .47, .38).add(0, .88*i, 0);
|
|
fArmorStand packet = getManager().createArmorStand(getObjID(), loc);
|
|
packet.getInventory().setItemInMainHand(new ItemStack(Material.STICK));
|
|
packet.setPose(new EulerAngle(1.39, 0, 0), BodyPart.RIGHT_ARM);
|
|
asList.add(packet);
|
|
}
|
|
|
|
center.add(0, 1.758, 0);
|
|
fArmorStand aspacket = getManager().createArmorStand(getObjID(), center);
|
|
aspacket.getInventory().setHelmet(new ItemStack(Material.CARPET));
|
|
aspacket.setName("#TOP#");
|
|
asList.add(aspacket);
|
|
|
|
Location loc = center.clone();
|
|
loc.add(0, 0.3, 0);
|
|
ItemStack is = new ItemStack(Material.BANNER);
|
|
BannerMeta banner = (BannerMeta) is.getItemMeta();
|
|
banner.setBaseColor(DyeColor.LIME);
|
|
banner.addPattern(new Pattern(DyeColor.YELLOW, PatternType.TRIANGLE_BOTTOM));
|
|
banner.addPattern(new Pattern(DyeColor.WHITE, PatternType.TRIANGLE_BOTTOM));
|
|
is.setItemMeta(banner);
|
|
|
|
for(int i = 0; i<=17; i++){
|
|
loc.setYaw(i*21);
|
|
fArmorStand packet = getManager().createArmorStand(getObjID(), loc.clone());
|
|
packet.getInventory().setHelmet(is);
|
|
packet.setPose(new EulerAngle(-3.054, 0, 0), BodyPart.HEAD);
|
|
packet.setName("#ELEMENT#" + i);
|
|
asList.add(packet);
|
|
}
|
|
|
|
for(fArmorStand packet : asList){
|
|
packet.setInvisible(true);
|
|
packet.setBasePlate(false);
|
|
}
|
|
send();
|
|
Bukkit.getPluginManager().registerEvents(this, getPlugin());
|
|
}
|
|
|
|
@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;}
|
|
if(!e.canBuild()){return;}
|
|
Player p = e.getPlayer();
|
|
ItemStack is = p.getInventory().getItemInMainHand();
|
|
if(!getLib().canBuild(e.getPlayer(), getObjID(), EventType.INTERACT)){return;}
|
|
if(is.getType().equals(Material.BANNER)){
|
|
if(isRunning()){return;}
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getInventory().getHelmet()!=null&&packet.getInventory().getHelmet().getType().equals(Material.BANNER)){
|
|
packet.getInventory().setHelmet(is);
|
|
}else if(packet.getInventory().getHelmet()!=null&&packet.getInventory().getHelmet().getType().equals(Material.CARPET)){
|
|
ItemStack item = new ItemStack(Material.CARPET);
|
|
item.setDurability(getLutil().getFromDey((short) is.getDurability()));
|
|
packet.getInventory().setHelmet(item);
|
|
}
|
|
}
|
|
removeItem(p);
|
|
update();
|
|
}else{
|
|
if(isRunning()){return;}
|
|
if(!isOpen()){
|
|
open();
|
|
}else{
|
|
close();
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean isRunning(){
|
|
if(timer!=null)return true;
|
|
return false;
|
|
}
|
|
|
|
@EventHandler
|
|
public void onBlockBreak(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;}
|
|
stopTimer();
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getName().equalsIgnoreCase("#ITEM#")){
|
|
if(packet.getInventory().getItemInMainHand()!=null&&!packet.getInventory().getItemInMainHand().getType().equals(Material.AIR)){
|
|
ItemStack is = packet.getInventory().getItemInMainHand();
|
|
getWorld().dropItem(getLocation(), is);
|
|
}
|
|
}
|
|
}
|
|
getObjID().remove(e.getPlayer());
|
|
delete();
|
|
}
|
|
|
|
@EventHandler
|
|
public void onBlockBreak(FurnitureBlockClickEvent 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;}
|
|
Player p = e.getPlayer();
|
|
ItemStack is = p.getInventory().getItemInMainHand();
|
|
if(is.getType().equals(Material.BANNER)){
|
|
if(isRunning()){return;}
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getInventory().getHelmet()!=null&&packet.getInventory().getHelmet().getType().equals(Material.BANNER)){
|
|
packet.getInventory().setHelmet(is);
|
|
}else if(packet.getInventory().getHelmet()!=null&&packet.getInventory().getHelmet().getType().equals(Material.CARPET)){
|
|
ItemStack item = new ItemStack(Material.CARPET);
|
|
item.setDurability(getLutil().getFromDey((short) is.getDurability()));
|
|
packet.getInventory().setHelmet(item);
|
|
}
|
|
}
|
|
removeItem(p);
|
|
update();
|
|
}else{
|
|
if(isRunning()){return;}
|
|
if(!isOpen()){
|
|
open();
|
|
}else{
|
|
close();
|
|
}
|
|
}
|
|
}
|
|
|
|
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 onFurnitureBreak(FurnitureBreakEvent 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;}
|
|
stopTimer();
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getName().equalsIgnoreCase("#ITEM#")){
|
|
if(packet.getInventory().getItemInMainHand()!=null&&!packet.getInventory().getItemInMainHand().getType().equals(Material.AIR)){
|
|
ItemStack is = packet.getInventory().getItemInMainHand();
|
|
getWorld().dropItem(getLocation(), is);
|
|
}
|
|
}
|
|
}
|
|
e.remove();
|
|
this.block.setType(Material.AIR);
|
|
this.block = null;
|
|
getManager().remove(getObjID());
|
|
delete();
|
|
}
|
|
|
|
private void close(){
|
|
timer = Bukkit.getScheduler().scheduleSyncRepeatingTask(getPlugin(), new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
try{
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getName().startsWith("#ELEMENT#")){
|
|
if(!isClose((fArmorStand) packet)){
|
|
Double x = ((fArmorStand) packet).getPose(BodyPart.HEAD).getX();
|
|
((fArmorStand) packet).setPose(new EulerAngle(x-.32, 0, 0), BodyPart.HEAD);
|
|
}else{
|
|
stopTimer();
|
|
return;
|
|
}
|
|
getManager().updateFurniture(getObjID());
|
|
}
|
|
}
|
|
}catch(Exception e){
|
|
stopTimer();reset();
|
|
}
|
|
|
|
|
|
}
|
|
}, 0, 10);
|
|
}
|
|
|
|
private void open(){
|
|
timer = Bukkit.getScheduler().scheduleSyncRepeatingTask(getPlugin(), new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
try{
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getName().startsWith("#ELEMENT#")){
|
|
if(!isOpen((fArmorStand) packet)){
|
|
Double x = ((fArmorStand) packet).getPose(BodyPart.HEAD).getX();
|
|
((fArmorStand) packet).setPose(new EulerAngle(x+.32, 0, 0), BodyPart.HEAD);
|
|
}else{
|
|
stopTimer();
|
|
return;
|
|
}
|
|
getManager().updateFurniture(getObjID());
|
|
}
|
|
}
|
|
}catch(Exception e){
|
|
stopTimer();reset();
|
|
}
|
|
|
|
|
|
}
|
|
}, 0, 10);
|
|
}
|
|
|
|
private void reset(){
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(!isOpen((fArmorStand) packet)){
|
|
((fArmorStand) packet).setPose(new EulerAngle(-3.054, 0, 0), BodyPart.HEAD);
|
|
}
|
|
}
|
|
update();
|
|
}
|
|
|
|
private boolean isClose(fArmorStand packet){
|
|
if(packet.getPose(BodyPart.HEAD).getX()> -3.054){
|
|
return false;
|
|
}return true;
|
|
}
|
|
|
|
private boolean isOpen(fArmorStand packet){
|
|
if(packet.getPose(BodyPart.HEAD).getX()< -1.85){
|
|
return false;
|
|
}return true;
|
|
}
|
|
|
|
private boolean isOpen(){
|
|
for(fEntity packet : getManager().getfArmorStandByObjectID(getObjID())){
|
|
if(packet.getName().startsWith("#ELEMENT#")){
|
|
if(((fArmorStand) packet).getPose(BodyPart.HEAD).getX()< -1.85){
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void stopTimer(){
|
|
if(timer!=null){
|
|
Bukkit.getScheduler().cancelTask(timer);
|
|
timer=null;
|
|
}
|
|
}
|
|
}
|