catapult rotatyyyy

This commit is contained in:
NewGarbo 2016-02-04 21:50:47 +00:00
parent 50c2da2a95
commit fa460dbd45
5 changed files with 122 additions and 102 deletions

View File

@ -1,6 +1,5 @@
package mineplex.core.common.util;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_8_R3.ChatMessage;
@ -28,6 +27,11 @@ public class UtilTextMiddle
public static void display(String text, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks, Player... players)
{
if (players.length == 1 && players[0] == null)
{
return;
}
setTimings(fadeInTicks, stayTicks, fadeOutTicks, players);
display(text, subtitle, players);

View File

@ -137,16 +137,4 @@ public class SiegeManager extends MiniPlugin
LiveSiegeWeapons.remove(weapon);
}
public SiegeWeapon close(Block block)
{
for (SiegeWeapon weapon : LiveSiegeWeapons)
{
if (weapon.getLocation().distance(block.getLocation()) <= weapon.getSize() + 3.d)
{
return weapon;
}
}
return null;
}
}

View File

@ -4,15 +4,18 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Slime;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.EulerAngle;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
@ -37,9 +40,7 @@ public class Catapult extends SiegeWeapon
{
super(location, 1600.d, "Catapult", clan, clan.Clans, siegeManager);
location.add(.5, 0, .5);
setBoundingBox(1);
setBoundingBox(3, 0);
setStateInfo("Unloaded", new WeaponStateInfo(Material.PACKED_ICE, (byte) 0));
setStateInfo("Loaded", new WeaponStateInfo(Material.ENDER_PORTAL_FRAME, (byte) 0));
@ -60,7 +61,7 @@ public class Catapult extends SiegeWeapon
_invertRotation = true;
_rotSpeed = 40.0f;
_rotSpeed = 60.0f;
setFireRule(new AccessRule(AccessType.LCLICK_BB, player -> {
if (!isRiding(player))
@ -110,43 +111,38 @@ public class Catapult extends SiegeWeapon
private void loadEntities()
{
Slime slime = _location.getWorld().spawn(_location, Slime.class);
UtilEnt.silence(slime, true);
UtilEnt.Vegetate(slime);
slime.setSize(-1);
slime.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 99999999, 1, true, false));
addEntity(slime, "Filler");
slime = _location.getWorld().spawn(_location, Slime.class);
UtilEnt.silence(slime, true);
UtilEnt.Vegetate(slime);
slime.setSize(-1);
slime.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 99999999, 1, true, false));
getEntity("Filler").setPassenger(slime);
addEntity(slime, "PLAYERMOUNT");
ArmorStand armorStand = _location.getWorld().spawn(_location, ArmorStand.class);
ArmorStand armorStand = _location.getWorld().spawn(_location.clone().add(.5, .1, .5), ArmorStand.class);
UtilEnt.setFakeHead(armorStand, true);
armorStand.teleport(_location);
armorStand.setVisible(false);
armorStand.setGravity(false);
armorStand.setPassenger(getEntity("Filler"));
addEntity(armorStand, "WEAPON");
ArmorStand customRot = _location.getWorld().spawn(_location, ArmorStand.class);
customRot.setVisible(false);
customRot.setGravity(false);
addEntity(customRot, "PLAYERMOUNT");
for (int i = 0; i < 24; i++)
{
float yaw = (360.f / ((float) 24)) * i;
ArmorStand point = _location.getWorld().spawn(UtilAlg.moveForward(_location.clone().subtract(0, 1, 0), .5, yaw, false), ArmorStand.class);
point.setVisible(false);
point.setGravity(false);
addEntity(point, "Point_" + i);
}
}
@Override
public void Fire(WeaponProjectile projectile)
{
projectile.setLocation(projectile.getLocation().add(.0, 3.2, .0));
projectile.setLocation(projectile.getLocation().add(.0, 2.7, .0));
UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(projectile.getLocation(), Sound.BAT_TAKEOFF, 2.f, .45f));
}
@ -174,6 +170,20 @@ public class Catapult extends SiegeWeapon
{
UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, getProjectile().getLocation().add(0, .5, 0), new Vector(0, 0, 0), .1f, 3, ViewDist.MAX);
}
if (getRider() == null)
{
return;
}
ArmorStand stand = (ArmorStand) getEntity("Point_" + (_yaw / (360.d / 24.d)));
stand.setPassenger(getRider());
}
protected double PreRotate(double yaw)
{
return yaw / (360.d / 24.d);
}
@Override

View File

@ -2,13 +2,11 @@ package mineplex.game.clans.clans.siege.weapon;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@ -17,6 +15,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
@ -33,8 +32,7 @@ import com.google.common.collect.Maps;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
@ -46,6 +44,7 @@ import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.siege.SiegeManager;
import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent;
import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes;
import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile;
import mineplex.game.clans.clans.siege.weapon.util.AccessRule;
@ -107,6 +106,8 @@ public abstract class SiegeWeapon implements Listener
private long _lastRight = -1;
private long _lastLeft = -1;
protected double _yaw;
protected long _lastFired;
public SiegeWeapon(Location location, double maxHealth, String name, ClanInfo owner, ClansManager clansManager, SiegeManager siegeManager)
@ -129,6 +130,11 @@ public abstract class SiegeWeapon implements Listener
_clans = clansManager;
}
private ClanInfo getOwner()
{
return _owner;
}
public ClansManager getClans()
{
return _clans;
@ -162,6 +168,19 @@ public abstract class SiegeWeapon implements Listener
_collisionBox.registerLeft((block, player) -> handleLeftClick(player));
}
protected void setBoundingBox(int size, int y)
{
Validate.isTrue(size > 0, "Size must be a positive number.");
Validate.isTrue(UtilMath.isOdd(size), "Size must be an odd number.");
_boundingBoxSize = size;
_collisionBox = size == 1 ? BarrierCollisionBox.single(_location.clone()) : BarrierCollisionBox.all(_location.clone().subtract((size - 1) / 2, 0, (size - 1) / 2), _location.clone().add(((size - 1) / 2) + .2, y, ((size - 1) / 2) + .2));
_collisionBox.Construct();
_collisionBox.registerRight((block, player) -> handleRightClick(player));
_collisionBox.registerLeft((block, player) -> handleLeftClick(player));
}
private void updateWeapon()
{
if (_inventory != null)
@ -182,6 +201,9 @@ public abstract class SiegeWeapon implements Listener
}
}
ArmorStand armorStand = (ArmorStand) getEntity("WEAPON");
double standYaw = _yaw % 360;
if (getEntity("PLAYERMOUNT").getPassenger() == null)
{
return;
@ -189,8 +211,6 @@ public abstract class SiegeWeapon implements Listener
if (getRider() != null)
{
ArmorStand armorStand = (ArmorStand) getEntity("WEAPON");
double standYaw = Math.toDegrees(armorStand.getHeadPose().getY()) % 360;
double riderYaw = (getRider().getLocation().getYaw() + (_invertRotation ? 180 : 0)) % 360;
// riderYaw = 350 and standYaw = 20
@ -200,8 +220,10 @@ public abstract class SiegeWeapon implements Listener
if (dif < -180) dif += 360;
double yaw = (float) ((float)standYaw + Math.min(dif / _rotSpeed, 4f));
armorStand.setHeadPose(new EulerAngle(0, Math.toRadians(yaw), 0));
_yaw = yaw;
armorStand.setHeadPose(new EulerAngle(0, Math.toRadians(PreRotate(_yaw)), 0));
}
}
@ -393,47 +415,7 @@ public abstract class SiegeWeapon implements Listener
private void dismount(Player player)
{
//2 in ecah
Block origin = player.getLocation().getBlock();
BlockFace[] faces = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST };
Block suitable = null;
findAir: for (int yTests = 0; yTests < _boundingBoxSize; yTests++)
{
final int fyt = yTests;
Function<Block, Block> function = block -> {
Block up = block;
for (int x = 0; x < fyt; x++)
{
up = up.getRelative(BlockFace.UP);
}
return up;
};
for (BlockFace face : faces)
{
Block testFor = origin.getRelative(face).getRelative(face);
if (UtilItem.isBoundless(function.apply(testFor).getType()))
{
suitable = function.apply(testFor);
break findAir;
}
}
}
if (suitable == null)
{
suitable = UtilBlock.getHighest(origin.getWorld(), origin).getRelative(BlockFace.UP);
}
player.teleport(suitable.getRelative(BlockFace.UP).getLocation());
player.teleport(player.getLocation().add(0, 1, 0));
}
private void handleLeftClick(Player player)
@ -495,7 +477,12 @@ public abstract class SiegeWeapon implements Listener
protected void RightClick(Player player)
{
}
protected double PreRotate(double yaw)
{
return yaw;
}
protected void Cleanup()
{
}
@ -517,6 +504,11 @@ public abstract class SiegeWeapon implements Listener
_entityMapping.put(uniqueName, entity);
}
protected final void removeEntity(String uniqueName)
{
_comprisedOf.remove(_entityMapping.remove(getEntity(uniqueName)));
}
protected final Entity getEntity(String uniqueName)
{
return _entityMapping.get(uniqueName);
@ -682,6 +674,31 @@ public abstract class SiegeWeapon implements Listener
// Events
@EventHandler
public void onSiegeWeaponExplode(SiegeWeaponExplodeEvent event)
{
if (UtilAlg.inBoundingBox(event.getProjectile().getLocation(), _location.clone().subtract(4, 2, 4), _location.clone().add(4, 2, 4)))
{
if (getHealth() > 750)
{
event.setCancelled(true);
}
int hprem = 600 + (UtilMath.random.nextInt(250));
removeHealth(hprem);
if (getHealth() > 0)
{
UtilTextMiddle.display("Damage", "You damaged " + F.elem(getOwner().getName()) + "'s " + _name + " for " + C.cRed + "-" + hprem + C.mBody + " health. (Current health: " + C.cGreen + getHealth() + C.cGray + ")", 10, 60, 10, event.getWeapon().getRider());
}
else
{
UtilTextMiddle.display("Damage", "You destroyed " + F.elem(getOwner().getName()) + "'s " + _name + ".", 10, 60, 10, event.getWeapon().getRider());
}
}
}
@EventHandler
public void onDamage(EntityDamageEvent event)
{
@ -760,11 +777,20 @@ public abstract class SiegeWeapon implements Listener
{
if (event.getBlock().getLocation().distance(_location) < _boundingBoxSize + 1.65 && event.getBlock().getLocation().getY() <= _location.getY())
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You may not break blocks under a Siege Weapon"));
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You may not break blocks near a Siege Weapon"));
event.setCancelled(true);
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event)
{
if (event.getBlock().getLocation().distance(_location) < _boundingBoxSize + 1.65 && event.getBlock().getLocation().getY() <= _location.getY())
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You may not place blocks near a Siege Weapon"));
event.setCancelled(true);
}
}
public boolean inProtection(Block block)
{

View File

@ -103,7 +103,6 @@ public class Crater implements Listener
HashMap<Block, Double> blockList = new HashMap<Block, Double>();
int iR = (int) _size + 1;
loop:
for (int x = -iR; x <= iR; x++)
{
for (int z = -iR; z <= iR; z++)
@ -116,13 +115,6 @@ public class Crater implements Listener
if (offset <= _size)
{
SiegeWeapon weapon = SiegeManager.Instance.close(curBlock);
if (weapon != null)
{
weapon.removeHealth(453);
break loop;
}
blockList.put(curBlock, Double.valueOf(offset));
}
}