Skip to content

Commit

Permalink
feat: Add equipment wrapping
Browse files Browse the repository at this point in the history
  • Loading branch information
Goldmensch committed Aug 30, 2023
1 parent 2125815 commit 7d3d3b8
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 14 deletions.
31 changes: 26 additions & 5 deletions core/src/main/java/de/eldoria/bloodnight/mob/CustomMob.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package de.eldoria.bloodnight.mob;

import de.eldoria.bloodnight.configuration.Configuration;
import de.eldoria.bloodnight.items.ItemRegistry;
import de.eldoria.bloodnight.mob.meta.*;
import de.eldoria.bloodnight.nodes.container.ContainerMeta;
import de.eldoria.bloodnight.nodes.container.NodeContainer;
import de.eldoria.bloodnight.util.Checks;
import de.eldoria.bloodnight.util.MobTags;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;

public record CustomMob(String id, Equipment equipment, Attributes attributes, NodeContainer nodes, MobDrops mobDrops,
Extension extension) {
Expand All @@ -16,24 +20,26 @@ public record CustomMob(String id, Equipment equipment, Attributes attributes, N
Checks.lowerCase(id, "Mob id must be lower case.");
}

public CustomMob createLiving(Entity entity) {
public CustomMob createLiving(LivingEntity entity, Configuration configuration) {
NodeContainer copy = nodes.copy();
Entity extensionEntity = extension.type() != ExtensionType.NONE
? createExtension(entity)
? createExtension(entity, configuration)
: null;
MobTags.setupTags(entity, extensionEntity, this);

// TODO: 21.08.23 apply other attributes
applyEquipment(entity, this.equipment, configuration);

copy.inject(new ContainerMeta(entity, extensionEntity));
return new CustomMob(id, equipment, attributes, copy, mobDrops, this.extension);
}

private Entity createExtension(Entity baseEntity) {
private Entity createExtension(Entity baseEntity, Configuration configuration) {
var world = baseEntity.getWorld();
var extensionEntity = world.spawnEntity(baseEntity.getLocation(), extension.entityType());

// TODO: 21.08.23 apply equipment
if (!(extensionEntity instanceof LivingEntity livingEntity)) throw new RuntimeException("Entity is no living entity");

applyEquipment(livingEntity, equipment, configuration);

boolean added = switch (extension.type()) {
case RIDER -> extensionEntity.addPassenger(baseEntity);
Expand All @@ -43,4 +49,19 @@ private Entity createExtension(Entity baseEntity) {
if (!added) throw new RuntimeException("Extension couldn't be added."); // TODO: 21.08.23 good logging
return extensionEntity;
}

private ItemStack getItem(String item, Configuration configuration) {
return configuration.items().registrations().get(item);
}

private void applyEquipment(LivingEntity entity, Equipment equipment, Configuration configuration) {
var entityEquipment = entity.getEquipment();
if (entityEquipment == null) return;
entityEquipment.setBoots(getItem(equipment.feet(), configuration));
entityEquipment.setLeggings(getItem(equipment.legs(), configuration));
entityEquipment.setChestplate(getItem(equipment.chest(), configuration));
entityEquipment.setHelmet(getItem(equipment.head(), configuration));
entityEquipment.setItemInMainHand(getItem(equipment.mainHand(), configuration));
entityEquipment.setItemInOffHand(getItem(equipment.offHand(), configuration));
}
}
18 changes: 11 additions & 7 deletions core/src/main/java/de/eldoria/bloodnight/mobs/MobCoordinator.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package de.eldoria.bloodnight.mobs;

import de.eldoria.bloodnight.configuration.Configuration;
import de.eldoria.bloodnight.mob.CustomMob;
import de.eldoria.bloodnight.mob.meta.Extension;
import de.eldoria.bloodnight.nodes.dispatching.TriggerData;
import de.eldoria.bloodnight.util.MobTags;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.entity.LivingEntity;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -21,6 +19,12 @@ public class MobCoordinator {
*/
private final Map<Integer, CustomMob> mobs = new HashMap<>();

private final Configuration configuration;

public MobCoordinator(Configuration configuration) {
this.configuration = configuration;
}

/**
* Dispatch a trigger onto an entity if it is a custom mob.
*
Expand All @@ -35,13 +39,13 @@ public void trigger(Entity entity, TriggerData<?> trigger) {

/**
* Registers the custom mob on the provided entity.
* Will create a living entity of the custom mob using {@link CustomMob#createLiving(Entity)}
* Will create a living entity of the custom mob using {@link CustomMob#createLiving(LivingEntity, Configuration)}
* If this mob is already registered, it will be changed to the new custom mob.
*
* @param entity the entity to assign the mob to
* @param customMob the custom mob assigned to the entity.
*/
public void register(Entity entity, CustomMob customMob) {
mobs.put(entity.getEntityId(), customMob.createLiving(entity));
public void register(LivingEntity entity, CustomMob customMob) {
mobs.put(entity.getEntityId(), customMob.createLiving(entity, configuration));
}
}
6 changes: 4 additions & 2 deletions core/src/main/java/de/eldoria/bloodnight/mobs/MobSpawner.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import de.eldoria.bloodnight.mob.CustomMob;
import de.eldoria.bloodnight.util.MobTags;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
Expand All @@ -30,10 +31,11 @@ public MobSpawner(Configuration configuration, MobCoordinator coordinator, Plugi
public void onSpawn(EntitySpawnEvent event) {
// Wait one tick since there might be modification of freshly spawned mobs.
var entity = event.getEntity();
entity.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> handleSpawnedMob(entity), 1);
if (!(entity instanceof LivingEntity livingEntity)) return;
entity.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> handleSpawnedMob(livingEntity), 1);
}

void handleSpawnedMob(Entity entity) {
void handleSpawnedMob(LivingEntity entity) {
if (MobTags.isExtended(entity)) return;

WorldSettings worldSettings = configuration.worldConfig(entity.getWorld());
Expand Down

0 comments on commit 7d3d3b8

Please sign in to comment.