furniture/src/de/Ste3et_C0st/Furniture/Objects/outdoor/campfire_2.java

289 lines
9.1 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.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.EulerAngle;
import de.Ste3et_C0st.Furniture.Main.main;
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.ObjectID;
import de.Ste3et_C0st.FurnitureLib.main.Type.BodyPart;
import de.Ste3et_C0st.FurnitureLib.main.Type.SQLAction;
import de.Ste3et_C0st.FurnitureLib.main.entity.fArmorStand;
public class campfire_2 extends Furniture implements Listener{
List<Material> items = new ArrayList<Material>(
Arrays.asList(
Material.RAW_BEEF,
Material.RAW_CHICKEN,
Material.RAW_FISH,
Material.POTATO_ITEM,
Material.PORK,
Material.RABBIT,
Material.MUTTON
)
);
List<Material> items2 = new ArrayList<Material>(
Arrays.asList(
Material.COOKED_BEEF,
Material.COOKED_CHICKEN,
Material.COOKED_FISH,
Material.BAKED_POTATO,
Material.GRILLED_PORK,
Material.COOKED_RABBIT,
Material.COOKED_MUTTON
)
);
EulerAngle[] angle = {
new EulerAngle(-1.5, -.5, 0),
new EulerAngle(-1.9, -.3, .7),
new EulerAngle(-1.5, .3, 1.9),
new EulerAngle(-0.7, -.5, -1.2)
};
Location middle;
Location grill;
Integer timer;
fArmorStand armorS;
ItemStack is;
public campfire_2(Plugin plugin, ObjectID id){
super(plugin, id);
middle = getLutil().getCenter(getLocation());
middle = getLutil().getRelativ(middle, getBlockFace(), .5D, -.5D);
middle.add(0,-1.2,0);
grill = getLutil().getRelativ(middle,getBlockFace(), .0D, .5D);
grill.setYaw(getLutil().FaceToYaw(getBlockFace())+90);
if(id.isFinish()){
Bukkit.getPluginManager().registerEvents(this, plugin);
return;
}
spawn(id.getStartLocation());
}
public void spawn(Location loc){
List<fArmorStand> packetList = new ArrayList<fArmorStand>();
Location stick1 = getLutil().getRelativ(middle, getBlockFace(), .47D, -.05D);
Location stick2 = getLutil().getRelativ(middle, getBlockFace(), .47D, .85D);
Location bone = getLutil().getRelativ(middle, getBlockFace(), .5D, .82D);
stick2.setYaw(getLutil().FaceToYaw(getBlockFace()));
stick1.setYaw(getLutil().FaceToYaw(getBlockFace()));
bone.setYaw(getLutil().FaceToYaw(getBlockFace()));
stick1.add(0,.3,0);
stick2.add(0,.3,0);
bone.add(0,.17,0);
Integer yaw = 90;
for(int i = 0; i<=7;i++){
Location location = null;
if(getLutil().axisList.contains(getLutil().yawToFaceRadial(yaw))){
location = getLutil().getRelativ(middle, getLutil().yawToFaceRadial(yaw), 0D, .5D);
}else{
location = getLutil().getRelativ(middle, getLutil().yawToFaceRadial(yaw), 0D, .35D);
}
location.setYaw(90+yaw);
fArmorStand asp = getManager().createArmorStand(getObjID(), location);
asp.setPose(new EulerAngle(1.568, 0, 0), BodyPart.HEAD);
asp.setSmall(true);
asp.getInventory().setHelmet(new ItemStack(Material.STEP,1,(short)3));
packetList.add(asp);
yaw+=45;
}
yaw = 90;
for(int i = 0; i<=3;i++){
Location location = getLutil().getRelativ(middle, getLutil().yawToFace(yaw), .4, -.5D);
location.add(0,-.5,0);
location.setYaw(90+yaw);
fArmorStand asp = getManager().createArmorStand(getObjID(), location);
asp.setPose( new EulerAngle(2, 0, 0), BodyPart.RIGHT_ARM);
asp.getInventory().setItemInHand(new ItemStack(Material.STICK));
packetList.add(asp);
yaw+=90;
}
fArmorStand asp = getManager().createArmorStand(getObjID(), stick1);
asp.setPose(new EulerAngle(1.38,.0,.0), BodyPart.RIGHT_ARM);
asp.getInventory().setItemInHand(new ItemStack(Material.STICK));
packetList.add(asp);
asp = getManager().createArmorStand(getObjID(), stick2);
asp.setPose(new EulerAngle(1.38,.0,.0), BodyPart.RIGHT_ARM);
asp.getInventory().setItemInHand(new ItemStack(Material.STICK));
packetList.add(asp);
asp = getManager().createArmorStand(getObjID(), bone);
asp.setPose(new EulerAngle(1.38,.0,1.57), BodyPart.RIGHT_ARM);
asp.getInventory().setItemInHand(new ItemStack(Material.BONE));
packetList.add(asp);
asp = getManager().createArmorStand(getObjID(), middle.add(0,-1.3,0));
asp.setSmall(true);
packetList.add(asp);
for(fArmorStand packet : packetList){
packet.setInvisible(true);
packet.setGravity(false);
}
getManager().send(getObjID());
Bukkit.getPluginManager().registerEvents(this, getPlugin());
}
@EventHandler
public void onFurnitureClick(FurnitureClickEvent e){
if(getObjID()==null){return;}
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
if(e.isCancelled()){return;}
if(!e.getID().equals(getObjID())){return;}
if(!e.canBuild()){return;}
e.setCancelled(true);
List<fArmorStand> aspList = getManager().getfArmorStandByObjectID(getObjID());
final ItemStack itemStack = e.getPlayer().getItemInHand();
fArmorStand packet = null;
for(fArmorStand pack : aspList){
if(pack.isSmall() && pack.isVisible()){
packet = pack;
}
}
if(itemStack.getType().equals(Material.WATER_BUCKET) && packet.isFire()){
setfire(false);
}else if(itemStack.getType().equals(Material.FLINT_AND_STEEL) && !packet.isFire()){
setfire(true);
}else if(items.contains(itemStack.getType()) && packet.isFire() && armorS==null){
is = itemStack.clone();
is.setAmount(1);
setGrill();
if(e.getPlayer().getGameMode().equals(GameMode.CREATIVE) && getLib().useGamemode()) return;
Integer i = e.getPlayer().getInventory().getHeldItemSlot();
ItemStack item = e.getPlayer().getItemInHand();
item.setAmount(item.getAmount()-1);
e.getPlayer().getInventory().setItem(i, item);
e.getPlayer().updateInventory();
}
}
private void setfire(boolean b){
for(fArmorStand pack : getManager().getfArmorStandByObjectID(getObjID())){
if(pack.isSmall() && pack.isVisible()){
if((pack.getInventory().getHelmet() == null || pack.getInventory().getHelmet().getType().equals(Material.AIR)) &&
(pack.getInventory().getItemInHand() == null || pack.getInventory().getItemInHand().getType().equals(Material.AIR))){
pack.setFire(b);
Location loc = middle.clone();
loc.add(0, 1.3, 0);
if(b) getLib().getLightManager().addLight(loc, 15);
if(!b) getLib().getLightManager().removeLight(loc);
getManager().updateFurniture(getObjID());
return;
}
}
}
}
@EventHandler
public void onFurnitureBreak(FurnitureBreakEvent e){
if(getObjID()==null){return;}
if(getObjID().getSQLAction().equals(SQLAction.REMOVE)){return;}
if(e.isCancelled()){return;}
if(!e.getID().equals(getObjID())){return;}
if(!e.canBuild()){return;}
e.setCancelled(true);
if(isRunning()){
Bukkit.getScheduler().cancelTask(timer);
timer=null;
getWorld().dropItem(middle.clone().add(0, .5, 0), is);
}
setfire(false);
e.remove();
delete();
}
public void removeGrill(){
if(isRunning()){
Bukkit.getScheduler().cancelTask(timer);
timer=null;
if(armorS!=null&&armorS.getInventory().getItemInHand()!=null&&getItem(armorS.getInventory().getItemInHand())!=null){
getWorld().dropItem(middle.clone().add(0, .5, 0), getCooked(is));
armorS.kill();
armorS.delete();
armorS=null;
}
}
if(armorS!=null){
if(armorS.getInventory().getItemInHand()!=null){getWorld().dropItem(middle.clone().add(0, .5, 0), getCooked(is));}
armorS.kill();
armorS.delete();
armorS=null;
}
}
public ItemStack getItem(ItemStack is){
if(is==null){return null;}
if(is.getType()==null){return null;}
if(items.contains(is.getType())){
return is;
}
return null;
}
public ItemStack getCooked(ItemStack is){
if(is==null){return null;}
if(is.getType()==null){return null;}
if(items.contains(is.getType())){
return new ItemStack(items2.get(items.indexOf(is.getType())));
}
return is;
}
public boolean isRunning(){
if(timer==null){return false;}
return true;
}
public void setGrill(){
this.armorS = getManager().createArmorStand(getObjID(), grill);
this.armorS.setInvisible(true);
this.armorS.getInventory().setItemInHand(is);
getManager().send(getObjID());
this.timer = main.getInstance().getServer().getScheduler().scheduleSyncRepeatingTask(main.getInstance(), new Runnable() {
Integer rounds = getLutil().randInt(15, 30);
Integer labs = 0;
Integer position = 0;
@Override
public void run() {
if(labs>=rounds){removeGrill();return;}
if(position>3){position=0;}
if(armorS!=null){
armorS.setPose(angle[position], BodyPart.RIGHT_ARM);
armorS.update();
}
position++;
labs++;
}
}, 0, 4);
}
}