You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
8.8 KiB
278 lines
8.8 KiB
package cx.sfy.TheBridge.hologram;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import org.bukkit.Location;
|
|
import org.bukkit.craftbukkit.v1_13_R2.CraftWorld;
|
|
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
|
|
import org.bukkit.craftbukkit.v1_13_R2.util.CraftChatMessage;
|
|
import org.bukkit.entity.ArmorStand;
|
|
import org.bukkit.entity.EntityType;
|
|
import org.bukkit.entity.Player;
|
|
|
|
import net.minecraft.server.v1_13_R2.EntityArmorStand;
|
|
import net.minecraft.server.v1_13_R2.PacketPlayOutEntityDestroy;
|
|
import net.minecraft.server.v1_13_R2.PacketPlayOutSpawnEntityLiving;
|
|
import net.minecraft.server.v1_13_R2.WorldServer;
|
|
|
|
public class TruenoHologram_v1_13_R2 implements TruenoHologram{
|
|
|
|
private Location location;
|
|
private ArrayList<String> lines;
|
|
private double linesdistance = 0.30;
|
|
|
|
private ArrayList<ArmorStand> armor_lines = new ArrayList<>();
|
|
private ArrayList<EntityArmorStand> NmsArmorLines = new ArrayList<>();
|
|
|
|
private Player player = null;
|
|
|
|
@Override
|
|
public void setupWorldHologram(Location loc, ArrayList<String> lines) {
|
|
this.location = loc.clone();
|
|
this.lines = lines;
|
|
|
|
}
|
|
|
|
@Override
|
|
public void setupPlayerHologram(Player player, Location loc, ArrayList<String> lines) {
|
|
this.player = player;
|
|
this.location = loc.clone();
|
|
this.lines = lines;
|
|
|
|
}
|
|
|
|
@Override
|
|
public Location getLocation(){
|
|
return this.location;
|
|
}
|
|
|
|
@Override
|
|
public Player getPlayer(){
|
|
return player;
|
|
}
|
|
|
|
private void NmsDestroy(EntityArmorStand hololine){
|
|
final PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(hololine.getId());
|
|
((CraftPlayer) this.player).getHandle().playerConnection.sendPacket(packet);
|
|
}
|
|
|
|
private Location getNmsLocation(EntityArmorStand hololine){
|
|
return new Location(hololine.getWorld().getWorld(), hololine.locX, hololine.locY, hololine.locZ);
|
|
}
|
|
|
|
private void NmsSpawn(EntityArmorStand stand, String line, Location loc){
|
|
stand.setLocation(loc.getX(), loc.getY(), loc.getZ(), 0, 0);
|
|
stand.setCustomName(CraftChatMessage.fromStringOrNull(line));
|
|
stand.setCustomNameVisible(true);
|
|
stand.setNoGravity(true);
|
|
stand.setSmall(true);
|
|
stand.setInvisible(true);
|
|
stand.setBasePlate(false);
|
|
stand.setArms(false);
|
|
if(!line.equals("")){
|
|
final PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving(stand);
|
|
((CraftPlayer) this.player).getHandle().playerConnection.sendPacket(packet);
|
|
}
|
|
}
|
|
|
|
private void spawn(){
|
|
int ind = 0;
|
|
for(final String line : lines){
|
|
Location finalLoc = location.clone();
|
|
finalLoc.setY(location.getY()+(linesdistance*lines.size()));
|
|
if(this.player!=null){
|
|
if(ind>0) finalLoc = getNmsLocation(NmsArmorLines.get(ind-1)); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final WorldServer s = ((CraftWorld)this.location.getWorld()).getHandle();
|
|
final EntityArmorStand stand = new EntityArmorStand(s);
|
|
NmsSpawn(stand, line, finalLoc);
|
|
NmsArmorLines.add(stand);
|
|
}
|
|
else{
|
|
if(ind>0) finalLoc = armor_lines.get(ind-1).getLocation(); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final ArmorStand Armorline = (ArmorStand) location.getWorld().spawnEntity(finalLoc, EntityType.ARMOR_STAND);
|
|
Armorline.setBasePlate(false);
|
|
Armorline.setCustomNameVisible(true);
|
|
Armorline.setGravity(false);
|
|
Armorline.setCanPickupItems(false);
|
|
Armorline.setCustomName(line);
|
|
Armorline.setSmall(true);
|
|
Armorline.setVisible(false);
|
|
armor_lines.add(Armorline);
|
|
if(line.equals("")) Armorline.remove();
|
|
}
|
|
ind++;
|
|
}
|
|
}
|
|
|
|
private void despawn(){
|
|
if(this.player!=null){
|
|
for(final EntityArmorStand nmsStand : NmsArmorLines)
|
|
NmsDestroy(nmsStand);
|
|
NmsArmorLines.clear();
|
|
}
|
|
else{
|
|
for(final ArmorStand line : armor_lines)
|
|
line.remove();
|
|
armor_lines.clear();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setDistanceBetweenLines(Double distance){
|
|
this.linesdistance = distance;
|
|
}
|
|
|
|
@Override
|
|
public void display(){
|
|
spawn();
|
|
}
|
|
|
|
@Override
|
|
public void update(ArrayList<String> lines){
|
|
if(this.player != null){
|
|
int ind = 0;
|
|
for(final String newline : lines)
|
|
if(this.lines.size()>= ind){
|
|
final String oldline = this.lines.get(ind);
|
|
if(!newline.equals(oldline))
|
|
if(!newline.equals("")){
|
|
final EntityArmorStand oldstand = NmsArmorLines.get(ind);
|
|
Location finalLoc = location.clone();
|
|
finalLoc.setY(location.getY()+(linesdistance*lines.size()));
|
|
if(ind>0) finalLoc = getNmsLocation(NmsArmorLines.get(ind-1)); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final WorldServer s = ((CraftWorld)this.location.getWorld()).getHandle();
|
|
final EntityArmorStand stand = new EntityArmorStand(s);
|
|
NmsSpawn(stand, newline, finalLoc);
|
|
this.NmsArmorLines.set(ind, stand);
|
|
this.lines.set(ind, newline);
|
|
NmsDestroy(oldstand);
|
|
}
|
|
else{
|
|
this.lines.set(ind, newline);
|
|
final EntityArmorStand oldstand = NmsArmorLines.get(ind);
|
|
NmsDestroy(oldstand);
|
|
}
|
|
ind++;
|
|
}
|
|
else{
|
|
Location finalLoc = location.clone();
|
|
finalLoc.setY(location.getY()+(linesdistance*lines.size()));
|
|
if(ind>0) finalLoc = getNmsLocation(NmsArmorLines.get(ind-1)); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final WorldServer s = ((CraftWorld)this.location.getWorld()).getHandle();
|
|
final EntityArmorStand stand = new EntityArmorStand(s);
|
|
NmsSpawn(stand, newline, finalLoc);
|
|
this.NmsArmorLines.add(stand);
|
|
this.lines.add(newline);
|
|
}
|
|
if(lines.size() > this.lines.size()){
|
|
final int dif = lines.size() - this.lines.size();
|
|
for(int in = 0; in <=dif; in++){
|
|
final int arrayind = (this.lines.size()-1)-in;
|
|
this.lines.remove(arrayind);
|
|
NmsDestroy(this.NmsArmorLines.get(arrayind));
|
|
this.NmsArmorLines.remove(arrayind);
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
int ind = 0;
|
|
for(final String newline : lines)
|
|
if(this.lines.size()>= ind){
|
|
final String oldline = this.lines.get(ind);
|
|
if(!newline.equals(oldline))
|
|
if(newline != "")
|
|
this.armor_lines.get(ind).setCustomName(newline);
|
|
else{
|
|
this.lines.set(ind, newline);
|
|
final ArmorStand oldstand = armor_lines.get(ind);
|
|
oldstand.remove();
|
|
}
|
|
ind++;
|
|
}
|
|
else{
|
|
Location finalLoc = location.clone();
|
|
finalLoc.setY(location.getY()+(linesdistance*lines.size()));
|
|
if(ind>0) finalLoc = armor_lines.get(ind-1).getLocation(); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final ArmorStand Armorline = (ArmorStand) location.getWorld().spawnEntity(finalLoc, EntityType.ARMOR_STAND);
|
|
Armorline.setBasePlate(false);
|
|
Armorline.setCustomNameVisible(true);
|
|
Armorline.setGravity(false);
|
|
Armorline.setCanPickupItems(false);
|
|
Armorline.setCustomName(newline);
|
|
Armorline.setSmall(true);
|
|
Armorline.setVisible(false);
|
|
armor_lines.add(Armorline);
|
|
this.lines.add(newline);
|
|
}
|
|
if(lines.size() > this.lines.size()){
|
|
final int dif = lines.size() - this.lines.size();
|
|
for(int in = 0; in <=dif; in++){
|
|
final int arrayind = (this.lines.size()-1)-in;
|
|
this.lines.remove(arrayind);
|
|
this.armor_lines.get(arrayind).remove();
|
|
this.armor_lines.remove(arrayind);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void updateLine(int index, String text){
|
|
if(this.lines.size() >= index){
|
|
final int realindex = (this.lines.size()-1)-index;
|
|
final String oldtext = this.lines.get(realindex);
|
|
if(!text.equals(oldtext)){
|
|
if(this.player != null){
|
|
if(text != ""){
|
|
final EntityArmorStand oldstand = NmsArmorLines.get(realindex);
|
|
Location finalLoc = location.clone();
|
|
finalLoc.setY(location.getY()+(linesdistance*lines.size()));
|
|
if(realindex>0) finalLoc = getNmsLocation(NmsArmorLines.get(realindex-1)); finalLoc.setY(finalLoc.getY()-linesdistance);
|
|
final WorldServer s = ((CraftWorld)this.location.getWorld()).getHandle();
|
|
final EntityArmorStand stand = new EntityArmorStand(s);
|
|
NmsSpawn(stand, text, finalLoc);
|
|
this.NmsArmorLines.set(realindex, stand);
|
|
NmsDestroy(oldstand);
|
|
}
|
|
else{
|
|
this.lines.set(realindex, text);
|
|
final EntityArmorStand oldstand = NmsArmorLines.get(realindex);
|
|
NmsDestroy(oldstand);
|
|
}
|
|
} else if(text != "")
|
|
this.armor_lines.get(realindex).setCustomName(text);
|
|
else{
|
|
final ArmorStand oldstand = armor_lines.get(realindex);
|
|
oldstand.remove();
|
|
}
|
|
this.lines.set(realindex, text);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public void removeLine(int index){
|
|
if(this.lines.size() >= index){
|
|
final int realindex = (this.lines.size()-1)-index;
|
|
if(this.player != null){
|
|
final EntityArmorStand stand = NmsArmorLines.get(realindex);
|
|
this.NmsArmorLines.remove(stand);
|
|
NmsDestroy(stand);
|
|
} else
|
|
this.armor_lines.get(realindex).remove();
|
|
this.lines.remove(realindex);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void delete(){
|
|
despawn();
|
|
this.player = null;
|
|
this.NmsArmorLines = new ArrayList<>();
|
|
this.armor_lines = new ArrayList<>();
|
|
this.lines = new ArrayList<>();
|
|
this.location = null;
|
|
}
|
|
|
|
}
|