mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-15 07:01:36 +08:00
176 lines
8.3 KiB
Diff
176 lines
8.3 KiB
Diff
From bc6f8371fb5e19fb85b9906114623ee141fb3baf Mon Sep 17 00:00:00 2001
|
|
From: Thinkofdeath <thethinkofdeath@gmail.com>
|
|
Date: Fri, 20 Dec 2013 21:36:06 +0000
|
|
Subject: [PATCH] Particle API
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
index 7de0de5..7eca388 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
|
|
@@ -55,6 +55,8 @@ public class CraftEffect {
|
|
Validate.isTrue(((Material) data).isBlock(), "Material is not a block!");
|
|
datavalue = ((Material) data).getId();
|
|
break;
|
|
+ case ITEM_BREAK:
|
|
+ datavalue = ((Material) data).getId();
|
|
default:
|
|
datavalue = 0;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index 452f6f3..a36297d 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -805,28 +805,18 @@ public class CraftWorld implements World {
|
|
Validate.isTrue(effect.getData() == null, "Wrong kind of data for this effect!");
|
|
}
|
|
|
|
- int datavalue = data == null ? 0 : CraftEffect.getDataValue(effect, data);
|
|
- playEffect(loc, effect, datavalue, radius);
|
|
+ if (data != null && data.getClass().equals( org.bukkit.material.MaterialData.class )) {
|
|
+ org.bukkit.material.MaterialData materialData = (org.bukkit.material.MaterialData) data;
|
|
+ Validate.isTrue( materialData.getItemType().isBlock(), "Material must be block" );
|
|
+ spigot().playEffect( loc, effect, materialData.getItemType().getId(), materialData.getData(), 0, 0, 0, 1, 1, radius );
|
|
+ } else {
|
|
+ int dataValue = data == null ? 0 : CraftEffect.getDataValue( effect, data );
|
|
+ playEffect( loc, effect, dataValue, radius );
|
|
+ }
|
|
}
|
|
|
|
public void playEffect(Location location, Effect effect, int data, int radius) {
|
|
- Validate.notNull(location, "Location cannot be null");
|
|
- Validate.notNull(effect, "Effect cannot be null");
|
|
- Validate.notNull(location.getWorld(), "World cannot be null");
|
|
- int packetData = effect.getId();
|
|
- PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, location.getBlockX(), location.getBlockY(), location.getBlockZ(), data, false);
|
|
- int distance;
|
|
- radius *= radius;
|
|
-
|
|
- for (Player player : getPlayers()) {
|
|
- if (((CraftPlayer) player).getHandle().playerConnection == null) continue;
|
|
- if (!location.getWorld().equals(player.getWorld())) continue;
|
|
-
|
|
- distance = (int) player.getLocation().distanceSquared(location);
|
|
- if (distance <= radius) {
|
|
- ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
|
|
- }
|
|
- }
|
|
+ spigot().playEffect( location, effect, data, 0, 0, 0, 0, 1, 1, radius );
|
|
}
|
|
|
|
public <T extends Entity> T spawn(Location location, Class<T> clazz) throws IllegalArgumentException {
|
|
@@ -1316,6 +1306,56 @@ public class CraftWorld implements World {
|
|
// Spigot start
|
|
private final Spigot spigot = new Spigot()
|
|
{
|
|
+ @Override
|
|
+ public void playEffect( Location location, Effect effect, int id, int data, float offsetX, float offsetY, float offsetZ, float speed, int particleCount, int radius )
|
|
+ {
|
|
+ Validate.notNull( location, "Location cannot be null" );
|
|
+ Validate.notNull( effect, "Effect cannot be null" );
|
|
+ Validate.notNull( location.getWorld(), "World cannot be null" );
|
|
+ Packet packet;
|
|
+ if ( effect.getType() != Effect.Type.PARTICLE )
|
|
+ {
|
|
+ int packetData = effect.getId();
|
|
+ packet = new PacketPlayOutWorldEvent( packetData, location.getBlockX(), location.getBlockY(), location.getBlockZ(), id, false );
|
|
+ } else
|
|
+ {
|
|
+ StringBuilder particleFullName = new StringBuilder();
|
|
+ particleFullName.append( effect.getName() );
|
|
+ if ( effect.getData() != null && ( effect.getData().equals( Material.class ) || effect.getData().equals( org.bukkit.material.MaterialData.class ) ) )
|
|
+ {
|
|
+ particleFullName.append( '_' ).append( id );
|
|
+ }
|
|
+ if ( effect.getData() != null && effect.getData().equals( org.bukkit.material.MaterialData.class ) )
|
|
+ {
|
|
+ particleFullName.append( '_' ).append( data );
|
|
+ }
|
|
+ packet = new PacketPlayOutWorldParticles( particleFullName.toString(), (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, particleCount );
|
|
+ }
|
|
+ int distance;
|
|
+ radius *= radius;
|
|
+ for ( Player player : getPlayers() )
|
|
+ {
|
|
+ if ( ( (CraftPlayer) player ).getHandle().playerConnection == null )
|
|
+ {
|
|
+ continue;
|
|
+ }
|
|
+ if ( !location.getWorld().equals( player.getWorld() ) )
|
|
+ {
|
|
+ continue;
|
|
+ }
|
|
+ distance = (int) player.getLocation().distanceSquared( location );
|
|
+ if ( distance <= radius )
|
|
+ {
|
|
+ ( (CraftPlayer) player ).getHandle().playerConnection.sendPacket( packet );
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void playEffect( Location location, Effect effect )
|
|
+ {
|
|
+ CraftWorld.this.playEffect( location, effect, 0 );
|
|
+ }
|
|
};
|
|
|
|
public Spigot spigot()
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index dd80ab7..4d4516f 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1325,6 +1325,49 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
server.getServer().getPlayerList().moveToWorld( getHandle(), 0, false );
|
|
}
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public void playEffect( Location location, Effect effect, int id, int data, float offsetX, float offsetY, float offsetZ, float speed, int particleCount, int radius )
|
|
+ {
|
|
+ Validate.notNull( location, "Location cannot be null" );
|
|
+ Validate.notNull( effect, "Effect cannot be null" );
|
|
+ Validate.notNull( location.getWorld(), "World cannot be null" );
|
|
+ Packet packet;
|
|
+ if ( effect.getType() != Effect.Type.PARTICLE )
|
|
+ {
|
|
+ int packetData = effect.getId();
|
|
+ packet = new PacketPlayOutWorldEvent( packetData, location.getBlockX(), location.getBlockY(), location.getBlockZ(), id, false );
|
|
+ } else
|
|
+ {
|
|
+ StringBuilder particleFullName = new StringBuilder();
|
|
+ particleFullName.append( effect.getName() );
|
|
+ if ( effect.getData() != null && ( effect.getData().equals( Material.class ) || effect.getData().equals( org.bukkit.material.MaterialData.class ) ) )
|
|
+ {
|
|
+ particleFullName.append( '_' ).append( id );
|
|
+ }
|
|
+ if ( effect.getData() != null && effect.getData().equals( org.bukkit.material.MaterialData.class ) )
|
|
+ {
|
|
+ particleFullName.append( '_' ).append( data );
|
|
+ }
|
|
+ packet = new PacketPlayOutWorldParticles( particleFullName.toString(), (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, particleCount );
|
|
+ }
|
|
+ int distance;
|
|
+ radius *= radius;
|
|
+ if ( getHandle().playerConnection == null )
|
|
+ {
|
|
+ return;
|
|
+ }
|
|
+ if ( !location.getWorld().equals( getWorld() ) )
|
|
+ {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ distance = (int) getLocation().distanceSquared( location );
|
|
+ if ( distance <= radius )
|
|
+ {
|
|
+ getHandle().playerConnection.sendPacket( packet );
|
|
+ }
|
|
+ }
|
|
};
|
|
|
|
public Player.Spigot spigot()
|
|
--
|
|
1.9.1
|
|
|