Skip to content

Commit

Permalink
Damage Conditions Ported
Browse files Browse the repository at this point in the history
  • Loading branch information
Dueris committed Jul 15, 2024
1 parent ea89d5b commit 8bb05b9
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tags.TagKey;
import net.minecraft.world.damagesource.DamageType;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
Expand Down Expand Up @@ -189,4 +190,8 @@ public <T> T transformWithCalio(String key, Function<JsonElement, T> transformer
public <T> Holder<T> registryEntry(String key, ResourceKey<Registry<T>> registryResourceKey) {
return MinecraftServer.getServer().registryAccess().registry(registryResourceKey).get().getHolder(this.getResourceLocation(key)).orElseThrow();
}

public <T> ResourceKey<T> resourceKey(String key, ResourceKey<Registry<T>> registry) {
return ResourceKey.create(registry, this.getResourceLocation(key));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,84 @@
import me.dueris.calio.data.factory.FactoryJsonObject;
import me.dueris.calio.registry.Registrable;
import me.dueris.originspaper.OriginsPaper;
import me.dueris.originspaper.factory.conditions.ConditionExecutor;
import me.dueris.originspaper.factory.data.types.Comparison;
import me.dueris.originspaper.registry.Registries;
import me.dueris.originspaper.util.Util;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.DamageTypeTags;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.damage.CraftDamageType;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.NotNull;

import java.util.function.BiPredicate;

public class DamageConditions {

public void registerConditions() {
register(new ConditionFactory(OriginsPaper.apoliIdentifier("amount"), (data, damageEvent) -> {
return Comparison.fromString(data.getString("comparison")).compare(damageEvent.getDamage(), data.getNumber("compare_to").getFloat());
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("fire"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.IS_FIRE);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("name"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).getMsgId().equals(data.getString("name"));
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("projectile"), (data, damageEvent) -> {
if (damageEvent.getDamageSource().getDirectEntity() == null) return false;
DamageSource nms = new DamageSource(nmsDamageSource(damageEvent).typeHolder(), ((CraftEntity) damageEvent.getDamageSource().getDirectEntity()).getHandle());
if (nms.is(DamageTypeTags.IS_PROJECTILE)) {
Entity projectile = nms.getDirectEntity();
if (projectile != null) {
if (data.isPresent("projectile") && projectile.getType() != CraftRegistry.getMinecraftRegistry().registry(net.minecraft.core.registries.Registries.ENTITY_TYPE).get().get(data.getResourceLocation("projectile"))) {
return false;
}
@NotNull FactoryJsonObject projectileCondition = data.getJsonObject("projectile_condition");
return projectileCondition.isEmpty() || ConditionExecutor.testEntity(projectileCondition, projectile.getBukkitEntity());
}
}
return false;
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("attacker"), (data, damageEvent) -> {
Entity attacker = new DamageSource(nmsDamageSource(damageEvent).typeHolder(), ((CraftEntity) damageEvent.getDamageSource().getDirectEntity()).getHandle()).getEntity();
if (attacker instanceof LivingEntity) {
if (!data.isPresent("entity_condition") || ConditionExecutor.testEntity(data.getJsonObject("entity_condition"), attacker.getBukkitEntity())) {
return true;
}
}
return false;
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("bypasses_armor"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.BYPASSES_ARMOR);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("explosive"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.IS_EXPLOSION);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("from_falling"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.IS_FALL);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("unblockable"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.BYPASSES_SHIELD);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("out_of_world"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(DamageTypeTags.BYPASSES_INVULNERABILITY);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("in_tag"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(data.getTagKey("tag", net.minecraft.core.registries.Registries.DAMAGE_TYPE));
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("type"), (data, damageEvent) -> {
return nmsDamageSource(damageEvent).is(data.resourceKey("damage_type", net.minecraft.core.registries.Registries.DAMAGE_TYPE));
}));
}

private DamageSource nmsDamageSource(EntityDamageEvent event) {
return Util.getDamageSource(CraftDamageType.bukkitToMinecraft(event.getDamageSource().getDamageType()));
}

public void register(ConditionFactory factory) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@ public static FactoryData registerComponents(FactoryData data) {
}

public static void addCooldown(Player player, int amt, CooldownPower power) {
if (amt <= 1) return;
addCooldown(player, amt, power, 1.0);
}

protected static void addCooldown(Player player, int amt, CooldownPower power, double start) {
if (amt <= 1) return;
cooldowns.putIfAbsent(player, new ArrayList<>());
if (isInCooldown(player, power)) return; // Already in cooldown
Resource.Bar bar = new Resource.Bar(power, player);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,46 @@
import me.dueris.calio.data.factory.FactoryJsonObject;
import me.dueris.originspaper.OriginsPaper;
import me.dueris.originspaper.factory.actions.Actions;
import me.dueris.originspaper.factory.conditions.ConditionExecutor;
import me.dueris.originspaper.factory.data.types.HudRender;
import me.dueris.originspaper.factory.powers.holder.PowerType;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;

public class SelfActionWhenHit extends PowerType implements Listener, CooldownPower {
private final FactoryJsonObject entityAction;
private final FactoryJsonObject damageCondition;
private final HudRender hudRender;
private final int cooldown;

public SelfActionWhenHit(String name, String description, boolean hidden, FactoryJsonObject condition, int loading_priority, FactoryJsonObject entityAction, FactoryJsonObject hudRender, int cooldown) {
public SelfActionWhenHit(String name, String description, boolean hidden, FactoryJsonObject condition, int loading_priority, FactoryJsonObject entityAction, FactoryJsonObject damageCondition, FactoryJsonObject hudRender, int cooldown) {
super(name, description, hidden, condition, loading_priority);
this.entityAction = entityAction;
this.damageCondition = damageCondition;
this.hudRender = HudRender.createHudRender(hudRender);
this.cooldown = cooldown;
}

public static FactoryData registerComponents(FactoryData data) {
return PowerType.registerComponents(data).ofNamespace(OriginsPaper.apoliIdentifier("self_action_when_hit"))
.add("entity_action", FactoryJsonObject.class, new FactoryJsonObject(new JsonObject()))
.add("damage_condition", FactoryJsonObject.class, new FactoryJsonObject(new JsonObject()))
.add("hud_render", FactoryJsonObject.class, new FactoryJsonObject(new JsonObject()))
.add("cooldown", int.class, 1);
}

@EventHandler
public void s(EntityDamageByEntityEvent e) {
public void s(EntityDamageEvent e) {
Entity actor = e.getEntity();

if (!(actor instanceof Player player)) return;
if (!getPlayers().contains(player)) return;

if (Cooldown.isInCooldown(player, this)) return;
if (isActive(player)) {
if (isActive(player) && ConditionExecutor.testDamage(damageCondition, e)) {
Actions.executeEntity(player, entityAction);
Cooldown.addCooldown(player, cooldown, this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ public ItemStack[] createDisplay(Player player, Layer layer) {
stacks.add(getChoosingStack(player));
} else if ((i >= 20 && i <= 24) || (i >= 29 && i <= 33) || (i == 39 || i == 40 || i == 41)) {
while (!powerContainers.isEmpty() && (powerContainers.get(0).isHidden()
|| (powerContainers.get(0).getName().equalsIgnoreCase("No Name")
&& powerContainers.get(0).getDescription().equalsIgnoreCase("No Description")))) {
|| (powerContainers.get(0).getName().equalsIgnoreCase("craftapoli.name.not_found")
&& powerContainers.get(0).getDescription().equalsIgnoreCase("craftapoli.description.not_found")))) {
powerContainers.remove(0);
}
if (!powerContainers.isEmpty()) {
Expand Down

0 comments on commit 8bb05b9

Please sign in to comment.