add LootPopulateEvent

This commit is contained in:
dfsek
2021-03-30 00:19:32 -07:00
parent ec0730ef73
commit 20c905aae4
4 changed files with 75 additions and 6 deletions
@@ -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,56 @@
package com.dfsek.terra.api.event.events.world.generation;
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.structure.buffer.items.BufferedLootApplication;
import com.dfsek.terra.api.util.mutable.MutableBoolean;
import com.dfsek.terra.config.pack.ConfigPack;
/**
* Called when loot is populated via {@link BufferedLootApplication}.
*/
public class LootPopulateEvent implements PackEvent, Cancellable {
private final Block block;
private final Container container;
private final ConfigPack pack;
private final MutableBoolean cancelled = new MutableBoolean();
public LootPopulateEvent(Block block, Container container, ConfigPack pack) {
this.block = block;
this.container = container;
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;
}
@Override
public boolean isCancelled() {
return cancelled.get();
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled.set(cancelled);
}
}
@@ -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,12 +21,18 @@ 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;
LootPopulateEvent event = new LootPopulateEvent(block, container, main.getWorld(block.getLocation().getWorld()).getGenerator().getConfigPack());
main.getEventManager().callEvent(event);
if(event.isCancelled()) return;
table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode())); table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode()));
data.update(false); data.update(false);
} catch(Exception e) { } catch(Exception e) {
@@ -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;
} }