Merge pull request #106 from PolyhedralDev/ver/5.1.2

Add LootPopulateEvent and EntitySpawnEvent
This commit is contained in:
dfsek 2021-03-31 20:49:44 -07:00 committed by GitHub
commit 0013d4e682
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 171 additions and 10 deletions

View File

@ -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);
}
}

View File

@ -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();
} }
} }

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
} }

View File

@ -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()));
} }
} }

View File

@ -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());

View File

@ -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;

View File

@ -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;
} }