0

Merge branch 'develop' into dev/modules

# Conflicts:
#	build.gradle
This commit is contained in:
2021-01-08 18:18:06 +03:00
4 changed files with 161 additions and 2 deletions

View File

@@ -62,6 +62,15 @@ YamlConfiguration config = GhastTools.loadConfig(false);
Если передать параметр `false`, то при отсутствии файла `config.yml` в папке плагина, Если передать параметр `false`, то при отсутствии файла `config.yml` в папке плагина,
будет загруден исключительно встроенный файл настроек. будет загруден исключительно встроенный файл настроек.
### copyLocation
Копирования объекта `Location`
```java
Location location = ...;
Location copyLoc = GhastTools.copyLocation(location);
```
## AssetsManager ## AssetsManager
Методы по работе с файлами плагина (_"ассетами"_). Методы по работе с файлами плагина (_"ассетами"_).
@@ -110,11 +119,45 @@ _По-умолчанию равен `StandardCharsets.UTF_8`_
### placeSkull ### placeSkull
Установка черепа.
```java ```java
Location location = ...; Location location = ...;
Skull skull = BuildHelper.placeSkull(location, BlockFace.NORTH) Skull skull = BuildHelper.placeSkull(location, BlockFace.NORTH);
skull.update(true); // иначе изменения на карте не применятся и череп будет висеть в воздухе
``` ```
### placePlayerHead
Установка головы игрока.
```java
Location location = ...;
Skull playerHead = BuildHelper.placePlayerHead(location, BlockFace.NORTH);
playerHead.update(true); // иначе изменения на карте не применятся и голова будет висеть в воздухе
```
Если третьим параметром передать URL текстуры, то голова будет текстурирована.
```java
Location location = ...;
BuildHelper.placePlayerHead(location, BlockFace.NORTH, "http://...");
```
### setPlayerHeadSkin
Установка текстуры для головы игрока.
```java
Location location = ...;
Skull playerHead = BuildHelper.placePlayerHead(location, BlockFace.NORTH);
playerHead.update(true); // иначе изменения на карте не применятся и голова будет висеть в воздухе
setPlayerHeadSkin(playerHead);
```
Порядок выполнения методов в приведённом выше примере **важен**. Если `playerHead.update(true)` вызвать после
установки текстуры, она собъётся на стандартную.
### placeSignWall ### placeSignWall
```java ```java

View File

@@ -5,7 +5,7 @@ class LibsExtention {
final def commons_text = 'org.apache.commons:commons-text:1.9' final def commons_text = 'org.apache.commons:commons-text:1.9'
final def lombok = 'org.projectlombok:lombok:1.18.12' final def lombok = 'org.projectlombok:lombok:1.18.12'
final def refobj = 'ru.dmitriymx:reflection-object:1.0-BETA' final def refobj = 'ru.dmitriymx:reflection-object:1.2'
final def bukkit = filter([ final def bukkit = filter([
lib : 'org.bukkit:bukkit:1.12.2-R0.1-SNAPSHOT', lib : 'org.bukkit:bukkit:1.12.2-R0.1-SNAPSHOT',

View File

@@ -3,26 +3,111 @@ package ghast;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.SkullType;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.block.Skull; import org.bukkit.block.Skull;
import ru.dmitriymx.reflection.ReflectionClass;
import ru.dmitriymx.reflection.ReflectionObject;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.UUID;
@UtilityClass @UtilityClass
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BuildHelper { public class BuildHelper {
private final Class<?> CLASS_BLOCKPOSITION = getClassForName("net.minecraft.server.v1_12_R1.BlockPosition");
private final Class<?> CLASS_GAMEPROFILE = getClassForName("com.mojang.authlib.GameProfile");
/**
* Установка черепа.
* <p>
* После установки, необходимо выполнить <code>skull.update(true);</code>
*
* @param location место установки.
* @param face куда будет повёрнут череп.
* @return Блок типа {@link Skull}
*/
public Skull placeSkull(Location location, BlockFace face) { public Skull placeSkull(Location location, BlockFace face) {
Location fixedLocation = GhastTools.copyLocation(location);
fixedLocation.setZ(fixedLocation.getZ() - 1);
Block block = location.getWorld().getBlockAt(location); Block block = location.getWorld().getBlockAt(location);
block.setType(Material.SKULL); block.setType(Material.SKULL);
Skull skull = (Skull) block.getState(); Skull skull = (Skull) block.getState();
skull.setRotation(face); skull.setRotation(face);
org.bukkit.material.Skull skullMaterial = (org.bukkit.material.Skull) skull.getData(); org.bukkit.material.Skull skullMaterial = (org.bukkit.material.Skull) skull.getData();
skullMaterial.setFacingDirection(BlockFace.SELF); skullMaterial.setFacingDirection(BlockFace.SELF);
return skull; return skull;
} }
/**
* Установка головы игрока.
* <p>
* После установки, необходимо выполнить <code>skull.update(true);</code>
*
* @param location место установки.
* @param face куда будет повёрнута голова.
* @return Блок типа {@link Skull}
*/
public static Skull placePlayerHead(Location location, BlockFace face) {
Location fixedLocation = GhastTools.copyLocation(location);
fixedLocation.setZ(fixedLocation.getZ() - 1);
Block block = fixedLocation.getWorld().getBlockAt(fixedLocation);
block.setType(Material.SKULL);
Skull skull = (Skull) block.getState();
skull.setSkullType(SkullType.PLAYER);
skull.setRotation(face);
org.bukkit.material.Skull skullMaterial = (org.bukkit.material.Skull) skull.getData();
skullMaterial.setFacingDirection(BlockFace.SELF);
return skull;
}
/**
* Установка текстурированной головы игрока.
*
* @param location место установки.
* @param face куда будет повёрнута голова.
* @param skinUrl URL на текстуру
* @return Блок типа {@link Skull}
*/
public static Skull placePlayerHead(Location location, BlockFace face, String skinUrl) {
Skull playerHead = placePlayerHead(location, face);
playerHead.update(true);
setPlayerHeadSkin(playerHead, skinUrl);
return playerHead;
}
/**
* Установка текстуры для головы игрока.
*
* @param skull блок головы игрока
* @param skinUrl URL на текстуру
*/
public static void setPlayerHeadSkin(Skull skull, String skinUrl) {
//TODO заменить рефлексию на "фантомные" классы
ReflectionObject refobjBlockPosition = new ReflectionClass(CLASS_BLOCKPOSITION)
.constructor(double.class, double.class, double.class)
.newInstance(skull.getX(), skull.getY(), skull.getZ());
new ReflectionObject(skull.getWorld())
.method("getHandle").invoke()
.method("getTileEntity", CLASS_BLOCKPOSITION)
.invoke(refobjBlockPosition.getOriginalObject())
.method("setGameProfile", CLASS_GAMEPROFILE)
.invoke(getRefObjPlayerProfile(skinUrl).getOriginalObject());
}
public Sign placeSignWall(Location location, BlockFace face) { public Sign placeSignWall(Location location, BlockFace face) {
Block block = location.getWorld().getBlockAt(location); Block block = location.getWorld().getBlockAt(location);
block.setType(Material.WALL_SIGN); block.setType(Material.WALL_SIGN);
@@ -33,4 +118,30 @@ public class BuildHelper {
return sign; return sign;
} }
private ReflectionObject getRefObjPlayerProfile(String url){
ReflectionObject refobjProperty = new ReflectionClass(
getClassForName("com.mojang.authlib.properties.Property"))
.constructor(String.class, String.class)
.newInstance("textures", Base64.getEncoder()
.encodeToString(("{textures:{SKIN:{url:\"" + url + "\"}}}").getBytes(StandardCharsets.UTF_8)));
ReflectionObject refobjGameProfile = new ReflectionClass(CLASS_GAMEPROFILE)
.constructor(UUID.class, String.class)
.newInstance(UUID.randomUUID(), null);
refobjGameProfile
.method("getProperties").invoke()
.method("put", Object.class, Object.class)
.invoke("textures", refobjProperty.getOriginalObject());
return refobjGameProfile;
}
private Class<?> getClassForName(String className) {
try {
return Class.forName(className);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} }

View File

@@ -2,6 +2,7 @@ package ghast;
import ghast.assets.AssetsManager; import ghast.assets.AssetsManager;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Location;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@@ -54,4 +55,8 @@ public class GhastTools {
public YamlConfiguration loadConfig() { public YamlConfiguration loadConfig() {
return loadConfig(true); return loadConfig(true);
} }
public Location copyLocation(Location location) {
return new Location(location.getWorld(), location.getX(), location.getY(), location.getZ());
}
} }