mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
Merge pull request #106 from PolyhedralDev/ver/5.1.2
Add LootPopulateEvent and EntitySpawnEvent
This commit is contained in:
commit
0013d4e682
@ -0,0 +1,20 @@
|
|||||||
|
package com.dfsek.terra.api.event.events;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.mutable.MutableBoolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract class containing basic {@link Cancellable} implementation.
|
||||||
|
*/
|
||||||
|
public abstract class AbstractCancellable implements Cancellable {
|
||||||
|
private final MutableBoolean cancelled = new MutableBoolean(false);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return cancelled.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean cancelled) {
|
||||||
|
this.cancelled.set(cancelled);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package com.dfsek.terra.api.event.events.world;
|
package com.dfsek.terra.api.event.events.world;
|
||||||
|
|
||||||
import com.dfsek.terra.api.event.events.Event;
|
|
||||||
import com.dfsek.terra.api.event.events.PackEvent;
|
import com.dfsek.terra.api.event.events.PackEvent;
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
import com.dfsek.terra.config.pack.WorldConfig;
|
import com.dfsek.terra.config.pack.WorldConfig;
|
||||||
@ -9,18 +8,24 @@ import com.dfsek.terra.world.TerraWorld;
|
|||||||
/**
|
/**
|
||||||
* Called upon initialization of a TerraWorld.
|
* Called upon initialization of a TerraWorld.
|
||||||
*/
|
*/
|
||||||
public class TerraWorldLoadEvent implements Event {
|
public class TerraWorldLoadEvent implements PackEvent {
|
||||||
private final TerraWorld world;
|
private final TerraWorld world;
|
||||||
|
private final ConfigPack pack;
|
||||||
|
|
||||||
public TerraWorldLoadEvent(TerraWorld world) {
|
public TerraWorldLoadEvent(TerraWorld world, ConfigPack pack) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
|
this.pack = pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TerraWorld getWorld() {
|
public TerraWorld getWorld() {
|
||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldConfig getPack() {
|
public ConfigPack getPack() {
|
||||||
|
return pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WorldConfig getWorldConfig() {
|
||||||
return world.getConfig();
|
return world.getConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.dfsek.terra.api.event.events.world.generation;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.event.events.PackEvent;
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.platform.entity.Entity;
|
||||||
|
import com.dfsek.terra.api.structures.structure.buffer.items.BufferedEntity;
|
||||||
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when an entity is spawned via {@link BufferedEntity}.
|
||||||
|
*/
|
||||||
|
public class EntitySpawnEvent implements PackEvent {
|
||||||
|
private final ConfigPack pack;
|
||||||
|
private final Entity entity;
|
||||||
|
private final Location location;
|
||||||
|
|
||||||
|
public EntitySpawnEvent(ConfigPack pack, Entity entity, Location location) {
|
||||||
|
this.pack = pack;
|
||||||
|
this.entity = entity;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConfigPack getPack() {
|
||||||
|
return pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the entity that triggered the event.
|
||||||
|
*
|
||||||
|
* @return The entity.
|
||||||
|
*/
|
||||||
|
public Entity getEntity() {
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the location of the entity.
|
||||||
|
*
|
||||||
|
* @return Location of the entity.
|
||||||
|
*/
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.dfsek.terra.api.event.events.world.generation;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.event.events.AbstractCancellable;
|
||||||
|
import com.dfsek.terra.api.event.events.Cancellable;
|
||||||
|
import com.dfsek.terra.api.event.events.PackEvent;
|
||||||
|
import com.dfsek.terra.api.platform.block.Block;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.Container;
|
||||||
|
import com.dfsek.terra.api.structures.loot.LootTable;
|
||||||
|
import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication;
|
||||||
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when loot is populated via {@link BufferedLootApplication}.
|
||||||
|
*/
|
||||||
|
public class LootPopulateEvent extends AbstractCancellable implements PackEvent, Cancellable {
|
||||||
|
private final Block block;
|
||||||
|
private final Container container;
|
||||||
|
private LootTable table;
|
||||||
|
private final ConfigPack pack;
|
||||||
|
|
||||||
|
public LootPopulateEvent(Block block, Container container, LootTable table, ConfigPack pack) {
|
||||||
|
this.block = block;
|
||||||
|
this.container = container;
|
||||||
|
this.table = table;
|
||||||
|
this.pack = pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConfigPack getPack() {
|
||||||
|
return pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the block containing the tile entity loot is applied to.
|
||||||
|
*
|
||||||
|
* @return Block at which loot is applied.
|
||||||
|
*/
|
||||||
|
public Block getBlock() {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the {@link Container} representing the inventory.
|
||||||
|
*
|
||||||
|
* @return Inventory recieving loot.
|
||||||
|
*/
|
||||||
|
public Container getContainer() {
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the loot table to be populated.
|
||||||
|
* @return Loot table.
|
||||||
|
*/
|
||||||
|
public LootTable getTable() {
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the loot table to be populated.
|
||||||
|
* @param table New loot table.
|
||||||
|
*/
|
||||||
|
public void setTable(@NotNull LootTable table) {
|
||||||
|
this.table = table;
|
||||||
|
}
|
||||||
|
}
|
@ -21,9 +21,11 @@ public class EntityFunction implements Function<Void> {
|
|||||||
private final EntityType data;
|
private final EntityType data;
|
||||||
private final Returnable<Number> x, y, z;
|
private final Returnable<Number> x, y, z;
|
||||||
private final Position position;
|
private final Position position;
|
||||||
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public EntityFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, TerraPlugin main, Position position) throws ParseException {
|
public EntityFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, TerraPlugin main, Position position) throws ParseException {
|
||||||
this.position = position;
|
this.position = position;
|
||||||
|
this.main = main;
|
||||||
if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition());
|
if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition());
|
||||||
|
|
||||||
this.data = main.getWorldHandle().getEntity(((ConstantExpression<String>) data).getConstant());
|
this.data = main.getWorldHandle().getEntity(((ConstantExpression<String>) data).getConstant());
|
||||||
@ -39,7 +41,7 @@ public class EntityFunction implements Function<Void> {
|
|||||||
|
|
||||||
RotationUtil.rotateVector(xz, arguments.getRotation());
|
RotationUtil.rotateVector(xz, arguments.getRotation());
|
||||||
|
|
||||||
arguments.getBuffer().addItem(new BufferedEntity(data), new Vector3(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()).toLocation(arguments.getBuffer().getOrigin().getWorld()));
|
arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()).toLocation(arguments.getBuffer().getOrigin().getWorld()));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,18 +1,24 @@
|
|||||||
package com.dfsek.terra.api.structures.structure.buffer.items;
|
package com.dfsek.terra.api.structures.structure.buffer.items;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.event.events.world.generation.EntitySpawnEvent;
|
||||||
import com.dfsek.terra.api.math.vector.Location;
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.platform.entity.Entity;
|
||||||
import com.dfsek.terra.api.platform.entity.EntityType;
|
import com.dfsek.terra.api.platform.entity.EntityType;
|
||||||
|
|
||||||
public class BufferedEntity implements BufferedItem {
|
public class BufferedEntity implements BufferedItem {
|
||||||
|
|
||||||
private final EntityType type;
|
private final EntityType type;
|
||||||
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public BufferedEntity(EntityType type) {
|
public BufferedEntity(EntityType type, TerraPlugin main) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
this.main = main;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paste(Location origin) {
|
public void paste(Location origin) {
|
||||||
origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type);
|
Entity entity = origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type);
|
||||||
|
main.getEventManager().callEvent(new EntitySpawnEvent(main.getWorld(entity.getWorld()).getGenerator().getConfigPack(), entity, entity.getLocation()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package com.dfsek.terra.api.structures.structure.buffer.items;
|
package com.dfsek.terra.api.structures.structure.buffer.items;
|
||||||
|
|
||||||
import com.dfsek.terra.api.TerraPlugin;
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.event.events.world.generation.LootPopulateEvent;
|
||||||
import com.dfsek.terra.api.math.vector.Location;
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.platform.block.Block;
|
||||||
import com.dfsek.terra.api.platform.block.state.BlockState;
|
import com.dfsek.terra.api.platform.block.state.BlockState;
|
||||||
import com.dfsek.terra.api.platform.block.state.Container;
|
import com.dfsek.terra.api.platform.block.state.Container;
|
||||||
import com.dfsek.terra.api.structures.loot.LootTable;
|
import com.dfsek.terra.api.structures.loot.LootTable;
|
||||||
@ -19,13 +21,19 @@ public class BufferedLootApplication implements BufferedItem {
|
|||||||
@Override
|
@Override
|
||||||
public void paste(Location origin) {
|
public void paste(Location origin) {
|
||||||
try {
|
try {
|
||||||
BlockState data = origin.getBlock().getState();
|
Block block = origin.getBlock();
|
||||||
|
BlockState data = block.getState();
|
||||||
if(!(data instanceof Container)) {
|
if(!(data instanceof Container)) {
|
||||||
main.logger().severe("Failed to place loot at " + origin + "; block " + data + " is not container.");
|
main.logger().severe("Failed to place loot at " + origin + "; block " + data + " is not container.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Container container = (Container) data;
|
Container container = (Container) data;
|
||||||
table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
|
|
||||||
|
LootPopulateEvent event = new LootPopulateEvent(block, container, table, main.getWorld(block.getLocation().getWorld()).getGenerator().getConfigPack());
|
||||||
|
main.getEventManager().callEvent(event);
|
||||||
|
if(event.isCancelled()) return;
|
||||||
|
|
||||||
|
event.getTable().fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
|
||||||
data.update(false);
|
data.update(false);
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage());
|
main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage());
|
||||||
|
@ -5,6 +5,14 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
public class MutableBoolean implements MutablePrimitive<Boolean> {
|
public class MutableBoolean implements MutablePrimitive<Boolean> {
|
||||||
private boolean value;
|
private boolean value;
|
||||||
|
|
||||||
|
public MutableBoolean() {
|
||||||
|
this.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MutableBoolean(boolean value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean get() {
|
public Boolean get() {
|
||||||
return value;
|
return value;
|
||||||
|
@ -33,7 +33,7 @@ public class TerraWorld {
|
|||||||
this.provider = config.getProvider();
|
this.provider = config.getProvider();
|
||||||
profiler = new WorldProfiler(w);
|
profiler = new WorldProfiler(w);
|
||||||
air = main.getWorldHandle().createBlockData("minecraft:air");
|
air = main.getWorldHandle().createBlockData("minecraft:air");
|
||||||
main.getEventManager().callEvent(new TerraWorldLoadEvent(this));
|
main.getEventManager().callEvent(new TerraWorldLoadEvent(this, c));
|
||||||
safe = true;
|
safe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user