Use the API & create exporter MC plugin
Getting a StackOverflowError at the moment
This commit is contained in:
parent
cb9d16b61b
commit
bdbc3ac184
7 changed files with 149 additions and 139 deletions
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using DataLoader;
|
||||
using GamecraftModdingAPI.Blocks;
|
||||
using RobocraftX.Blocks;
|
||||
using RobocraftX.Blocks.Ghost;
|
||||
using RobocraftX.Blocks.Scaling;
|
||||
|
@ -27,11 +28,9 @@ namespace GCMC
|
|||
}
|
||||
|
||||
public IEntitiesDB entitiesDB { get; set; }
|
||||
internal static BlockEntityFactory _blockEntityFactory; //Injected from PlaceBlockEngine
|
||||
|
||||
private void ImportWorld(string name)
|
||||
{
|
||||
PlaceBlock(0, BlockColors.Default, 0, new float3(0, 0, 0), 5, 1, 1, 1, 0);
|
||||
}
|
||||
|
||||
private void PlaceBlock(string args)
|
||||
|
@ -47,8 +46,10 @@ namespace GCMC
|
|||
float scaleX = float.Parse(s[7]);
|
||||
float scaleY = float.Parse(s[8]);
|
||||
float scaleZ = float.Parse(s[9]);
|
||||
float rotX = float.Parse(s[10]);
|
||||
uint playerId = 0;
|
||||
PlaceBlock(block, (BlockColors) color, darkness, new float3(x, y, z), scale, scaleX, scaleY, scaleZ, playerId);
|
||||
Placement.PlaceBlock((BlockIDs) block, new float3(x, y, z), new quaternion(rotX, 0, 0, 1),
|
||||
(BlockColors) color, darkness, scale, new float3(scaleX, scaleY, scaleZ), playerId);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -57,116 +58,11 @@ namespace GCMC
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Places a block at the given position
|
||||
/// </summary>
|
||||
/// <param name="block">The block's type</param>
|
||||
/// <param name="color">The block's color</param>
|
||||
/// <param name="darkness">The block color's darkness - 0 is default color</param>
|
||||
/// <param name="position">The block's position - default block size is 0.2</param>
|
||||
/// <param name="scale">The block's uniform scale - default scale is 1 (with 0.2 width)</param>
|
||||
/// <param name="scaleX">The block's non-uniform scale - less than 1 means <paramref name="scale"/> is used</param>
|
||||
/// <param name="scaleY">The block's non-uniform scale - less than 1 means <paramref name="scale"/> is used</param>
|
||||
/// <param name="scaleZ">The block's non-uniform scale - less than 1 means <paramref name="scale"/> is used</param>
|
||||
/// <param name="playerId">The player who placed the block</param>
|
||||
/// <exception cref="Exception"></exception>
|
||||
private void PlaceBlock(ushort block, BlockColors color, byte darkness, float3 position, int scale, float scaleX, float scaleY, float scaleZ, uint playerId)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (darkness > 9) throw new Exception("That is too dark. Make sure to use 0-9 as darkness. (0 is default.)");
|
||||
BuildBlock(block, (byte)color, position, scale, scaleX, scaleY, scaleZ).Init(new BlockPlacementInfoStruct()
|
||||
{
|
||||
loadedFromDisk = false,
|
||||
placedBy = playerId
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
Log.Error(e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private EntityStructInitializer BuildBlock(ushort block, byte color, float3 position, int scale, float scaleX, float scaleY, float scaleZ)
|
||||
{
|
||||
if (_blockEntityFactory == null)
|
||||
throw new Exception("The factory is null.");
|
||||
if (scale == 0)
|
||||
throw new Exception("Scale needs to be at least 1");
|
||||
if (Math.Abs(scaleX) < 1) scaleX = scale;
|
||||
if (Math.Abs(scaleY) < 1) scaleY = scale;
|
||||
if (Math.Abs(scaleZ) < 1) scaleZ = scale;
|
||||
//RobocraftX.CR.MachineEditing.PlaceBlockEngine
|
||||
ScalingEntityStruct scaling = new ScalingEntityStruct {scale = new float3(scaleX, scaleY, scaleZ)};
|
||||
RotationEntityStruct rotation = new RotationEntityStruct {rotation = quaternion.identity};
|
||||
GridRotationStruct gridRotation = new GridRotationStruct
|
||||
{position = float3.zero, rotation = quaternion.identity};
|
||||
CubeCategoryStruct category = new CubeCategoryStruct
|
||||
{category = CubeCategory.General, type = CubeType.Block};
|
||||
uint dbid = block;
|
||||
DBEntityStruct dbEntity = new DBEntityStruct {DBID = dbid};
|
||||
uint num = PrefabsID.DBIDMAP[dbid];
|
||||
GFXPrefabEntityStructGO gfx = new GFXPrefabEntityStructGO {prefabID = num};
|
||||
BlockPlacementScaleEntityStruct placementScale = new BlockPlacementScaleEntityStruct
|
||||
{
|
||||
blockPlacementHeight = scale, blockPlacementWidth = scale, desiredScaleFactor = scale, snapGridScale = scale,
|
||||
unitSnapOffset = 0, isUsingUnitSize = true
|
||||
};
|
||||
EquippedColourStruct colour = new EquippedColourStruct {indexInPalette = color};
|
||||
EGID egid2;
|
||||
switch (category.category)
|
||||
{
|
||||
case CubeCategory.SpawnPoint:
|
||||
case CubeCategory.BuildingSpawnPoint:
|
||||
egid2 = MachineEditingGroups.NewSpawnPointBlockID;
|
||||
break;
|
||||
default:
|
||||
egid2 = MachineEditingGroups.NewBlockID;
|
||||
break;
|
||||
}
|
||||
|
||||
int cubeId = PrefabsID.GenerateDBID((ushort) category.category, block);
|
||||
EntityStructInitializer structInitializer = _blockEntityFactory.Build(egid2, (uint) cubeId); //The ghost block index is only used for triggers
|
||||
if (colour.indexInPalette != byte.MaxValue)
|
||||
structInitializer.Init(new ColourParameterEntityStruct
|
||||
{
|
||||
indexInPalette = colour.indexInPalette
|
||||
});
|
||||
structInitializer.Init(new GFXPrefabEntityStructGPUI(gfx.prefabID));
|
||||
structInitializer.Init(new PhysicsPrefabEntityStruct(gfx.prefabID));
|
||||
structInitializer.Init(dbEntity);
|
||||
structInitializer.Init(new PositionEntityStruct {position = position});
|
||||
structInitializer.Init(rotation);
|
||||
structInitializer.Init(scaling);
|
||||
structInitializer.Init(gridRotation);
|
||||
structInitializer.Init(new UniformBlockScaleEntityStruct
|
||||
{
|
||||
scaleFactor = placementScale.desiredScaleFactor
|
||||
});
|
||||
return structInitializer;
|
||||
}
|
||||
|
||||
public JobHandle SimulatePhysicsStep(in float deltaTime, in PhysicsUtility utility, in PlayerInput[] playerInputs)
|
||||
{
|
||||
return new JobHandle();
|
||||
}
|
||||
|
||||
public string name { get; } = "Cube placer engine";
|
||||
|
||||
enum BlockColors
|
||||
{
|
||||
Default = byte.MaxValue,
|
||||
White = 0,
|
||||
Pink,
|
||||
Purple,
|
||||
Blue,
|
||||
Aqua,
|
||||
Green,
|
||||
Lime,
|
||||
Yellow,
|
||||
Orange,
|
||||
Red
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
using System.Reflection;
|
||||
using DataLoader;
|
||||
using Harmony;
|
||||
using JetBrains.Annotations;
|
||||
using RobocraftX.Blocks;
|
||||
using RobocraftX.Blocks.GUI;
|
||||
using RobocraftX.Common;
|
||||
using RobocraftX.CR.MachineEditing;
|
||||
using RobocraftX.StateSync;
|
||||
using Svelto.ECS;
|
||||
using Unity.Entities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace GCMC
|
||||
{
|
||||
[HarmonyPatch]
|
||||
[UsedImplicitly]
|
||||
public class FactoryObtainerPatch
|
||||
{
|
||||
static void Postfix(BlockEntityFactory blockEntityFactory)
|
||||
{
|
||||
CubePlacerEngine._blockEntityFactory = blockEntityFactory;
|
||||
Debug.Log("Block entity factory injected.");
|
||||
}
|
||||
|
||||
static MethodBase TargetMethod(HarmonyInstance instance)
|
||||
{
|
||||
return typeof(PlaceBlockEngine).GetConstructors()[0];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,6 +21,9 @@
|
|||
<Reference Include="DataLoader, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>..\ref\DataLoader.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="GamecraftModdingAPI, Version=0.1.1.0, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>..\..\GamecraftModdingAPI\GamecraftModdingAPI\bin\Debug\net48\GamecraftModdingAPI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="IllusionPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>IllusionPlugin.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
49
GCMCPlugin/pom.xml
Normal file
49
GCMCPlugin/pom.xml
Normal file
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.github.norbipeti</groupId>
|
||||
<artifactId>GCMCPlugin</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>7</source>
|
||||
<target>7</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.15-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.10</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.5</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,14 @@
|
|||
package io.github.norbipeti.gcmc;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class Blocks {
|
||||
private Location start;
|
||||
private Location end;
|
||||
private Material material;
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package io.github.norbipeti.gcmc;
|
||||
|
||||
import com.google.common.io.Files;
|
||||
import com.google.gson.Gson;
|
||||
import lombok.val;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PluginMain extends JavaPlugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length < 6) {
|
||||
sender.sendMessage("§cUsage: /export <x1> <y1> <z1> <x2> <y2> <z2>");
|
||||
return true;
|
||||
}
|
||||
int[] xyz = new int[6];
|
||||
for (int i = 0; i < args.length; i++)
|
||||
xyz[i] = Integer.parseInt(args[i]);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (xyz[i] >= xyz[i + 3]) {
|
||||
int tmp = xyz[i];
|
||||
xyz[i] = xyz[i + 3];
|
||||
xyz[i + 3] = tmp;
|
||||
}
|
||||
}
|
||||
World world = sender instanceof Player ? ((Player) sender).getWorld() : Bukkit.getWorlds().get(0);
|
||||
val list = new ArrayList<Blocks>();
|
||||
for (int y = xyz[1]; y < xyz[4]; y++) {
|
||||
Blocks blocks = new Blocks(null, null, null);
|
||||
for (int x = xyz[0]; x < xyz[3]; x++) {
|
||||
for (int z = xyz[2]; z < xyz[5]; z++) {
|
||||
Block block = world.getBlockAt(x, y, z);
|
||||
Material mat = block.getType();
|
||||
if (blocks.getMaterial() != mat) {
|
||||
if (blocks.getStart() != null)
|
||||
list.add(blocks);
|
||||
blocks.setMaterial(mat);
|
||||
blocks.setStart(new Location(null, x, y, z));
|
||||
blocks.setEnd(blocks.getStart());
|
||||
} else
|
||||
blocks.setEnd(new Location(null, x, y, z));
|
||||
}
|
||||
}
|
||||
list.add(blocks);
|
||||
}
|
||||
Gson gson = new Gson();
|
||||
try {
|
||||
Files.write(gson.toJson(list), new File("result.txt"), StandardCharsets.UTF_8);
|
||||
sender.sendMessage("§bSuccess!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
sender.sendMessage("§cAn error occurred.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
6
GCMCPlugin/src/main/resources/plugin.yml
Normal file
6
GCMCPlugin/src/main/resources/plugin.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
name: GCMCPlugin
|
||||
main: io.github.norbipeti.gcmc.PluginMain
|
||||
version: '1.0'
|
||||
commands:
|
||||
export:
|
||||
description: Exports an area of the world
|
Loading…
Reference in a new issue